适用于 100 台服务器的非交互式一次性 ssh && scp

适用于 100 台服务器的非交互式一次性 ssh && scp

我需要通过网络从一组非常受限的机器中复制一些数据,而该网络目前存在 DNS 问题(因此某些连接奇怪地不起作用)。我发现从机器复制数据的唯一方法是从该机器运行 scp。目前的工作流程是:

  1. 对于 machines 中的每台机器
  2. ssh machine
  3. 输入密码
  4. scp files destination:results
  5. 输入密码
  6. 等待
  7. 永远重复

我对这种体力劳动感到疯狂。我想要一个允许我一次性输入密码的解决方案。我搜索了解决方案。大多数人建议安装 SSH 密钥,但这需要相同的过程来分发密钥。其他人提到了该expect程序,但我的系统上没有它。

如何实现这一点?

更新: 主机运行 FreeBSD 9,100 台服务器运行 Ubuntu 12。 我在任何机器上都没有 root 权限。

答案1

我假设这些都是 Linux 主机,并且您拥有对它们的 root 访问权限。我还假设它们正在使用进行包管理,但使用或或任何其他包管理器apt都可以轻松应用此解决方案。yumpacman

据我所知,ssh没有提供在命令行上指定密码的方法,因此首先你需要安装sshpass在本地机器上:

sudo apt-get install sshpass

这将允许您将密码作为命令行参数传递:

sshpass -p '<password>' ssh user@server

现在,创建一个包含您感兴趣的所有 IP 的文件,每行一个。您可以解析此文件以sshpass在每台远程计算机上安装。如果您的密码是foo并且您以 身份连接root,则可以执行

while read ip; do 
 sshpass -p 'foo' ssh root@$ip "apt-get install sshpass"; 
done < ips.txt

sshpass现在已安装在每台服务器上。现在,再次检查服务器,并复制文件。如果您要复制为root并且root您的密码为destinationbar请执行以下操作:

while read ip; do 
 sshpass -p 'foo' ssh root@$ip "sshpass -p 'bar' scp files dest:/results/"; 
done < ips.txt

您还可以使用sshpass复制密钥文件 - 只要您使用空密码 - 允许无密码访问,这样您下次就不会遇到此问题:

while read ip; do 
   sshpass -p 'foo' ssh root@$ip \
      "sshpass -p 'bar' ssh-copy-id -i ~/.ssh/id_rsa.pub root@destination";
done < ips.txt

完成后,您将能够使用以下命令复制文件:

while read ip; do ssh root@$ip "scp files dest:/results/"; done < ips.txt

相关内容