我的 zsh 源文件中有一个函数~/.zshrc
:
function cr() {
ssh -p 5022 [email protected]
ssh servername2
screen -ls
}
但是,第一个 ssh 之后的所有内容似乎都在我关闭 ssh 连接后执行,而我想ssh servername2
在ssh
会话中执行。同样,在第一个 ssh 关闭后,screen -ls
不是在内部执行,而是在我自己的本地终端中执行。servername2
如果你愿意,你知道我该怎么做吗?请注意,我确实有第一个 ssh 连接,它允许我连接到我想要的最终服务器,servername2
. 我不知道他们为什么在我的实验室中这样做,或者是否经常这样做^^'我知道这是一种网关。
这是因为函数(以及脚本和别名)不模拟键盘输入。每个语句都是一个命令,必须在下一个运行之前完成,整个事情在父 shell 的上下文中运行。
(无论命令如何分隔,这都适用;无论是新行还是
;
分隔&&
符,它们都将在本地运行,而不是作为“假键盘输入”发送。)可以在较早的帖子中找到使这项工作的一种方法-第二种
ssh
必须作为“远程命令”提供给第一个:在许多情况下,使用 SSH 的“隧道”或“跳转主机”支持通过中间主机进行连接是一个更好的选择:
我还建议定义 SSH 参数,
~/.ssh/config
这样就不需要为每个 SSH 或 SFTP 或 sshfs 调用重复它们:甚至可能:
这将使您可以将第一个命令简化为
ssh ssh.mylaboratory.fr
orssh lab
,或将“跳转”命令简化为ssh -J lab server2
.同样,如果该
ssh -J
选项有效(即它没有被远程服务器显式禁用),您也可以在配置中定义它,允许您直接使用ssh server2
甚至sshfs server2:[...]
: