![简单的 ssh 循环,无需运行额外命令](https://linux22.com/image/787414/%E7%AE%80%E5%8D%95%E7%9A%84%20ssh%20%E5%BE%AA%E7%8E%AF%EF%BC%8C%E6%97%A0%E9%9C%80%E8%BF%90%E8%A1%8C%E9%A2%9D%E5%A4%96%E5%91%BD%E4%BB%A4.png)
我到处寻找一个简单的脚本来循环一系列服务器。我不想自动运行其他命令,但我只找到了这些。我不需要这样做。我只想让它通过 SSH 连接到服务器并允许我对其进行操作,然后当我退出时它会转到下一个服务器。我以前做过这个,但那是在旧的 debian 机器上,现在我使用的是 ubuntu
#!/bin/bash
for IP in `cat /home/bb/server.txt`
do echo $IP
ssh -p 2202 $IP
done
我尝试过修改其他人发布的脚本,例如
#!/bin/bash
servers="/home/bb/server.txt"
while IFS= read -r server
do
echo "connecting ... $server"
ssh -p 2202 "$server"
done < "$servers"
但这只是旋转它们并不允许我在任何服务器内工作。
编辑1:第一个循环仅回显文件位置而不是服务器,因此它不会打开文件来读取主机名。此外,它还返回“无法解析主机名 cat”,这证实它没有读取它。
编辑2:我试图避免安装新软件,因为这些服务器不赞成安装新软件。
编辑 3:至于我的最终目标,我会尽量更详细。我需要在一系列服务器上完成工作。每个服务器上的工作都不同,但它们都有需要完成的工作。使用脚本将我连接到下一个服务器比使用主机名列表(共 58 个)更方便,因为这样可能会遗漏一个。我只需要脚本将我 ssh 到一台服务器,然后当我完成后退出exit
或ctrl+d
它 ssh 到下一台服务器
答案1
正如 @larsks 指出的那样,read 将通过获取文件描述符 0 来屏蔽终端。您可以通过对脚本进行少量更改来覆盖此功能。
#!/bin/bash
servers=/home/bb/server.txt
exec 3<"$servers"
while IFS= read -u 3 -r server
do
echo "connecting ... $server"
ssh -p 2022 "$server"
done
答案2
第一个循环看起来是正确的,假设所有服务器都监听端口 2202 而不是 22。
根据您的使用情况,我建议您查看tmux-cssh它允许您同时在多台服务器上工作。如果您要在所有服务器上输入相同的命令,它可能适合您的用例。
连接四台服务器时是这样的……