选择 SSH 使用的 shell?

选择 SSH 使用的 shell?

如何设置用户通过 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定义需要在本地运行的内容,用于将本地文件复制到远程服务器以获取它。这里有个陷阱,它仅在“成功”连接到远程主机后才会发生。

意义:

  1. 您的远程连接应处于打开和活动状态
  2. 你的远程 shell 还没有该文件,所以它必须等到文件到达,因此sleep
  3. 您的本地用途sftp是将您的文件放到远程服务器,远程服务器唤醒sleep并从中获取您的脚本。

这太黑客了,我也想知道是否有更好的方法。

更新:这可以代替“长”睡眠时间:
RemoteCommand zsh -l -c 'while [[ ! -f /tmp/somefile ]]; do sleep 0.05; done; source /tmp/somefile; zsh'

相关内容