我在一家大公司担任系统管理员,必须维护多个 Windows 和 Linux (Ubuntu 16.04) 虚拟机。由于我想使用zsh
而不是bash
在 Linux VM 上使用,因此我必须更改默认 shell。
现在,我使用 Windows 域帐户登录 Linux,该帐户强制执行 AD 设置;这意味着我无法更改该passwd
文件或用于chsh
更改我的默认 shell,因此我必须找到另一种方法。这种方式是通过该属性在 AD 中强制执行 shell loginShell
。
问题是,如果我登录到没有安装 zsh 的 Linux VM 上,会发生什么情况?它会回退到bash
/ sh
,它会卡住还是其他什么?
答案1
咱们试试吧!
服务器上的 shell 发生了变化:
[myserver ~]% getent passwd myuser
myuser:x:150:150:myuser:/home/myuser:/foo
让我们登录:
[myclient ~]% ssh myserver
Received disconnect from myserver: 2: Too many authentication failures for myuser
从服务器上的 SSH 日志:
Nov 22 09:30:27 myserver sshd[20719]: Accepted gssapi-with-mic for myuser from myclient port 33808 ssh2
Nov 22 09:30:27 myserver sshd[20719]: pam_unix(sshd:session): session opened for user myuser by (uid=0)
Nov 22 09:31:18 myserver sshd[20727]: Received disconnect from myclient: 11: disconnected by user
Nov 22 09:31:18 myserver sshd[20719]: pam_unix(sshd:session): session closed for user myuser
Nov 22 09:31:20 myserver sshd[20828]: User myuser not allowed because shell /foo does not exist
Nov 22 09:31:20 myserver sshd[20835]: input_userauth_request: invalid user myuser
Nov 22 09:31:20 myserver sshd[20835]: Disconnecting: Too many authentication failures for myuser
关键行:User myuser not allowed because shell /foo does not exist
.因此,如果您没有有效的 shell 设置,则无法登录。
答案2
没有后备方案。将会出现错误消息,例如...
Cannot execute /does/not/exist: No such file or directory.
zsh
您可以在不修改 AD的情况下添加 的调用。
echo 'exec zsh' >> ~/.bashrc
然后,每次使用 登录时bash
,都会zsh
自动启动。
答案3
如上所述,您将陷入登录循环,并且无法登录。
不幸的是,当前的答案如果使用的话也会导致登录循环,因为 exec 调用会崩溃。它还会忽略提供给 bash 的参数,从而阻止大多数复杂的用例。
添加
[ -x "$(command -v zsh)" ] && exec zsh "$@"
作为第一行将.bashrc
首先检查 zsh 是否可用
添加
[ -n "$GNOME_TERMINAL_SCREEN" ] && [ -x "$(command -v zsh)" ] && exec zsh "$@"
还应该检查您是否在 gnome 终端而不是 tty 中运行 shell