我正在使用bash脚本来检索服务器列表的正常运行时间。它只是从文件中读取并在服务器上执行远程命令。有些服务器可能已启动很长时间,而有些服务器可能刚刚重启。我使用的是非常简单的内容:
uptime | awk '{print \$2,\$3,\$4}'
如果服务器已启动至少一天,则此方法有效,但是如果仅启动了几个小时,则正常运行时间的输出将不包括工作日,而仅使用hour:minute格式。
我发现了一些我很喜欢的东西,但是似乎无法在ssh命令中正确地将其转义,更不用说尝试在bash脚本中传递它了:
uptime | awk -F'( |,|:)+' '{d=h=m=0; if ($7=="min") m=$6; else {if ($7~/^day/) {d=$6;h=$8;m=$9} else {h=$6;m=$7}}} {print d+0,"days,",h+0,"hours,",m+0,"minutes."}'
我已经尝试了好几种方法,但这对我来说应该可行,并且似乎无法弄清我所缺少的内容:
ssh user@IP "uptime | awk -F'( |,|:)+' '{d=h=m=0; if (\$7==\"min\") m=\$6; else {if (\$7\~\/^day\/) {d=\$6;h=\$8;m=\$9} else {h=\$6;m=\$7}}} {print d+0,\"days,\",h+0,\"hours,\",m+0,\"minutes.\"}'"
我得到的输出是:
awk: {d=h=m=0; if ($7=="min") m=$6; else {if ($7\~\/^day\/) {d=$6;h=$8;m=$9} else {h=$6;m=$7}}} {print d+0,"days,",h+0,"hours,",m+0,"minutes."}
awk: ^ backslash not last character on line
最后,我尝试将其放入bash脚本中,如下所示:
while IFS= read -r server; do
ssh -tt user@$server "uptime command" < /dev/null >> /home/user/uptime
done < "$file"
答案 0 :(得分:2)
只需将命令发送到ssh的标准输入:
cat <<'EOF' | ssh user@machine
uptime | awk -F'( |,|:)+' '{d=h=m=0; if ($7=="min") m=$6; else {if ($7~/^day/) {d=$6;h=$8;m=$9} else {h=$6;m=$7}}} {print d+0,"days,",h+0,"hours,",m+0,"minutes."}'
EOF
答案 1 :(得分:1)
在我看来,您在逃避太多:
ssh user@IP "uptime | awk -F'( |,|:)+' '{d=h=m=0; if (\$7==\"min\") m=\$6; else {if (\$7~/^day/) {d=\$6;h=\$8;m=\$9} else {h=\$6;m=\$7}}} {print d+0,\"days,\",h+0,\"hours,\",m+0,\"minutes.\"}'"
我得到:
6 days, 11 hours, 21 minutes.
更新:
由于同一命令将被发送到多个不同的远程主机,因此我建议将其保存到一个变量中以方便重用。
command="uptime | awk -F'( |,|:)+' '{d=h=m=0; if (\$7==\"min\") m=\$6; else {if (\$7~/^day/) {d=\$6;h=\$8;m=\$9} else {h=\$6;m=\$7}}} {print d+0,\"days,\",h+0,\"hours,\",m+0,\"minutes.\"}'"
ssh user@IP1 "$command"
ssh user@IP2 "$command"
试运行:
$ bash script.sh
0 days, 2 hours, 26 minutes.
7 days, 4 hours, 18 minutes.
等等,还有更多
:我经常需要向远程主机发送多个命令:为此,我发现quoted heredoc syntax在他的choroba中建议的answer是最方便。
command=$(cat <<'EOF'
hostname
uptime | awk -F'( |,|:)+' '{d=h=m=0; if ($7=="min") m=$6; else {if ($7~/^day/) {d=$6;h=$8;m=$9} else {h=$6;m=$7}}} {print d+0,"days,",h+0,"hours,",m+0,"minutes."}'
EOF
)
ssh user@IP1 "$command"
ssh user@IP2 "$command"
这是输出:
$ bash script.sh
server1
0 days, 2 hours, 26 minutes.
server2
7 days, 4 hours, 18 minutes.