SSH 会话中 SSH 期间的多个命令

mgu*_*gus 11 bash ssh amazon-ec2 read

我有一台本地机器,它应该与远程master机器建立 SSH 会话,然后从master每个远程机器建立另一个内部 SSH 会话slaves,然后执行 2 个命令,即删除特定目录并重新创建它。

请注意,本地计算机具有到 master 的无密码 SSH,而 master 具有到 slaves 的无密码 SSH。此外,所有主机名.ssh/config在本地/主机中都是已知的,从机的主机名在slaves.txt本地,我从那里读取它们。

所以我所做的和工作的是:

username="ubuntu"
masterHostname="myMaster"
while read line
do

    #Remove previous folders and create new ones.
    ssh -n $username@$masterHostname "ssh -t -t $username@$line "rm -rf Input Output Partition""
    ssh -n $username@$masterHostname "ssh -t -t $username@$line "mkdir -p EC2_WORKSPACE/$project Input Output Partition""


    #Update changed files...
    ssh -n $username@$masterHostname "ssh -t -t $username@$line "rsync --delete -avzh /EC2_NFS/$project/* EC2_WORKSPACE/$project""

done < slaves.txt 
Run Code Online (Sandbox Code Playgroud)

该集群位于 Amazon EC2 上,我注意到每次迭代都会创建 6 个 SSH 会话,这会导致显着延迟。我想将这 3 个命令合并为 1 个以减少 SSH 连接。所以我尝试将前 2 个命令组合成

ssh -n $username@$masterHostname "ssh -t -t $username@$line "rm -rf Input Output Partition && mkdir -p EC2_WORKSPACE/$project Input Output Partition""
Run Code Online (Sandbox Code Playgroud)

但它没有按预期工作。它似乎执行第一个 ( rm -rf Input Output Partition) 然后退出会话并继续。我能做什么?

Cen*_*ane 15

认为这&&是一个逻辑运算符。它不是指“也运行此命令”是指“运行此命令,如果其他成功”。

这意味着如果rm命令失败(如果三个目录中的任何一个不存在就会发生这种情况),mkdir则不会执行。这听起来不像你想要的行为;如果目录不存在,创建它们可能没问题。

;

分号;用于分隔命令。命令按顺序运行,在继续执行下一个之前等待每个命令,但它们的成功或失败相互之间没有影响。

转义内部引号

其他引号内的引号应该被转义,否则您将创建一个额外的终点和起点。你的命令:

ssh -n $username@$masterHostname "ssh -t -t $username@$line "rm -rf Input Output Partition && mkdir -p EC2_WORKSPACE/$project Input Output Partition""
Run Code Online (Sandbox Code Playgroud)

变成:

ssh -n $username@$masterHostname "ssh -t -t $username@$line \"rm -rf Input Output Partition && mkdir -p EC2_WORKSPACE/$project Input OutputPartition\""
Run Code Online (Sandbox Code Playgroud)

由于缺少转义引号,您当前的命令应该正在执行:

ssh -n $username@$masterHostname "ssh -t -t $username@$line "rm -rf Input Output Partition
Run Code Online (Sandbox Code Playgroud)

如果成功:

mkdir -p EC2_WORKSPACE/$project Input Output Partition"" # runs on your local machine
Run Code Online (Sandbox Code Playgroud)

您会注意到这里的语法突出显示将整个命令显示为红色,这意味着整个命令是传递给 ssh 的字符串。检查您的本地机器;你可能有目录Input OutputPartition运行它的地方。


Rui*_*iro 10

您始终可以在您的 Jumpbox定义OpenSSH 中的多路复用

多路复用是通过一条线路或连接发送多个信号的能力。通过多路复用,OpenSSH 可以为多个并发 SSH 会话重用现有的 TCP 连接,而不是每次都创建一个新的会话。

SSH 多路复用的一个优点是消除了创建新 TCP 连接的开销。一台机器可以接受的连接总数是一种有限资源,在某些机器上的限制比在其他机器上更明显,并且根据负载和使用情况变化很大。打开新连接时也有明显的延迟。使用多路复用可以显着加快重复打开新连接的活动。

为此,请执行以下操作/etc/ssh/ssh_config

ControlMaster auto
ControlPath ~/.ssh/controlmasters/ssh_mux_%h_%p_%r
ControlPersist 30m
Run Code Online (Sandbox Code Playgroud)

这样,在接下来的 30 分钟内与同一服务器建立的任何连续连接都将重用之前的 ssh 连接。

您还可以为一台机器或一组机器定义它。取自提供的链接。

Host machine1
    HostName machine1.example.org
    ControlPath ~/.ssh/controlmasters/%r@%h:%p
    ControlMaster auto
    ControlPersist 10m
Run Code Online (Sandbox Code Playgroud)