使 zsh 默认 shell 无需 root 访问权限

使 zsh 默认 shell 无需 root 访问权限

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

有没有一种方法可以将某些内容放入我的内容或打开时.bashrc自动调用的内容作为解决方法?zsh

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

答案1

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

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

更新:.profile当默认 shell 不是 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

答案2

通常您可以chsh作为非 root 用户使用。但它偶尔会被禁用,通常是在使用某种形式的网络用户数据库(如 NIS 和 LDAP)的站点中。可能有ypchsh(NIS) 或chsh.ldap(LDAP)。

chsh通常也只会允许一些得到正式认可的shell,通常是 中列出的 shell /etc/shells

如果您无法chsh在站点上使用或其变体,请将您的登录 shell 安排到exec您最喜欢的 shell,并将SHELL变量设置为指向您最喜欢的 shell。

  • 如果您的登录 shell 是shdash或者ksh:您需要编辑的文件是~/.profile.请注意,该文件是在交互式会话开始时以及某些非交互式会话启动脚本(例如,对于 X11 会话)读取的,因此您需要注意:仅exec在当前进程时调用(替换当前进程) shell 是交互式的。除了 Bourne shell(Solaris 10 及之前的版本)之外,您可以通过选项列表 ( ) 中/bin/sh的存在来判断 shell 是交互式的。i$-

    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 和读取下运行的脚本.bash_profile,因此即使在那里,您也应该小心不要exec在非交互式 shell 中调用。

  • 如果您的登录 shell 是 csh 或 tcsh,请参阅以下示例无需 chsh 或管理员权限即可更改默认 shell

答案3

chsh如果因为没有管理员权限而无法运行,与这样做的人交谈

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

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

大多数其他答案都很好,但如果您的管理员响应合理,您可能不想费心破解您的启动脚本。我可能只是zsh -l在登录后手动调用,直到管理员开始更新我的帐户。

另一件需要记住的事情是:有时不同的 shell 可以使用相同的启动文件。例如,shandbash都可以执行$HOME/.profile, andcshtcsh可以执行$HOME/.loginand $HOME/.cshrc(尽管特定于 shell 的启动文件,如.bashrc.bash_profile、 and.tcshrc可以覆盖这些文件)。如果您的默认 shell 是/bin/csh并且您想使用/bin/tcsh,则更新您的.login调用/bin/tcsh -l可能会创建无限循环。zsh不会执行bash特定的启动文件,所以这对您来说不是问题。

大多数 shell 都会设置变量来标识您正在运行的 shell ( $BASH_VERSION, $tcsh, $ZSH_VERSION)。如果您要编写启动代码来调用您喜欢的 shell,那么将其包含在if这样只有当您尚未运行该 shell 时才会执行它。使用来自的代码康索盒子的回答:

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

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

答案4

我可以想到几个场景。

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

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

    b) 恳求管理员添加,zsh以便/etc/shells您可以chsh添加

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

  2. 用户希望逃离受限制的 shell,最有可能的rbash是 或rsh.

    如果.profile是可编辑的,则PATH可以通过编辑来扩展它。一旦/bin进入路径,您就可以bash从内部开始rsh/rbash,访问chsh命令以更改 shell。许多命令都有 shell 转义,可用于转义受限制的 shell 并重新获得对chsh.

  3. chsh由于其他原因确实不起作用。可能性 1 中的解决方案 a 也是此处的答案。

场景 2 是实际更改默认 shell 的唯一原因(限制太多)。

相关内容