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 Output和Partition运行它的地方。
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)