选择SSH使用的shell?


31

如何设置用户SSH到服务器时使用的shell。例如,我不能忍受BASH并需要使用ZSH,我该如何做,以便.zsh_profile在我SSH到计算机时将ZSH与我的配置文件()一起加载。

我也不想通过ssh传递一堆参数,我不能设置默认的shell吗?

Answers:



10

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

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

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


为什么为-1(15个字符...)?
努法尔·易卜拉欣

那是一个小写字母L
漂流者2015年

1
ssh -t最后一个选项需要获得TTY。默认情况下,如果提供了命令(如zsh -l),则OpenSSH会执行非登录shell,该shell不会为您分配TTY,并且-l不会更改它(因为在登录后执行)。
富兰克林·于

8

编辑/ etc / passwd(如果拥有权限,或询问系统管理员)以更改默认外壳程序。


由于某种原因,我最近创建的用户没有默认外壳。这对我有用。谢谢。
mimoralea 2014年

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

6

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

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


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尚无文件,因此必须等到文件在那里,ergo sleep
  3. 您本地用于sftp将文件放置到远程服务器,远程服务器从sleep您的脚本中唤醒并获取您的脚本。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.