Как получить статус systemctl на удаленной машине

Когда мы запускаем это на удаленной машине, мы получаем

ssh $IP "systemctl disable iptables.service"

и стандартная ошибка

echo $?

0

но давайте запустим его с ошибкой (я добавляю неправильный синтаксис)

например

ssh $IP "systemctl disable_bug iptables.service"

почему мы получаем 0 от стандартной ошибки? несмотря на провал команды!!!

echo $?
0

1 ответ

Решение

Вы повторяете результаты команды ssh, которая успешно завершилась оба раза (т.е. ssh был в порядке). Вы не отображаете результаты команды, которую вы запустили через ssh.

Если вы перенаправите вывод команды в файл (с помощью tee или обычного перенаправления), вы сможете собрать результаты позже.

редактировать

Из-за отрицательных голосов (я полагаю, что OP, который не понимает, что я уже ответил правильно, (см. Комментарии)), я расширяю этот ответ.

Когда ты бежишь echo $?, он выведет код завершения последней локальной команды. Например:

$ ssh user@host 'ls /tmp' 
lastSubredditNeighborsRun.log
meetupDumper.log
mongodb-27017.sock

$ echo $?
0

Это код возврата ssh - НЕ код возврата ls бежать удаленно.

Бег echo $? может также ничего не отображать:

$ ssh user@host 'ls /tp' && echo $?
ls: cannot access /tp: No such file or directory

Или может отображаться код возврата ошибки - если вы не запустите его в командной строке:

$ ssh user@host 'ls /tp'
ls: cannot access /tp: No such file or directory
$ echo $?
2

ssh может отправить код ошибки отправленной команды - как предполагается, - как собственный код ошибки... но это не всегда.

Но работает echo $? всегда только сможет повторить код ошибки последней запущенной локальной команды. Если ssh возвращает код удаленной ошибки как свой собственный, это здорово. Но если это не так (или удаленная команда не отправляет код ошибки), вы получите ожидаемый результат от echo $? - который 0 если предыдущая команда выполнена успешно

Другие вопросы по тегам