我正在尝试制作一个脚本来检查变量中的数字然后生成输出。即使用 ping 并基于 tty,检查其运行的是 Linux 还是 Windows。我可能把事情复杂化了,但这就是我得到的:
#!/bin/bash
var1=$(ping $1 -c 1) | awk '{if("$var1"=="128") print "Host is LIVE Running: Windows OS"}'
不产生任何输出。我尝试过使用 IF 语句而不使用 awk,如果我输入一个我知道无法访问的 IP,它不会产生任何输出。
#!/bin/bash
var1=$(ping $1 -c 1)
if [[ "$var1" == *"128"* ]]; then
echo "Host is LIVE Running: Windows OS"
elif [[ "$var1" == *"64"* ]]; then
echo "Host is LIVE Running: Linux OS"
elif [[ "$var1" == *"Unreachable"* ]]; then
echo "Host appears DOWN!"
fi
欢迎建设性批评!谢谢。
答案1
如果awk
你想使用环境中的变量,你应该设置它。像这样:
var1=$(ping $1 -c 1) ; awk -v var2=$var1 '{if(var2 == 128)....
当bash
您比较数字时,您应该使用:
if [[ "$var1" -eq *"128"* ]]; then...
=
对于字符串,bash
您可以同时使用=
and==
和 AFAIK,它们的含义相同(在if
)
答案2
您的脚本不起作用的一些原因:
$var1
awk 内部不存在shell 变量- 即使它确实如此,
"$var1"
在 awk 中并不意味着你认为它的作用 - 它是文字 text$var1
,如果没有引号,它将间接指定带有变量值的字段号var1
(即,如果 var1 等于 2,则字段 2输入的$2)。 awk 中未初始化的变量的数值为 0,因此这将是 $0 或整个输入行。 $var1
在 bash 中将包含命令的整个输出ping
,而不仅仅是 ttl 值。- 使用 ICMP Echo Reply 数据包的 TTL 值来确定远程主机的操作系统是一种不可靠的方法。 Windows 并不是唯一使用 TTL 128 的操作系统(也不是所有版本的 Windows 都使用 128)。
答案3
已经搞定了,谢谢支持。这段代码只是有助于第一眼更好地了解它可能是什么操作系统。
#!/bin/bash
var1=$(ping $1 -c 1 -W 3 | grep "64 bytes" | cut -d " " -f 6)
if [[ "$var1" -eq "ttl=63" ]]; then
echo "Host is LIVE! Most likely running: Linux OS"
elif [[ "$var1" -eq "ttl=64" ]]; then
echo "Host is LIVE! Most likely running: Linux OS"
elif [[ "$var1" -eq "ttl=127" ]]; then
echo "Host is LIVE! Most likely running: Windows OS"
elif [[ "$var1" -eq "ttl=128" ]]; then
echo "Host is LIVE! Most likely running: Windows OS"
elif [[ "$var1" -eq "ttl=31" ]]; then
echo "Host is LIVE! Most likely running: Windows 95 OS"
elif [[ "$var1" -eq "ttl=32" ]]; then
echo "Host is LIVE! Most likely running: Windows 95 OS"
elif [[ "$var1" -eq "ttl=255" ]]; then
echo "Host is LIVE! Most likely running: MAC / OPENBSD / CISCO / SOLARIS OS"
elif [[ "$var1" -eq "ttl=254" ]]; then
echo "Host is LIVE! Most likely running: MAC / OPENBSD / CISCO / SOLARIS OS"
elif [[ "$var1" == "" ]]; then
echo "Host appears to be DOWN!"
fi