Bash脚本无法遍历全部服务器条目,如何解决?
解决Bash脚本遍历服务器列表只处理第一行的问题
问题原因
脚本仅处理第一行服务器的核心原因是:ssh命令默认会读取标准输入(即给while read提供内容的servers.txt),导致read命令无法获取文件中的第二行内容,循环提前终止。另外脚本里的/dev/nul l多了一个空格,需修正为/dev/null,否则ping的输出无法被正确丢弃。
解决方案
方法1:给ssh添加-n参数
-n参数让ssh从/dev/null读取输入,避免占用while循环的标准输入。修改后的脚本如下:
#!/bin/bash # Read in server names from a file while read -r server; do # Check if server is reachable if ping -c 1 "$server" &> /dev/null; then echo "Server $server is reachable." # Check if mount point exists if ssh -n "$server" "[ -d /path/to/mount/point ]"; then echo "Mount point exists on server $server." else echo "Mount point does not exist on server $server." fi else echo "Server $server is not reachable." fi done < servers.txt
方法2:重定向ssh的输入到/dev/null
若不想用-n参数,可直接将ssh的输入重定向到/dev/null,效果与方法1一致:
#!/bin/bash # Read in server names from a file while read -r server; do # Check if server is reachable if ping -c 1 "$server" &> /dev/null; then echo "Server $server is reachable." # Check if mount point exists if ssh "$server" "[ -d /path/to/mount/point ]" < /dev/null; then echo "Mount point exists on server $server." else echo "Mount point does not exist on server $server." fi else echo "Server $server is not reachable." fi done < servers.txt
方法3:改用for循环读取(适合无特殊字符的服务器列表)
如果服务器列表都是IP地址这类无空格的内容,也可以用for循环读取文件内容,不会被ssh的输入干扰:
#!/bin/bash # Read in server names from a file for server in $(cat servers.txt); do # Check if server is reachable if ping -c 1 "$server" &> /dev/null; then echo "Server $server is reachable." # Check if mount point exists if ssh "$server" "[ -d /path/to/mount/point ]"; then echo "Mount point exists on server $server." else echo "Mount point does not exist on server $server." fi else echo "Server $server is not reachable." fi done
关键说明
优先推荐方法1或方法2,因为while read -r的方式能更好地处理包含空格或特殊字符的服务器名称,比for循环更健壮。同时必须修正/dev/nul l的拼写错误,确保ping命令的输出被正确丢弃,避免不必要的干扰。
内容的提问来源于stack exchange,提问作者indra
相关产品推荐
相关产品推荐

