Naf*_*Kay 5 networking scripting bash
我正在测试机器的稳定性,我需要简单地编写一个 Bash 脚本来确定主机是否在线。我怎么能写这个?
if [ ! $(hostisonline) ]; then
# profit
fi
Run Code Online (Sandbox Code Playgroud)
如果主机回答 ping 然后测试它是否在线(只是一个例子):
ping -c 10 $host
Run Code Online (Sandbox Code Playgroud)
如果没有返回/禁止 ping,我会通过 nmap 检查单个服务:
nmap $host -p $known_port --max-retries 10 | grep -q open
Run Code Online (Sandbox Code Playgroud)
例如要测试 ssh 是否有望打开,请将 known_port 替换为 22
至于脚本,它可能是(示例——这是星期天早上,我很无聊,所以经过一些编辑后它有所增长——旨在测试一堆主机,而不仅仅是一个):
declare -A SERVER
# SERVER["NAME - Description"]="IP KNOWNPORT"
SERVER["SERVER1 - Client foo"]="111.111.111.111 22"
SERVER["SERVER2 - Client bar"]="222.222.222.222 80"
# ...
# add as many server/port combinations as you'd like
NMAP_MAX_RETRIES=10
printf "========================= ========================= ========== ==========\n"
printf "%25s %25s %10s %10s\n" "Host Description" "IP" "Port" "Status"
printf "========================= ========================= ========== ==========\n"
for server in "${!SERVER[@]}"; do
set -- ${SERVER["$server"]}
eval nmap \$1 -p \$2 --max-retries $NMAP_MAX_RETRIES | grep -q open
if [ "$?" == "0" ]; then
STATUS="[OK]"
else
STATUS="*DOWN*"
fi
printf "%25s %25s %10s %10s\n" "$server" "$1" "$2" "$STATUS"
done
printf "========================= ========================= ========== ==========\n"
Run Code Online (Sandbox Code Playgroud)
执行时它返回(假ips,所以服务器关闭):
~$ bash /tmp/foo.sh
========================= ========================= ========== ==========
Host Description IP Port Status
========================= ========================= ========== ==========
SERVER2 - Client bar 222.222.222.222 80 *DOWN*
SERVER1 - Client foo 111.111.111.111 22 *DOWN*
========================= ========================= ========== ==========
Run Code Online (Sandbox Code Playgroud)
一个简单的解决方案是:
ping -W 1 $ip
Run Code Online (Sandbox Code Playgroud)
其中-W以秒为单位指定超时。
确保它是大写的 W。您还可以使用-i以秒为单位指定等待时间。