![适用于 100 台服务器的非交互式一次性 ssh && scp](https://linux22.com/image/1358666/%E9%80%82%E7%94%A8%E4%BA%8E%20100%20%E5%8F%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E9%9D%9E%E4%BA%A4%E4%BA%92%E5%BC%8F%E4%B8%80%E6%AC%A1%E6%80%A7%20ssh%20%26%26%20scp.png)
我需要通过网络从一组非常受限的机器中复制一些数据,而该网络目前存在 DNS 问题(因此某些连接奇怪地不起作用)。我发现从机器复制数据的唯一方法是从该机器运行 scp。目前的工作流程是:
- 对于 machines 中的每台机器
ssh machine
- 输入密码
scp files destination:results
- 输入密码
- 等待
- 永远重复
我对这种体力劳动感到疯狂。我想要一个允许我一次性输入密码的解决方案。我搜索了解决方案。大多数人建议安装 SSH 密钥,但这需要相同的过程来分发密钥。其他人提到了该expect
程序,但我的系统上没有它。
如何实现这一点?
更新: 主机运行 FreeBSD 9,100 台服务器运行 Ubuntu 12。 我在任何机器上都没有 root 权限。
答案1
我假设这些都是 Linux 主机,并且您拥有对它们的 root 访问权限。我还假设它们正在使用进行包管理,但使用或或任何其他包管理器apt
都可以轻松应用此解决方案。yum
pacman
据我所知,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
您的密码为destination
,bar
请执行以下操作:
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