更改sudo su shell


13

每当我sudo su从正常运行zsh(使用oh-my-zsh框架)运行时,sh默认情况下就被迫使用旧的Bourne shell()(显然,这是大多数* nix类系统上的标准行为)。如果我在运行后zsh从内部sh运行sudo su,则可以获得Z shell,但是没有oh-my-zsh的改进。

有什么办法可以将shell sudo su启动更改为zsh?如果是这样,是否也可以zsh使用使用该启动实例oh-my-zsh

我正在使用OS X 10.8.4。

Answers:


21

以超级用户身份执行交互式shell的另一种方法是sudo -s,它$SHELL用作shell。

正如在其他答案中提到的评论,su -s /path/to/zsh在OS X中不起作用。

OS X都不支持更改登录Shell /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外壳了。在OS X中它是POSIX兼容的bash版本,在Ubuntu中是破折号。


这就是我认为该问题想要的。绝对对我有用。非常感谢!编辑,我知道他现在想要的是什么-我认为这不是他想要的,因此对于这个问题我不能完全赞成,但我认为您还是应该获得一枚奖牌。您已经回答了我的问题!
Wyatt8740

4

su联机帮助页中,有两种方法可以完成此操作。


第一种方法是简单地使用-sor --shell标志(假设您使用的是基于* NIX的OS,该OS的版本su支持此参数),然后是您选择的shell的路径。如果找不到通过的外壳,su将还原为以下方法,否则将尝试调用/bin/sh

例如,您可以强制su启动zsh(假设它存在于中/bin/zsh)为:

sudo su --shell /bin/zsh

第二种方法是修改为root用户指定的默认外壳程序(请注意!)。这可以通过编辑文件/etc/passwd并更改为root用户指定的外壳来完成。要查看默认情况下指定的shell,可以运行以下命令(假设超级用户是root):

sudo grep root /etc/passwd 

该命令应输出类似的内容root:x:0:0:root:/root:/bin/bash。您可以简单地将/bin/bash(或系统中设置的任何内容)更改为指向zsh


3
与往常一样,请注意更改root的shell。您不想处于单用户模式,并且拥有一个根外壳,当它损坏时需要/ usr。至少要确保新外壳程序不比要替换的外壳程序具有更多的文件系统依赖性
Rich Homolka 2013年

运行sudo su -s /bin/zsh(或使用--shell)返回su: illegal option -- s。我在OS X 10.8.4上;OS X是否使用其他命令?
Jules 2013年

@JulesMazur的输出是cat /etc/shells什么?从技术上讲,只有该文件中允许的shell才会启动,尽管su联机帮助页上说,这是否su由root调用无关紧要:S
Breakthrough

cat /etc/shells返回/bin/zsh可接受的外壳程序。
Jules 2013年

2
@JulesMazur,请记住始终包含您的操作系统,以避免这种混乱。
terdon

1

在自定义外壳崩溃的情况下,一种更干净的方法也可以保护您的系统,方法是在root的主目录中创建一个.profile,其中w /:

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

只需将路径更改为所需的shell即可,而不是bash。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.