Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用同一ssh连接执行多个命令_Bash_Ssh - Fatal编程技术网

Bash 使用同一ssh连接执行多个命令

Bash 使用同一ssh连接执行多个命令,bash,ssh,Bash,Ssh,我需要ssh连接到memcached服务器并执行确保连接性的操作。 我应该重复使用相同的ssh连接,并继续执行命令,这些命令的输出将存储在一些日志中。这应该是一个按特定时间间隔运行的计划作业 代码1为每次执行创建多个ssh连接 #!/bin/bash USERNAME=ec2-user HOSTS="10.243.107.xx 10.243.124.xx" KEY=/home/xxx/xxx.pem SCRIPT="echo stats | nc localhost

我需要ssh连接到memcached服务器并执行确保连接性的操作。 我应该重复使用相同的ssh连接,并继续执行命令,这些命令的输出将存储在一些日志中。这应该是一个按特定时间间隔运行的计划作业

代码1为每次执行创建多个ssh连接

#!/bin/bash
USERNAME=ec2-user
HOSTS="10.243.107.xx 10.243.124.xx"
KEY=/home/xxx/xxx.pem
SCRIPT="echo stats | nc localhost 11211 | grep cmd_flush"
for HOSTNAME in ${HOSTS} ; do
    ssh -l ${USERNAME} -i ${KEY} ${HOSTNAME} "${SCRIPT}"
done

代码2在ssh之后挂起

#!/bin/bash
USERNAME=ec2-user
KEY=/home/xxx/xxx.pem
ssh -l ${USERNAME} -i ${KEY} 10.243.xx.xx
while:
do
  echo stats | nc localhost 11211 | grep cmd_flush
  sleep 1
done

有更好的方法吗?

因为您希望让代码2在远程主机上运行无限while循环,所以在修复while语句后,可以将整个过程传递给ssh命令:

#!/bin/bash
USERNAME=ec2-user
KEY=/home/xxx/xxx.pem
ssh -l ${USERNAME} -i ${KEY} 10.243.xx.xx '
  while true
  do
    echo stats | nc localhost 11211 | grep cmd_flush
    sleep 1
  done
'

不过,我必须警告,我认为整个方法有些脆弱。长期存在的ssh连接往往会由于各种原因而消亡,这并不总是意味着连接实际上已经中断。确保调用此脚本的父脚本注意到已断开ssh连接并重试。我想您可以将此脚本放入一个循环中,每次断开连接时可能会记录一个警告,如果无法重新建立连接,则会记录一个错误。

我不确定代码2试图做什么。您是否打算让它在远程主机上运行无限while循环?@Reshma:在第二次尝试中,您打开了一个远程shell,但没有为它提供任何输入。我看到两种方法:模拟通过
expect
传递命令,或者将所有单个命令放在一个大命令中并执行。@joanis是的,我想建立一次连接,然后多次执行该命令……每1分钟、每30分钟、每1小时,1天…您可以使用control master功能在后续执行
SSH
之间保持SSH连接的活动状态,这样您就不必每次都重新验证。请参阅。