选择 SSH 使用的 shell?

JP *_*shy 52 shell

如何设置用户通过 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)

  • 请注意,二进制文件的路径必须在 `/etc/shells` 中才能选择 shell。 (5认同)
  • 这是 SSH 特有的吗? (3认同)

小智 14

man chsh 更改外壳,并不总是有效

或者,您可以坚持exec /bin/zsh使用 bash 登录脚本。这将用您的 shell 替换 bash 实例。

或者你可以做 ssh host "zsh -l"

  • 需要`ssh -t` 来获取最后一个选项的TTY。默认情况下,如果提供了一个命令(比如 `zsh -l`),OpenSSH 会做一个非登录 shell,它不会为你分配 TTY,并且 `-l` 不会改变它(因为它是在登录之后执行的)在)。 (2认同)

小智 14

如果您无法更改默认外壳,则ssh -t user@host 'zsh -l'可以。

-t标志强制进行伪 tty 分配,并且该-l标志产生一个登录 shell

  • 要访问 Windows 计算机,您可以使用:`ssh -t <user@hostname> "powershell"` 或 *pwsh*。) (2认同)

小智 10

编辑 /etc/passwd(如果您有权限,或询问您的系统管理员)以更改您的默认 shell。

  • 谢谢这个答案很棒。我这里也没有壳。我找到了 myusername:x:1000:1000::/home/myusername: 行并将 /bin/bash 添加到最后。注销并登录,我的 ssh 会话正在使用 bash :) (2认同)

小智 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定义需要在本地运行的内容,用于将本地文件复制到远程服务器以获取它。这是问题,只有在“成功”连接到远程主机后才会发生。

意义:

  1. 您与远程的连接应该是开放的并且是活动的
  2. 你的远程 shell 还没有文件,所以它必须等到文件在那里,ergo sleep
  3. 您的本地用于sftp将您的文件放置到远程服务器,远程服务器从sleep您的脚本中唤醒并获取脚本。

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

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