ssh,启动特定的Shell,并在远程计算机上运行命令?


11

我处于多个用户在远程计算机上共享同一用户帐户的情况。我有一个“个人”目录,我在其中写入了自己的.zshrc文件,并且希望有一种方法:

  1. 使用我的ssh配置文件(例如ControlMaster auto)中的指令在远程计算机中启动ssh会话
  2. 该会话运行一个Z shell
  3. .zshrc在我的“个人”目录中运行(不在共享用户的主目录中)

拥有别名或启动此类ssh会话的简单方法(这就是我考虑使用OpenSSH的配置文件的原因)会很高兴,但是我愿意接受任何其他建议!

使用OpenSSH的配置文件?

我在OpenSSH的ssh_config 手册页上读到,可以使用指令LocalCommand指定成功连接到服务器后在本地运行的命令。这使我认为可能有一种方法可以告诉config文件在连接到服务器后要远程运行什么命令,但是似乎没有任何方法。


我认为你不能。但是我为您为什么想要这个感到困惑。ssh命令行上已经有一个命令。你为什么不能跑ssh mycommand?而且,如果您想在ssh上的每个命令之前运行一些setup命令,为什么不配置服务器端呢?
吉尔(Gilles)“所以,别再邪恶了”,

谢谢@Guilles。我处于多个用户共享同一个远程帐户的情况,因此我想在远程登录时快速进行一些设置。更具体地说,我想启动一个Z Shell,并要求它.zshrc在特定目录(即“个人”主目录)中运行。我尝试了一下,ssh -t host_name 'zsh & source /path/to/my_zshrc'但是没有用(我明白了FPATH variable not defined,我想这是因为zsh它在运行之前已经完成了my_zshrc,更不用说这没有给我Z壳了)
Amelio Vazquez-Reina

我认为这值得对OP进行更新,因此我刚刚对其进行了更新。
阿梅里奥·瓦兹克斯·雷纳

在寻找了我的类似答案之后,我想到这个问题与您要尝试做的非常接近。
吉尔(Gilles)“所以,别再邪恶了”,

Answers:


15

远程运行命令最明显的方法是在ssh命令行上指定它。ssh命令始终由远程用户的外壳程序解释。

ssh bob@example.com '. ~/.profile; command_that_needs_environment_variables'
ssh -t bob@example.com '. ~/.profile; exec zsh'

共享帐户通常不是一个好主意;如果有可能,请为每个用户获得单独的帐户。如果您使用共享帐户,则可以使用别名:

ssh -t shared-account@example.com 'HOME=~/bob; . ~/.profile; exec zsh'

如果您使用公共密钥身份验证(再次推荐),则可以在中定义每个密钥命令~/.ssh/authorized_keys。有关更多说明,请参见此答案~/.ssh/authorized_keys在服务器上编辑您键入的行(全部一行):

command="HOME=$HOME/bob;
     if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
       eval \"$SSH_ORIGINAL_COMMAND\";
     else exec \"$SHELL\"; fi" ssh-rsa AAAA…== bob@some.where

太棒了@Guilles。您对该网站的贡献正在使它成为我们所有人的极为有用的资源。非常感谢,真的。顺便说一句,我不知道该exec命令。如何exec zsh从调用不同的zsh直接?为什么在这种特殊情况下很重要?
阿梅利奥·瓦兹克斯·雷纳

嗯,当我跑步时ssh -t shared-account@example.com 'HOME=~/bob; exec zsh'我得到了HOME=~/bob: command not found。我想我在tcsh。如果尝试,也会遇到同样的问题HOME=/home/bob。我尝试了bash和zsh。任何线索可能是什么原因造成的?最后,上面的语法是否会让我打开ssh会话?(我想要的是)。再次感谢。
阿梅利奥·瓦兹奎兹·雷纳

1
@intrpc exec用zsh替换原始的shell;没有zsh,原始外壳将保留在内存中,直到zsh退出然后退出。主要区别在于节省了一点内存,这不是很重要。如果您的登录shell是(t)csh,请使用setenv HOME ~/bob; exec zsh。最后,由于zsh是不带任何参数启动的,因此您将获得一个shell会话,就像您刚运行sshzsh作为登录shell时将获得的会话。
吉尔(Gilles)“所以,别再邪恶了”,

再次感谢你的帮助。这里有一个后续问题。在命令之后,还有exec zsh什么方法可以运行更多命令?
Amelio Vazquez-Reina 2015年

1
@ AmelioVazquez-Reina不方便,除非您可以控制其中一个点文件。您可以设置环境变量,ZDOTDIR以使zsh在其他目录中查找点文件。如果您确实控制了点文件,则可以执行诸如添加eval $LC_STARTUP_CODE$ZDOTDIR/.zshrc并传递代码以在环境变量中执行的操作LC_STARTUP_CODE
吉尔(Gilles)'所以

-3

要在连接服务器后远程运行命令,请在.ssh / config文件中添加以下代码段

PermitLocalCommand yes

Host <server-ip-address>
    LocalCommand *command*

2
感谢@ user626129,但是正如我在原始问题中提到的那样,LocalCommand指令是在本地 shell而非远程 shell 上运行命令。
阿梅利奥·瓦兹奎兹·雷纳
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.