Я работаю над сценарием bash, чтобы получить время безотказной работы списка серверов. Он просто читает из файла и выполняет удаленную команду на сервере. Возможно, некоторые серверы работали долгое время, а некоторые только что были перезагружены. Я использовал что-то очень простое:
uptime | awk '{print \$2,\$3,\$4}'
Это работает, если сервер работал по крайней мере один день, но если он работал только в течение нескольких часов, выходные данные времени безотказной работы не включают рабочие дни, а просто используют формат час: минута.
Я нашел что-то, что мне очень нравится, но, похоже, не могу избежать этого должным образом в команде 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"