Выполнение chsh не меняет оболочку.

Вопрос или проблема

Я хочу сменить свою оболочку с bash на zsh.

Я попытался выполнить следующее, войдя как пользователь zol:

$ chsh -s /bin/zsh
$ sudo chsh -s /bin/zsh zol
$ su -c 'chsh -s /bin/zsh zol'
# Все вышеперечисленное приводит к:
$ password:
$ chsh: Shell not changed.

# zsh существует в /etc/shells.. 
chsh -l
/bin/sh
/bin/bash
/sbin/nologin
/bin/zsh

Что может быть не так? Как это исправить?

Изменения в учетной записи пользователя не будут сохранены, если файл /etc/passwd (vim /etc/passwd) открыт, когда вы пытаетесь изменить информацию.

Альтернатива: попробуйте с usermod (как zol):

$ usermod -s /bin/zsh 

или

$ sudo usermod -s /bin/zsh zol

Если это тоже не работает, вручную отредактируйте /etc/passwd.

sudo vipw
# установить оболочку zol на /bin/zsh
:wq

Я только что столкнулся с этим. Независимо от того, что я делал, выход и повторный вход не меняли мою оболочку, хотя она была указана в /etc/shells и в /etc/passwd.

наконец-то мне пришло в голову: Может быть, я вошел в другую сессию?

Поэтому я сделал

# who

и это подтвердило, что у меня действительно были открыты другие сессии с других машин:

dom  pts/0        Nov 6 13:53 (10.1.6.121)
dom  pts/1        Nov 5 12:30 (10.1.6.165)
dom  pts/2        Nov 4 12:33 (10.1.6.197)

Затем я сделал:

pkill -KILL -u dom

Меня сразу же выбросило из системы, и после повторного входа: Вуаля! Оболочка была изменена

Если вы видите chsh: Shell not changed., это может означать, что оболочка уже была изменена.

Проверьте, какая оболочка указана:

cat /etc/passwd | grep `cd; pwd`

Если это правильно, выйдите из системы и войдите снова, чтобы изменения вступили в силу.

Когда запускать “chsh -l”, если вы хотите увидеть:

/usr/bin/zsh
/bin/zsh

Тогда используйте:

chsh -s /usr/bin/zsh

Предупреждение: команды были выполнены на Fedora 25, в ubuntun опция “-l” отсутствует.

Измените это в /etc/passwd

У меня были проблемы с zsh (которая по умолчанию в manjaro), и я использовал это, чтобы вернуться к bash.

[infinito@manjaro ~]$ grep infinito /etc/passwd
infinito:x:1000:1000:Sergio N:/home/infinito:/bin/bash      <---здесь

если я прав

sudo chsh -s /bin/zsh zol

это правильная команда

вышеприведенная команда действительно меняет оболочку, но проблема в том, что вы вошли в систему как этот пользователь, здесь имя пользователя “zol”, поэтому попробуйте выйти и войти снова, это работает

Для некоторых это может быть “большая пушка для убийства муравья”, но я сделал это в свое свободное время, чтобы попрактиковаться в некоторых вещах в оболочке.

Ниже представлено мое “элегантное” решение для интерактивной смены оболочки по умолчанию и с некоторыми контингентами, чтобы убедиться, что она изменена в соответствии с выбором пользователя:

#!/usr/bin/env bash

clear_screen() {
  sleep 1
  printf "\033[2J\033[H"
}
# Очищает экран терминала после короткой паузы.

# Функция для проверки наличия оболочки
# Аргументы:
#   $1 - Оболочка для проверки
# Возвращает:
#   0, если оболочка доступна, 1 в противном случае
check_shell_available() {
    local shell=$1
    echo "$_AVAILABLE_SHELLS" | grep -q "$shell"
}
# Проверяет, доступна ли указанная оболочка в списке известных оболочек.

# Функция для проверки безопасности оболочки
# Аргументы:
#   $1 - Оболочка для проверки
# Возвращает:
#   0, если оболочка безопасна, 1 в противном случае
check_shell_safe() {
    local shell=$1
    # Список разрешенных оболочек, которые я знаю, что они безопасны (улучшите список по своему усмотрению)
    local allowed_shells=(
      "/bin/sh" "/usr/bin/sh"
      "/bin/bash" "/usr/bin/bash"
      "/bin/rbash" "/usr/bin/rbash"
      "/bin/dash" "/usr/bin/dash"
      "/bin/zsh" "/usr/bin/zsh"
      "/usr/bin/fish"
      "/usr/bin/screen"
      "/usr/bin/tcsh"
      "/usr/bin/ksh"
      "/usr/bin/mksh"
      "/usr/bin/lksh"
      "/usr/bin/oksh"
      "/usr/bin/posh"
      "/usr/bin/yash"
      "/usr/bin/elvish"
      "/usr/bin/xonsh"
    )
    local forbidden_shells=("/bin/false" "/usr/sbin/nologin")
    [[ " ${allowed_shells[*]} " == *" $shell "* ]] && [[ -x $shell ]] && [[ $shell == /* ]] && [[ ! " ${forbidden_shells[*]} " == *" $shell "* ]]
}
# Проверяет, разрешена ли указанная оболочка и безопасна ли она для использования.

# Функция для смены оболочки пользователя
# Аргументы:
#   $1 - Оболочка для смены
change_user_shell() {
    local shell=$1
    sudo usermod --shell "$shell" "$(id -un)"
}
# Изменяет оболочку пользователя на указанную оболочку с помощью команды usermod.

# Функция для проверки, была ли изменена оболочка
# Аргументы:
#   $1 - Оболочка для проверки
# Возвращает:
#   0, если оболочка была изменена, 1 в противном случае
verify_shell_change() {
    local shell=$1
    local current_shell
    current_shell=$(grep "^$(id -un):" "$_PASSWD_FILE" | cut -d: -f7)
    [ "$current_shell" == "$shell" ]
}
# Проверяет, была ли оболочка пользователя успешно изменена.

printf "Запуск сценария...\n"

# Проверьте, находится ли пользователь в группе sudo
if ! groups | grep -q '\bsudo\b'; then
    printf "Пользователь не в группе sudo.\n"
    exit 1
fi

# Проверьте наличие команды dialog
if ! command -v dialog &> /dev/null; then
    # Спросите пользователя, хочет ли он установить dialog
    printf "Команда dialog недоступна. Вы хотите установить dialog? (y/n)"
    read -r response
    if [[ ! "$response" =~ ^[Yy]$ ]]; then
      printf "Установка диалога отменена.\nПакет, необходимый для продолжения.\n"
      exit 0
    fi
    if ! sudo apt-get install -y dialog; then
        echo "Не удалось установить dialog."
        exit 1
    fi
    clear_screen
fi

# Обновите список доступных оболочек, если это возможно
command -v update-shells &> /dev/null && sudo update-shells
# Обновляет список известных оболочек, если команда update-shells доступна.

# Получить список доступных оболочек
_AVAILABLE_SHELLS=$(grep -v '^#' "/etc/shells" | tr '\n' ' ')

# Отобразить список доступных оболочек для выбора пользователем
# shellcheck disable=SC2086
_SHELL=$(dialog --menu "Выберите оболочку, которую вы хотите использовать:" 15 50 10 $_AVAILABLE_SHELLS 3>&1 1>&2 2>&3)
# Отображает меню диалога для выбора пользователем нужной оболочки.

# Проверьте наличие оболочки
if ! check_shell_available "$_SHELL"; then
    dialog --msgbox "Введенная вами оболочка недоступна." 10 50
    exit 1
fi

# Проверьте безопасность оболочки
if ! check_shell_safe "$_SHELL"; then
    dialog --msgbox "Введенная вами оболочка небезопасна." 10 50
    exit 1
fi

# Спросите у пользователя, хочет ли он выполнить операцию
dialog --yesno "Хотите изменить оболочку на $_SHELL?" 10 50
response=$?
if [ $response -ne 0 ]; then
    exit 0
fi

_PASSWD_FILE="/etc/passwd"

# Попробуйте изменить оболочку с помощью chsh
chsh -s "$_SHELL"
# Пытается изменить оболочку пользователя с помощью команды chsh.

# Проверьте, была ли изменена оболочка
if ! verify_shell_change "$_SHELL"; then
    # Попробуйте изменить оболочку с помощью usermod
    change_user_shell "$_SHELL"
    # Пытается изменить оболочку пользователя с помощью команды usermod.

    # Проверьте, была ли изменена оболочка
    if ! verify_shell_change "$_SHELL"; then
        # Попробуйте изменить оболочку напрямую в файле passwd
        _CURRENT_SHELL=$(grep "^$(id -un):" "$_PASSWD_FILE" | cut -d: -f7)
        _OLD_LINE=$(grep "$(id -un):x:$(id -u):$(id -g)" "$_PASSWD_FILE" | grep "$(which "$_CURRENT_SHELL")")
        _NEW_LINE="${_OLD_LINE//$(which "$_CURRENT_SHELL")/$(which "$_SHELL")}"
        sudo sed -i "s|$_OLD_LINE|$_NEW_LINE|" "$_PASSWD_FILE"
        # Прямо изменяет файл /etc/passwd для изменения оболочки пользователя.

        # Проверьте, была ли изменена оболочка
        if ! verify_shell_change "$_SHELL"; then
            dialog --msgbox "Не удалось изменить оболочку." 10 50
            exit 1
        fi
    fi
fi

dialog --msgbox "Оболочка успешно изменена на $_SHELL." 10 50

dialog --msgbox "Перезапустите сеанс, чтобы применить изменения." 10 50

clear_screen

exit 0

Не стесняйтесь изменять надежный список и методы их изменения или порядок, в котором вы их пробуете.

Если у вас есть вопросы, я готов ответить на них, просто спросите. (Я также готов внести изменения, если это необходимо)

Надеюсь, вам понравится!

РЕДАКТИРОВАТЬ: Я добавил более подробные комментарии о каждом методе.

Возвращаясь к этому, если кто-то хочет простое решение:

Я был зарегистрирован как root и получил то же сообщение об ошибке, что и было указано ранее при использовании chsh. Вот что сработало для меня.

Если я хотел переключиться на оболочку Bourne:

sh

Если я хотел переключиться на Bash:

bash

Ответ или решение

Если команда chsh не меняет оболочку, это может быть вызвано несколькими причинами. Давайте подробно рассмотрим проблему и пути её решения, основываясь на предоставленных данных и вопросе.

Описание проблемы

Вы хотите сменить вашу оболочку с Bash на Zsh, вводя команды:

$ chsh -s /bin/zsh
$ sudo chsh -s /bin/zsh zol
$ su -c 'chsh -s /bin/zsh zol'

Но в каждом случае вы получаете сообщение об ошибке: "chsh: Shell not changed."

Проверка и решение проблемы

  1. Конфигурация /etc/shells: Вы правильно проверили, что zsh включен в список доступных оболочек в файле /etc/shells. Это важный первый шаг, чтобы убедиться, что система позволяет использование zsh.

  2. Заблокированное редактирование файла: Убедитесь, что файл /etc/passwd не открыт в любом текстовом редакторе, когда вы пытаетесь изменить конфигурацию оболочки.

  3. Использование команды usermod:

    • Попробуйте изменить оболочку пользователя с использованием команды usermod:
      $ sudo usermod -s /bin/zsh zol

    Это позволит изменить оболочку пользователя "zol" непосредственно, минуя ограничения chsh.

  4. Редактирование файла /etc/passwd вручную:

    • Воспользуйтесь командой vipw для безопасного редактирования:
      sudo vipw

      Измените запись для пользователя "zol", установив для него оболочку /bin/zsh, затем сохраните изменения.

  5. Активные сеансы: Ваша проблема может заключаться в наличии нескольких активных сеансов. Проверьте текущие сессии с помощью команды who:

    who

    Если обнаружатся параллельные сеансы, завершите их:

    pkill -KILL -u zol

    Это поможет завершить все активные сеансы, чтобы изменения вступили в силу после повторного входа в систему.

  6. Проверка вашего текущего пользователя и оболочки:
    Убедитесь, что текущая оболочка действительно была изменена, выполнив:

    cat /etc/passwd | grep `cd; pwd`

    Это подтвердит, указана ли нужная оболочка в файле /etc/passwd для вашего пользователя.

Заключение

В случае, если вышеуказанные шаги не приведут к успешному изменению оболочки, может потребоваться более глубокий анализ системных настроек. Удостоверьтесь, что у вас есть права администратора и необходимые привилегии для выполнения изменений. Перезагрузите вашу сессию или систему, чтобы убедиться в применении настроек.

Эти шаги охватывают основные причины и решения проблемы со сменой оболочки в Linux. Надеюсь, эта информация окажется полезной в решении вашего вопроса.

Оцените материал
Добавить комментарий

Капча загружается...