【问题标题】:How to maintain a single ssh connection for multiple remote script executions?如何为多个远程脚本执行维护单个 ssh 连接?
【发布时间】:2017-08-20 13:35:26
【问题描述】:

我在系统 A 中有一个文件夹,其中包含数百万个文件,我在同一网络中有系统 B。

计算机 A ---> /home/nsadmin/文件夹 -- 192.168.150.90

计算机 B ---> /home/nsadmin/automate.sh -- 192.168.150.91

假设在我的文件夹目录中,所有数百万个文件都被转储了。我现在正在做的是

1 echo "Sending the files to Computer B"
2 scp -r /home/nsadmin/$folder_name nsadmin@192.168.150.91:/home/nsadmin/$folder_name
3 ssh nsadmin@192.168.150.91 "sh /home/nsadmin/$folder_name/automation.sh $folder_name"
4 rm -rf $folder_name/

根据上面的脚本,我正在做的是

  • 第 1 行 --> Echo 语句
  • 第 2 行 --> 将文件夹的全部内容复制到计算机 B
  • 第 3 行 --> 远程执行以文件夹名称为参数运行的脚本
  • 第 4 行 --> 从计算机 A 中删除文件夹

这似乎是非常糟糕的编程。

所以我的想法是保持 1 个单一的 ssh 连接并将每个文件传递给连接仍在连接的机器 B..

我会解释清楚的

ssh to remote machine open
 --- subtask which should run in a loop till all the files in folder are done
 --- subtask is copying each file to remote machine and running the automate.sh script with argument as file_name not folder_name,(logic i will modify)
 --- After all the files are copyed done the loop
ssh to remote machine closed

我的逻辑遇到的问题:

  1. 复制所有文件花费大量时间
  2. 没有估计复制所有文件的剩余时间
  3. 多个 ssh 连接
  4. 系统 B 中的空间问题
  5. 系统 B 更像是一个具有一定逻辑且占用空间较小的工作器。
  6. 这种 ssh 连接很难实现自动化

关于如何解决我解释的这个问题的任何建议。?如果有不明白的问题欢迎评论。

我的小伪代码需求:

for i in $(find /home/nsadmin/Folder -type f);do
   scp -r /home/nsadmin/$i nsadmin@192.168.150.91:/home/nsadmin/$i
   ssh nsadmin@192.168.150.91 "sh /home/nsadmin/automation.sh $i"
done

【问题讨论】:

  • 据我所知,脚本只使用了 2 个 ssh 连接,这还不错。
  • 否 实际上我想让它端到端,就像一次获取每个文件并发送到其他机器做一些工作,然后将结果放入 DB.Overall 想法是将相同的文件发送到 5其他系统也可以进行并行操作。如果我将文件复制到机器B,那么我需要再次复制到CDE
  • 复制大量数据我建议使用rsync。此外,不是让五台计算机远程访问。为什么不使用一台服务器并在每台计算机上提取数据?
  • 我有一台服务器,但我想将相同的文件并行发送到 5 台机器中的每一台,并且在 1 名工作人员完成工作后,发送第二个文件,它不应等待其他机器完成其工作.
  • Ping 过去可能帮助过您的随机用户在这里是不可接受的。

标签: python bash shell ssh scp


【解决方案1】:

如果您需要连续运行这些自动化作业,我建议您使用celery。 Celery 允许您创建任务队列并将它们分发给工作人员。您甚至可以安排任务在特定时间运行,例如 cron 作业。如果需要,您可以在不同的机器上创建工作程序,但请注意,如果您这样做,您的系统可能不支持分区。另一个用于在多台机器上配置和安装软件的软件是ansible。您可以写一个ansible playbook 在您的工作机器上配置和安装软件,以便它们准备好开始工作。这样您就不必每次都手动设置它们。

【讨论】:

    【解决方案2】:

    使用ControlMaster。它只会为您将发出的所有命令/scps 打开单个 TCP 连接。在~/.ssh/config中设置很简单添加:

    Host 192.168.150.91
      ControlMaster auto
      ControlPath ~/.ssh/sockets/%C
    

    然后只需运行您的伪代码而不做任何修改,它将执行得更快(通过单个 TCP 连接)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-27
      • 2020-03-20
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 2017-01-30
      • 2012-02-05
      相关资源
      最近更新 更多