将zsh设为没有root访问权限的默认shell


52

我正在使用学校的计算机,并且想使用zsh而不是bash。我想将其设置为默认外壳程序,但是$ chsh -s $(which zsh)由于我没有管理员权限,因此无法运行命令。

有什么办法可以放入我的.bashrc东西,或者zsh当它作为解决方法打开时会自动调用的东西吗?

澄清一下,zsh已经安装了。


2
是的,只要添加zsh.bashrc文件。注销并登录完成!
fedorqui 2014年

对于那个很抱歉。但是要结束这个问题,我只是放在zsh第一行吗?

3
将zsh放在.bashrc中将使它始终执行,即使bash被显式调用也是如此。最好放进去.bash_profile
konsolebox 2014年

您可以在终端首选项中将zsh设置为默认外壳程序(创建新配置文件)。
lmaooooo

Answers:


68

.bash_profile在您的主目录中创建并添加以下行:

export SHELL=/bin/zsh
exec /bin/zsh -l

更新:.profile默认外壳不是bash时,可以作为一般解决方案。我不确定.profileZsh 是否也可以调用它是否会变得多余,但是我们可以通过简单的检查安全地进行操作:

export SHELL=/bin/zsh
[ -z "$ZSH_VERSION" ] && exec /bin/zsh -l

我们还可以使用which来获取zsh依赖于的值的动态路径$PATH

export SHELL=`which zsh`
[ -z "$ZSH_VERSION" ] && exec "$SHELL" -l

如果Linux管理员(root)将您的默认Shell更改为bash(但不是zsh)以外的其他东西,例如ksh,该怎么办?然后.bash_profile将不会被引用。把它放进去怎么样.profile
约书亚·胡伯

@JoshuaHuber我上次测试.profile没有用。也不会.profile打电话给Zsh?它可能变得多余。尚未检查。(更新:它现在确实起作用了,不确定我以前犯了什么错误。)关于使用的可能缺点的任何想法.profile
konsolebox 2014年

1
@konsolebox仅.profile.bash_profile不存在Bash的情况下才提供(.bash_profile当然,除非您手动从那里获得)。具体而言,源的bash文件中的第一个[ .bash_profile> .bash_login> .profile]它找到。它仅.profile作为POSIX(Bourne shell)兼容性功能寻找。
pyrocrasty

@pyrocrasty确实。就像手册中所说的那样:“读取该文件后,它将依次查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile,并从存在且可读的第一个命令中读取并执行命令。”
konsolebox '16

它使用Run custom命令设置了新的终端配置文件,而不是将我的shell更改为zsh.bash_profile并且.profile不起作用(文件甚至没有执行,在大学计算机上为Fedora 26)。
lmaooooo

12

通常,您可以chsh以非root用户身份使用。但是有时会禁用它,通常在使用某种形式的联网用户数据库(例如NIS和LDAP)的站点中。可能会有ypchsh(NIS)或chsh.ldap(LDAP)。

chsh通常也将只允许某些已批准的外壳,通常是中列出的外壳/etc/shells

如果您不能chsh在网站上使用它或其变体,则将登录shell安排到exec您喜欢的shell,然后将SHELL变量设置为指向您喜欢的shell。

  • 如果你的登录shell是shdashksh:你需要编辑文件~/.profile。请注意,该文件是在交互式会话的开始以及一些非交互式会话启动脚本(例如,针对X11会话)时读取的,因此您需要注意:仅exec当当前外壳是交互式的。除了Bourne shell(/bin/shSolaris 10和更低版本)之外,您可以通过i选项列表($-)中的存在来判断shell是交互式的。

    preferred_shell=
    if [ -x /bin/zsh ]; then
      preferred_shell=/bin/zsh
    fi
    
    if [ -n "$preferred_shell" ]; then
      case $- in
        *i*) SHELL=$preferred_shell; export SHELL; exec "$preferred_shell";;
      esac
    fi
    

    如果您希望zsh读取您的.zprofile,请传递该-l选项。

  • 如果您的登录shell是bash,则可以按照上述步骤进行。或者,您可以将这些命令放在中~/.bash_profile。大多数会话启动脚本只能读取~/.profile,不能读取~/.bash_profile,但是我看过一些在bash和read下运行的脚本.bash_profile,因此即使在此处,也应注意不要exec在非交互式shell中调用。

  • 如果您的登录shell是csh或tcsh,请参阅更改没有chsh或管理员权限的默认shell中的示例


1

我相信命令chsh就是为了这个目的。虽然,我不确定每个Linux / Unix发行版是否都支持。检查的手册页chsh


一些系统也将其作为passwd -s
斯特凡Chazelas

1

如果您chsh由于没有管理员权限而无法运行,请与具有此权限的人联系

很可能您不能chsh以非root用户身份使用,因为您正在使用的系统已配置chsh为无法运行,例如,因为系统使用NIS或LDAP而不是仅使用/etc/passwd文件。也许您的系统管理员只想保持一些控制权。

更改外壳程序的过程取决于组织的策略。可能会有一个本地命令执行chsh通常的操作。或者,您可能需要提交支持请求以请求换壳。

其他大多数答案都不错,但是如果您的管理员响应迅速,那么您可能不希望操弄启动脚本。我可能只是zsh -l在登录后手动调用,直到管理员开始更新我的帐户为止。

要记住的另一件事:有时不同的Shell可以使用相同的启动文件。例如,sh并且bash既可以执行$HOME/.profile,并cshtcsh既可执行$HOME/.login$HOME/.cshrc(尽管shell特定的启动文件一样.bashrc.bash_profile.tcshrc可以覆盖那些)。如果您的默认外壳程序是,/bin/csh并且您要使用/bin/tcsh,则更新您.login的调用/bin/tcsh -l可能会导致无限循环。zsh不会执行bash特定于启动的文件,因此这对您来说不是问题。

大多数shell设置标识变量,外壳程序正在运行($BASH_VERSION$tcsh$ZSH_VERSION)。如果要编写启动代码来调用首选的shell,将其封装在中并不是一个坏主意,if因此只有在尚未运行该shell 的情况下,它才会被执行。使用konsolebox的答案中的代码:

if [ "${ZSH_VERSION:-unset}" = "unset" ] ; then
    export SHELL=/bin/zsh
    exec /bin/zsh -l
fi

(增加检查的复杂性,"${ZSH_VERSION:-unset}"而不是仅仅"$ZSH_VERSION"考虑您已经完成的可能性set -o unset,该选项会使对未定义变量的引用成为错误。)


1

我可以想到一些情况。

  1. zsh不在中/etc/shells,OP希望使用它而不必zsh在命令提示符下键入。可能的解决方案。

    a)使用配置文件技巧在登录时执行它。这和实际更改外壳一样有效。

    b)恳请管理员添加到它zsh/etc/shells以便您可以添加chsh

    c)要求管理员更改您的外壳。这是不明智的,因为它会使您失去ftpin 的能力。只有ftp在有shell的情况下才能使用/etc/shells

  2. 用户希望逃脱受限制的外壳,最有可能是rbashrsh

    如果.profile是可编辑的,则PATH可以通过对其进行扩展进行扩展。进入/bin路径后,您可以bash从内部开始rsh/rbash,获得对chsh命令的访问权,以使您可以更改外壳。许多命令具有外壳转义符,可用于转义受限制的外壳并重新获得对的访问chsh

  3. chsh确实由于其他原因而无法使用。解决方案1也是这里的答案。

方案2是实际更改默认Shell的唯一原因(限制太多)。


-3

我不认为提供的答案实际上是zsh默认的外壳。只要用户登录到他的默认shell,就可以简单地将shell更改为zsh 。用户仍将登录到它,DEFAULT SHELL但与此同时,shell将更改为zsh

要更改默认的shell,请使用:

usermod -s /path/to/shell username 

您应该这样做。

否则,以上解决方法将派上用场。

从评论中添加

chsh -s /path/to/zsh  # considered as standard as compared to usermod

它可以由用户为他/她自己调用。


4
这个问题很清楚地表明,修改系统用户数据库(在此答案中您需要root才能完成的工作)不是一个选择。
Caleb 2014年

3
chsh -s /path/to/zsh是更标准的,通常(但并非总是)不需要root访问,usermod这与总是需要不同。因此,您的答案比问题已经指出的不起作用的问题更多。
吉尔斯(Gillles)“所以-别再邪恶了”
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.