如何在使用双SSH连接连接的远程主机上执行多个命令?

时间:2019-11-25 13:59:31

标签: linux bash unix ssh remote-execution

我有两台远程服务器,我试图在使用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上的最后一个命令。

注意::我知道如何通过连接到单个远程主机来执行多个命令。因此,如果您仅在理解问题陈述后才能给出答案,我将不胜感激。

2 个答案:

答案 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__