如何设置用户通过 SSH 连接到服务器时使用的 shell。例如,我无法忍受 BASH 而需要使用 ZSH,如何才能在通过 SSH 连接.zsh_profile
到计算机时将 ZSH 与我的配置文件 ( ) 一起加载。
我也不想用 ssh 传递一堆参数,我不能设置默认 shell 吗?
答案1
如果你无法更改默认 shell,ssh -t user@host 'zsh -l'
则可以。
该-t
标志强制伪tty分配,并且该-l
标志产生一个登录外壳。
答案2
假设您在 Linux 上运行,则可以使用该chsh
命令。
chsh -s /bin/ksh foo
chsh -s /bin/bash username
答案3
man chsh
更改 shell,并不总是有效
或者,您可以坚持exec /bin/zsh
使用您的 bash 登录脚本。这将用您的 shell 替换 bash 实例。
或者你可以ssh host "zsh -l"
答案4
我不确定如何将本地服务器放到.zshrc
远程服务器(即不将其永久存储在那里),这对我来说可以更改远程服务器上的登录 shell。
因为它是一个共享帐户,所以zsh
这种方法我只能自己使用。
将其添加到~/.ssh/config
您本地机器的文件中。
Host yourServer
HostName <IP, FQDN or DNS resolvable name>
IdentityFile ~/.ssh/<your keyfile>
RemoteCommand zsh -l
RequestTTY force
User <yourUsername>
可能存在一些不寻常的方法来实现您所寻找的功能,如下所示。
警告 这没有任何保证并且看起来并不“明智”,但是我确实设法将我的本地文件放到服务器并使用它在登录 shell 中获取它。
Host someHost
HostName someIP
IdentityFile ~/.ssh/somekey.pem
RemoteCommand zsh -l -c 'sleep 1; source /tmp/somefile; zsh'
PermitLocalCommand yes
LocalCommand bash -c 'sftp %r@%h <<< "put /tmp/somefile /tmp/somefile"'
RequestTTY force
User someUser
怎么运行的?
RemoteCommand
定义需要在远程端运行的内容。LocalCommand
定义需要在本地运行的内容,用于将本地文件复制到远程服务器以获取它。这里有个陷阱,它仅在“成功”连接到远程主机后才会发生。
意义:
- 您的远程连接应处于打开和活动状态
- 你的远程 shell 还没有该文件,所以它必须等到文件到达,因此
sleep
- 您的本地用途
sftp
是将您的文件放到远程服务器,远程服务器唤醒sleep
并从中获取您的脚本。
这太黑客了,我也想知道是否有更好的方法。
更新:这可以代替“长”睡眠时间:
RemoteCommand zsh -l -c 'while [[ ! -f /tmp/somefile ]]; do sleep 0.05; done; source /tmp/somefile; zsh'