.txt 文件中有一个 IP 地址列表,例如:
1.1.1.1
2.2.2.2
3.3.3.3
每个 IP 地址后面都有一个服务器,并且每个服务器上都有一个在端口 22 上运行的 sshd。并非每个服务器都在列表中known_hosts
(在我的 PC 上,Ubuntu 10.04 LTS/bash)。
如何在这些服务器上运行命令并收集输出?
理想情况下,我想在所有服务器上并行运行命令。
我将在所有服务器上使用公钥身份验证。
以下是一些潜在的陷阱:
- ssh 提示我将给定的服务器 ssh 密钥放入我的
known_hosts
文件中。 - 给定的命令可能返回非零退出代码,表明输出可能无效。我需要认识到这一点。
- 可能无法与给定服务器建立连接,例如由于网络错误。
- 应该有一个超时,以防命令运行时间超过预期或服务器在运行命令时出现故障。
服务器是 AIX/ksh(但我认为这并不重要。
答案1
答案2
答案3
假设您无法安装 pssh 或其他软件,您可以执行类似以下操作:
tmpdir=${TMPDIR:-/tmp}/pssh.$$
mkdir -p $tmpdir
count=0
while IFS= read -r userhost; do
ssh -n -o BatchMode=yes ${userhost} 'uname -a' > ${tmpdir}/${userhost} 2>&1 &
count=`expr $count + 1`
done < userhost.lst
while [ $count -gt 0 ]; do
wait $pids
count=`expr $count - 1`
done
echo "Output for hosts are in $tmpdir"
答案4
非常基本的设置:
for host in $(cat hosts.txt); do ssh "$host" "$command" >"output.$host"; done
使用名称/密码进行身份验证确实不是一个好主意。您应该为此设置一个私钥:
ssh-keygen && for host in $(cat hosts.txt); do ssh-copy-id $host; done