Неужели декларативно невозможно получить код возврата из команды экрана через ssh?Linux

Ответить
Anonymous
 Неужели декларативно невозможно получить код возврата из команды экрана через ssh?

Сообщение Anonymous »

Я пишу программу на Python, которая должна запускать долго работающие программы через ssh, и я решил использовать screen.
Мне нужно знать результат программу на более позднем этапе, поэтому, следуя советам здесь https://unix.stackexchange.com/a/219555/423606
Основная проблема, с которой я столкнулся при исследовании моего Вариант использования — расширение переменных оболочки. А именно, двойные кавычки, расширяющие $?, когда я этого не хотел.
Итак, если мы подойдем к этой формулировке проблемы как к мысленному эксперименту, у нас будут следующие требования:
  • необходимо запустить экран через ssh
  • необходимо записать код возврата команды экрана на диск
Проблема, с которой я столкнулся и которая заставляет меня думать, что это невозможно, заключается в том, что здесь обязательно должны быть два уровня цитирования. Один раз для начальной команды ssh и второй после экрана.
Позвольте мне показать вам, что я имею в виду.

Код: Выделить всё

$ ssh -t me@remote bash -c 'screen -d -m -L -Logfile ~/screenlog bash -c "$(exit 1); echo $? >> ~/screenlog.test"'
Connection to localhost closed.
Теперь заходим на виртуальную машину, чтобы проверить...

Код: Выделить всё

me@remote:~# cat screenlog.test
0
Теперь давайте просто попробуем запустить команду экрана вручную на виртуальной машине, чтобы проверить, каким должен был быть код.

Код: Выделить всё

me@remote:~# screen -d -m -L -Logfile ~/screenlog bash -c '$(exit 1); echo $? >> ~/screenlog.test'
me@remote:~# cat screenlog.test
0
1
Здесь вы можете спросить: зачем вообще использовать bash -c после команды экрана? Что, если мы удалим этот уровень цитирования вместе с bash -c. Конечно, давай попробуем.

Код: Выделить всё

$ ssh -t me@remote 'screen -d -m -L -Logfile ~/screenlog $(exit 1); echo $? >> ~/screenlog.test'
Connection to localhost closed.
...

Код: Выделить всё

me@remote:~# cat screenlog.test
0
1
0
Я должен предположить, что есть причина, по которой я не понимаю, почему bash -c позволяет точно фиксировать код возврата.
Итак, я продемонстрировал, что необходимы как уровень цитирования ssh, так и уровень bash -c. Учитывая два уровня кавычек и только два типа кавычек, один из которых — двойные кавычки, является ли предрешенным вывод о том, что невозможно получить код возврата экранной команды, запущенной через ssh?

вы можете избежать кавычек

Код: Выделить всё

$ ssh -t me@remote 'screen -d -m -L -Logfile ~/screenlog bash -c \"$(exit 1); echo $? >> ~/screenlog.test\"'
Именно это вы подразумеваете под экранированием кавычек? Я только что попробовал, но файл так и не был записан, поэтому что-то сломалось в команде.

Подробнее здесь: https://stackoverflow.com/questions/788 ... mmand-over
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»