10

Всякий раз, когда я запускаю sudo su из моего обычного zsh (который использует фреймворк oh-my-zsh), я вынужден использовать старую оболочку Bourne (sh) по умолчанию (очевидно, это стандартное поведение в большинстве * nix-подобных систем ). Если после запуска zsh я запускаю sh изнутри sudo su , я получаю оболочку Z, но без улучшений из oh-my-zsh.

Есть ли способ изменить оболочку sudo su на zsh? Если да, то возможно ли запустить этот экземпляр zsh с помощью oh-my-zsh?

Я использую OS X 10.8.4.

4 ответа4

18

Другим способом выполнения интерактивной оболочки в качестве суперпользователя является sudo -s , который использует $SHELL в качестве оболочки.

Как уже упоминалось в комментариях к другому ответу, su -s /path/to/zsh не работает в OS X.

OS X также не поддерживает изменение имени входа в /etc/passwd , но вы можете использовать dscl:

$ dscl . -read /Users/root UserShell
/bin/sh
$ sudo dscl . -change /Users/root UserShell /bin/sh /bin/zsh
$ dscl . -read /Users/root UserShell
/bin/zsh
$ sudo su
My-iMac# echo $0
zsh
My-iMac# exit
$ sudo dscl . -change /Users/root UserShell /bin/zsh /bin/sh
$ 

/bin/sh больше не является оболочкой Bourne на большинстве платформ. Это POSIX-совместимая версия bash в OS X и dash в Ubuntu.

4

На странице su есть два способа сделать это.


Первый способ - просто использовать флаг -s или --shell (при условии, что вы используете ОС * NIX с версией su , поддерживающей этот аргумент), после чего следует путь к выбранной вами оболочке. Если переданная оболочка не может быть найдена, su возвращается к следующему методу и, в случае неудачи, попытается вызвать /bin/sh .

Например, вы можете заставить su запустить zsh (при условии, что он существует в /bin/zsh) как:

sudo su --shell /bin/zsh

Второй способ - изменить оболочку по умолчанию, указанную для пользователя root (будьте осторожны!). Это можно сделать, отредактировав файл /etc/passwd и изменив оболочку, указанную для пользователя root . Чтобы увидеть, какая оболочка указана по умолчанию, вы можете выполнить следующую команду (при условии, что суперпользователь - root):

sudo grep root /etc/passwd 

Команда должна вывести что-то вроде root:x:0:0:root:/root:/bin/bash . Вы можете просто изменить /bin/bash (или то, что установлено в вашей системе), чтобы вместо этого указывать на zsh .

1

Более чистый способ защитить вашу систему в случае взрыва вашей пользовательской оболочки - создать .profile в домашнем каталоге root с /:

if [ -x /opt/local/bin/bash ]; then
    SHELL=/opt/local/bin/bash
    export SHELL
    exec /opt/local/bin/bash
else
    echo /opt/local/bin/bash not found using default shell of $SHELL
fi

Просто измените путь к желаемой оболочке вместо bash.

0

Может быть легко сделано с помощью chpass:

$ sudo chpass -s /bin/zsh

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .