0

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

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

4

2 回答 2

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__
于 2019-11-26T11:45:03.093 回答
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参数(手册页)来大大简化您的 SSH 命令。

于 2019-11-26T11:21:33.133 回答