Вопрос или проблема
Я хочу сменить свою оболочку с 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."
Проверка и решение проблемы
-
Конфигурация /etc/shells: Вы правильно проверили, что zsh включен в список доступных оболочек в файле
/etc/shells
. Это важный первый шаг, чтобы убедиться, что система позволяет использование zsh. -
Заблокированное редактирование файла: Убедитесь, что файл
/etc/passwd
не открыт в любом текстовом редакторе, когда вы пытаетесь изменить конфигурацию оболочки. -
Использование команды
usermod
:- Попробуйте изменить оболочку пользователя с использованием команды
usermod
:$ sudo usermod -s /bin/zsh zol
Это позволит изменить оболочку пользователя "zol" непосредственно, минуя ограничения
chsh
. - Попробуйте изменить оболочку пользователя с использованием команды
-
Редактирование файла /etc/passwd вручную:
- Воспользуйтесь командой
vipw
для безопасного редактирования:sudo vipw
Измените запись для пользователя "zol", установив для него оболочку
/bin/zsh
, затем сохраните изменения.
- Воспользуйтесь командой
-
Активные сеансы: Ваша проблема может заключаться в наличии нескольких активных сеансов. Проверьте текущие сессии с помощью команды
who
:who
Если обнаружатся параллельные сеансы, завершите их:
pkill -KILL -u zol
Это поможет завершить все активные сеансы, чтобы изменения вступили в силу после повторного входа в систему.
-
Проверка вашего текущего пользователя и оболочки:
Убедитесь, что текущая оболочка действительно была изменена, выполнив:cat /etc/passwd | grep `cd; pwd`
Это подтвердит, указана ли нужная оболочка в файле
/etc/passwd
для вашего пользователя.
Заключение
В случае, если вышеуказанные шаги не приведут к успешному изменению оболочки, может потребоваться более глубокий анализ системных настроек. Удостоверьтесь, что у вас есть права администратора и необходимые привилегии для выполнения изменений. Перезагрузите вашу сессию или систему, чтобы убедиться в применении настроек.
Эти шаги охватывают основные причины и решения проблемы со сменой оболочки в Linux. Надеюсь, эта информация окажется полезной в решении вашего вопроса.