在连续 ssh 之后运行 shell 命令

在连续 ssh 之后运行 shell 命令

我的 zsh 源文件中有一个函数~/.zshrc

function cr() {
   ssh -p 5022 [email protected]
   ssh servername2
   screen -ls
}

但是,第一个 ssh 之后的所有内容似乎都是在我关闭 ssh 连接后执行的,而我希望在会话ssh servername2中执行ssh。同样,第一个 ssh 关闭后screen -ls,不是在里面执行servername2,而是在我自己的本地终端中执行。

你知道我该怎么做吗?请注意,我确实有一个第一个 ssh 连接,它允许我连接到我想要的最终服务器。servername2我不知道他们为什么在我的实验室里这样做,也不知道这是否很常见 ^^' 我知道这是一种网关。

答案1

但是,在我关闭 ssh 连接后,第一个 ssh 之后的所有操作似乎都是执行的

这是因为函数(以及脚本和别名)不模拟键盘输入。每个语句都是一个命令,必须在下一个语句运行之前完成,并且整个语句在父 shell 的上下文中运行。

(无论命令如何分隔,这都适用;无论是新行,还是;作为&&分隔符,它们都将在本地运行,而不是作为“假键盘输入”发送。)

在较早的帖子中可以找到一种实现此目的的方法 - 第二种方法ssh给予第一个作为“远程命令”:

在许多情况下,使用 SSH 的“隧道”或“jumphost”支持通过中间主机进行连接是更好的选择:

ssh -J ssh.mylaboratory.fr servername2 "screen -ls"

我还建议定义 SSH 参数,~/.ssh/config这样就不需要在每次 SSH 或 SFTP 或 sshfs 调用时重复它们:

Host ssh.mylaboratory.fr
    User myname
    Port 5022

甚至可能是:

Host lab
    Hostname ssh.mylaboratory.fr
    User myname
    Port 5022

这将允许您将第一个命令简化为ssh ssh.mylaboratory.frssh lab,或将“跳转”命令简化为ssh -J lab server2

类似地,如果该ssh -J选项有效(即远程服务器没有明确禁用它),您也可以在配置中定义它,这样您就可以直接地使用ssh server2甚至sshfs server2:[...]

Host server2
    ProxyJump lab

相关内容