shell 脚本到 运行 在多个远程服务器上通过 SSH 命令
shell script to run commands over SSH on multiple remote servers
我需要检查 telnet 是否在多个远程服务器上发生。
我写了一个 while 循环到多个远程服务器上的 SSH,并在 telnet 失败时触发一封电子邮件。但问题是 while
循环仅在第一台服务器上迭代并退出脚本而不读取其余服务器。下面是我的 shell 脚本
#!bin/bash
while read host_details
do
USERNAME=$(echo $host_details | awk -F"|" '{print }')
HOSTIP=$(echo $host_details | awk -F"|" '{print }')
PORT=$(echo $host_details | awk -F"|" '{print }')
PROXY=$(echo $host_details | awk -F"|" '{print }')
PROXY_PORT=$(echo $host_details | awk -F"|" '{print }')
STATUS=$(ssh -n ${USERNAME}@${HOSTIP} -p${PORT} "timeout 4 bash -c \"</dev/tcp/${PROXY}/${PROXY_PORT}\"; echo $?;" < /dev/null)
if [ "$STATUS" -ne 0 ]
then
echo "Connection to $PROXY on port $PROXY_PORT failed"
mutt -s "Telnet connection to $PROXY on port $PROXY_PORT failed" abc.def@xyz.com
else
echo "Connection to $PROXY on port $PROXY_PORT succeeded"
mutt -s "Telnet connection to $PROXY on port $PROXY_PORT succeeded" abc.def@xyz.com
fi
done<.hostdetails
我观察到我的脚本仅在删除 IF
条件时才有效,并且我的 while
循环按预期遍历所有服务器。
任何人都可以建议为什么当我使用 IF
条件时脚本在第一次迭代后退出?以及如何让它发挥作用并获得电子邮件提醒?
感谢@GordonDavisson 的推荐。
脚本中的 mutt
将剩余的服务器详细信息视为输入列表,因此脚本在读取第一个服务器值后终止。
将 mutt
替换为脚本中的另一个电子邮件程序。
但是,希望使用 mutt
的用户,建议将内容添加到他们的电子邮件正文或将标准输入从 mutt 重定向到 /dev/null
下面是有效的解决方案:
#!bin/bash
while IFS="|" read -r userName hostIp Port Proxy proxyPort
do
STATUS=$(ssh -n -tt -o LogLevel=quiet ${userName}@${hostIp} -p${Port} 'timeout 4 /bin/bash -c' \'"</dev/tcp/${Proxy}/${proxyPort}"\'; echo $? < /dev/null | tr -d '\r')
if [ "$STATUS" -ne 0 ]
then
echo "Connection to $Proxy on port $proxyPort failed" | mutt -s "${hostIp}:Telnet connection to $Proxy on port $proxyPort failed" abc.def@xyz.com
else
echo "Connection to $Proxy on port $proxyPort succeeded" | mutt -s "${hostIp}:Telnet connection to $Proxy on port $proxyPort succeeded" abc.def@xyz.com
fi
done<.hostdetails
解决方案中的trim命令是删除回车return(\r) 我是在变量(STATUS)
我需要检查 telnet 是否在多个远程服务器上发生。
我写了一个 while 循环到多个远程服务器上的 SSH,并在 telnet 失败时触发一封电子邮件。但问题是 while
循环仅在第一台服务器上迭代并退出脚本而不读取其余服务器。下面是我的 shell 脚本
#!bin/bash
while read host_details
do
USERNAME=$(echo $host_details | awk -F"|" '{print }')
HOSTIP=$(echo $host_details | awk -F"|" '{print }')
PORT=$(echo $host_details | awk -F"|" '{print }')
PROXY=$(echo $host_details | awk -F"|" '{print }')
PROXY_PORT=$(echo $host_details | awk -F"|" '{print }')
STATUS=$(ssh -n ${USERNAME}@${HOSTIP} -p${PORT} "timeout 4 bash -c \"</dev/tcp/${PROXY}/${PROXY_PORT}\"; echo $?;" < /dev/null)
if [ "$STATUS" -ne 0 ]
then
echo "Connection to $PROXY on port $PROXY_PORT failed"
mutt -s "Telnet connection to $PROXY on port $PROXY_PORT failed" abc.def@xyz.com
else
echo "Connection to $PROXY on port $PROXY_PORT succeeded"
mutt -s "Telnet connection to $PROXY on port $PROXY_PORT succeeded" abc.def@xyz.com
fi
done<.hostdetails
我观察到我的脚本仅在删除 IF
条件时才有效,并且我的 while
循环按预期遍历所有服务器。
任何人都可以建议为什么当我使用 IF
条件时脚本在第一次迭代后退出?以及如何让它发挥作用并获得电子邮件提醒?
感谢@GordonDavisson 的推荐。
脚本中的 mutt
将剩余的服务器详细信息视为输入列表,因此脚本在读取第一个服务器值后终止。
将 mutt
替换为脚本中的另一个电子邮件程序。
但是,希望使用 mutt
的用户,建议将内容添加到他们的电子邮件正文或将标准输入从 mutt 重定向到 /dev/null
下面是有效的解决方案:
#!bin/bash
while IFS="|" read -r userName hostIp Port Proxy proxyPort
do
STATUS=$(ssh -n -tt -o LogLevel=quiet ${userName}@${hostIp} -p${Port} 'timeout 4 /bin/bash -c' \'"</dev/tcp/${Proxy}/${proxyPort}"\'; echo $? < /dev/null | tr -d '\r')
if [ "$STATUS" -ne 0 ]
then
echo "Connection to $Proxy on port $proxyPort failed" | mutt -s "${hostIp}:Telnet connection to $Proxy on port $proxyPort failed" abc.def@xyz.com
else
echo "Connection to $Proxy on port $proxyPort succeeded" | mutt -s "${hostIp}:Telnet connection to $Proxy on port $proxyPort succeeded" abc.def@xyz.com
fi
done<.hostdetails
解决方案中的trim命令是删除回车return(\r) 我是在变量(STATUS)