【问题标题】:Execute multiple commands re-using same ssh connection重复使用相同的 ssh 连接执行多个命令
【发布时间】:2021-05-27 20:37:27
【问题描述】:

我需要通过 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 循环?
  • @Reshma:在第二次尝试中,您打开了一个远程 shell,但不为其提供任何输入。我看到了两种方法:模拟通过expect 传递命令,或者将所有单独的命令放在一个大命令中并执行。
  • @joanis 是的,我想建立一次连接,然后多次执行命令......每1分钟,每30分钟,1小时,1天......
  • 您可以使用控制主功能在ssh的后续执行之间保持SSH连接,这样您就不需要每次都重新验证。

标签: bash ssh


【解决方案1】:

由于您希望代码 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 连接并重试。我想你可以把这个脚本放在一个循环中,每次连接断开时可能会记录一个警告,如果连接无法重新建立,则会记录一个错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-17
    • 2020-03-20
    • 2014-09-02
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    相关资源
    最近更新 更多