ssh,启动一个特定的 shell,然后在远程机器上运行一个命令?

Ame*_*ina 12 ssh openssh

我遇到了多个用户在远程机器上共享同一个用户帐户的情况。我有一个“个人”目录,我在其中编写了自己的.zshrc文件,我想有一种方法:

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

有一个别名或一种启动此类 ssh 会话的简单方法会很好(这就是我考虑使用 OpenSSH 的配置文件的原因),但我对任何其他想法持开放态度!

使用 OpenSSH 的配置文件?

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

Gil*_*il' 15

远程运行命令最明显的方法是在 ssh 命令行上指定它。ssh 命令总是由远程用户的 shell 解释。

ssh bob@example.com '. ~/.profile; command_that_needs_environment_variables'
ssh -t bob@example.com '. ~/.profile; exec zsh'
Run Code Online (Sandbox Code Playgroud)

共享帐户通常是个坏主意;如果可能,请为每个用户获取单独的帐户。如果您坚持使用共享帐户,则可以创建别名:

ssh -t shared-account@example.com 'HOME=~/bob; . ~/.profile; exec zsh'
Run Code Online (Sandbox Code Playgroud)

如果您使用公钥身份验证(再次推荐),您可以在~/.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
Run Code Online (Sandbox Code Playgroud)

  • @intrpc `exec` 将原来的shell替换为zsh;如果没有 `zsh`,原始 shell 将保留在内存中,直到 zsh 退出然后退出。主要区别是节省一点内存,这不是很重要。如果您的登录 shell 是 (t)csh,请使用 `setenv HOME ~/bob; 执行 zsh`。最后,由于 zsh 启动时不带任何参数,因此您将获得一个 shell 会话,就像您刚刚运行“ssh”并使用 zsh 作为登录 shell 时所获得的那样。 (2认同)