如何设置用户通过 SSH 连接到服务器时使用的 shell。例如,我无法忍受 BASH 并且需要使用 ZSH,.zsh_profile当我通过 ssh 连接到机器时,我如何才能使 ZSH 与我的配置文件 ( )一起加载。
我也不想用ssh传递一堆参数,我不能设置默认shell吗?
小智 47
假设您在 Linux 上运行,您可以使用该chsh命令。
chsh -s /bin/ksh foo
chsh -s /bin/bash username
Run Code Online (Sandbox Code Playgroud)
小智 14
man chsh 更改外壳,并不总是有效
或者,您可以坚持exec /bin/zsh使用 bash 登录脚本。这将用您的 shell 替换 bash 实例。
或者你可以做 ssh host "zsh -l"
小智 10
编辑 /etc/passwd(如果您有权限,或询问您的系统管理员)以更改您的默认 shell。
小智 7
我不确定如何将本地.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>
Run Code Online (Sandbox Code Playgroud)
可能有一些骇人听闻的方式来完成您正在寻找的内容,如下所示。
警告 这没有任何保证并且看起来不“明智”,但是我确实设法将我的本地文件放到服务器并使用它在登录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
Run Code Online (Sandbox Code Playgroud)
这个怎么运作?
RemoteCommand 定义需要在远程端运行的内容。LocalCommand定义需要在本地运行的内容,用于将本地文件复制到远程服务器以获取它。这是问题,只有在“成功”连接到远程主机后才会发生。意义:
sleepsftp将您的文件放置到远程服务器,远程服务器从sleep您的脚本中唤醒并获取脚本。这是超级黑客,我也想知道是否有更好的方法。
更新:这可以用来代替“长”睡眠时间:
RemoteCommand zsh -l -c 'while [[ ! -f /tmp/somefile ]]; do sleep 0.05; done; source /tmp/somefile; zsh'