我的 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.fr
或ssh lab
,或将“跳转”命令简化为ssh -J lab server2
。
类似地,如果该ssh -J
选项有效(即远程服务器没有明确禁用它),您也可以在配置中定义它,这样您就可以直接地使用ssh server2
甚至sshfs server2:[...]
:
Host server2
ProxyJump lab