Изменить оболочку sudo su

13

Всякий раз, когда я запускаю 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.

Жюль
источник

Ответы:

21

Другой способ выполнить интерактивную оболочку в качестве суперпользователя 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.

LRI
источник
Это то, что я думаю, вопрос хотел. Это определенно то, что сработало для меня; большое спасибо! изменить я вижу, что он хотел сейчас - я не думаю, что это то, что он хотел, поэтому я не могу честно сказать это по этому вопросу, но я думаю, вы все равно заслуживаете медали. У тебя был ответ на мой вопрос!
Wyatt8740
4

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


Первый способ - просто использовать флаг -sor --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вместо этого.

Прорыв, достижение, открытие
источник
3
Как всегда, будьте осторожны с изменением оболочки root. Вы не хотите находиться в однопользовательском режиме и иметь корневую оболочку, которая нуждается в / usr, когда она не работает. Во время аренды убедитесь, что ваша новая оболочка не имеет больше зависимостей от файловой системы, чем та, которую вы заменяете
Rich Homolka
Запуск sudo su -s /bin/zsh(или использование --shell) возвращает su: illegal option -- s. Я на OS X 10.8.4; OS X принимает другую команду?
Жюль
@JulesMazur что выход cat /etc/shells? Технически будут запускаться только те оболочки, которые разрешены в этом файле, хотя на suman-странице сказано, что это не должно иметь значения, если suвызывается root: S
Прорыв
cat /etc/shellsвозвращается /bin/zshв качестве приемлемой оболочки.
Жюль
2
@JulesMazur, пожалуйста, не забывайте всегда включать вашу ОС, чтобы избежать путаницы.
тердон
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.

cybrhippy
источник
0

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

$ sudo chpass -s /bin/zsh
user686249
источник