我有两台远程服务器,我试图在使用ssh命令连接到的远程主机上执行多个命令。我的命令语法如下:
ssh -t -i key-1 user1@remote-1 "ssh -t -i key-2 user2@remote-2 "cmd-1;cmd-2;...cmd-n;"";
我尝试在两个命令之间使用分号(;)和&&符号,并观察到第一个命令在remote-2上执行,第二个命令在remote-1上执行。
我的要求是我想执行除remote-2上的最后一个命令以外的所有命令。并且,是remote-1上的最后一个命令。
注意::我知道如何通过连接到单个远程主机来执行多个命令。因此,如果您仅在理解问题陈述后才能给出答案,我将不胜感激。
答案 0 :(得分:0)
假设您无法在两个主机上创建配置文件来简化命令,并且不想将其拆分为两个单独的命令,则其操作就像将最后一个命令从内部SSH命令中移出一样简单:
ssh -t -i key-1 user1@remote-1 "ssh -t -i key-2 user2@remote-2 \"cmd-1;cmd-2;...cmd-n-1\"; cmd-n"
# or
ssh -t -i key-1 user1@remote-1 'ssh -t -i key-2 user2@remote-2 "cmd-1;cmd-2;...cmd-n-1"; cmd-n'
如果您不在此命令内扩展,则还应该转义使用双引号,或者将外/内引号更改为单引号。
此外,您还可以使用.ssh_config
文件(尤其是使用ProxyJump
参数(man page)来简化SSH命令。</ p>
答案 1 :(得分:0)
考虑使用here-documents
代替单行,以简化顺序。它的优点是可以轻松输入长命令。
ssh -t -i key-1 user1@remote-1 <<__END__
ssh -t -i key-2 user2@remote-2 "cmd-1;cmd-2;..."
cmd-n
__END__
我无法在本地进行测试,但应该可以进一步嵌套
ssh -t -i key-1 user1@remote-1 <<__END__
ssh -t -i key-2 user2@remote-2 <<__SUB__
# Execute on remote2
cmd-1
cmd-2
...
__SUB__
# Execute on remote1
cmd-n
__END__