Как отмечено в ответ у вас уже есть, удаленный sh
не выполняет exit 5
. Простоexit
:
$ ssh test sh -x -c 'exit 5'; echo $?
+ exit
0
То, что здесь происходит, объясняется, например, в этом ответе:
ssh
запускает удаленную оболочку и передает ей строку , а не список аргументов.
Когда мы выполняемssh host sh -c 'exit 5'
:
ssh
получает аргументы host
, sh
, -c
и exit 5
. Он объединяет их в строку и отправляет ее на удаленный хост; ssh
вызывает оболочку и передает ей строку sh -c exit 5
; sh
и передает ей параметр -c
, exit
в качестве командной строки и 5
в качестве имени команды . Обратите внимание, что если мы добавим слова после exit 5
,они просто передаются в sh
в качестве дополнительных аргументов -нет ошибок, связанных с тем, что они не распознаются оболочкой:
$ ssh test sh -x -c 'exit 5' a b c; echo $?
+ exit
0
strace
подтверждает, что 5
не является частью командной строки, заданной для sh
, здесь; это аргумент:
$ ssh test strace -e execve sh -c 'exit 5'; echo $?
execve("/usr/bin/sh", ["sh", "-c", "exit", "5"], 0x7ffc0d744c38 /* 14 vars */) = 0
+++ exited with 0 +++
0
Чтобы выполнить sh -c 'command'
на удаленном хосте, как предполагалось, мы должны быть уверены, что также правильно отправили ему кавычки:
$ ssh test "sh -x -c 'exit 5'"; echo $?
+ exit 5
5
Чтобы было ясно, что цитирование всей удаленной команды не имеет отношения к нашей текущей проблеме, мы могли бы просто написать:
$ ssh test sh -x -c "'exit 5'"; echo $?
+ exit 5
5
Экранирование внутренних кавычек с помощью обратной косой черты вместо двухкратного цитирования также сработает.
Замечание по поводу командыssh host sh -c ':; exit 5'
(из комментариев к вашему вопросу ). Что он делает:
$ ssh test sh -x -c ':; exit 5'; echo $?
+ :
5
То есть exit 5
выполняется внешней оболочкой, а не sh
. Опять же, чтобы sh
выйти с нужным кодом:
$ ssh test sh -x -c "':; exit 5'"; echo $?
+ :
+ exit 5
5
Вы можете настроить переадресацию портов на маршрутизаторе в вашем музее, чтобы общедоступный порт, скажем, «2222» перенаправлял вас на «22» порт вашего медиаплеера. Затем вы можете scp
загрузить новый файл в свой медиаплеер (и подключиться к маршрутизатору музея через порт 2222 ).
Единственная проблема заключается в том, чтобы узнать IP-адрес маршрутизатора.
Если я правильно прочитал вопрос, включая заголовок, вы спрашиваете, как подключить от музейного компьютера к вашему компьютеру, чтобы вы могли копировать видео.
Это известно как «обратное туннелирование ssh», и в основном то, что вы делаете, это запускать на музейном компьютере команду ssh -R, которая вызывает настройку туннеля изнутри их брандмауэра к вашему компьютеру. Затем вы используете ssh/scp со своего компьютера на порт, установленный командой туннелирования. Да, это может сбивать с толку первые 100 или около того раз, когда вы это делаете.
Немного литературы :https://www.howtogeek.com/428413/what-is-reverse-ssh-tunneling-and-how-to-use-it/https://www.howtoforge.com/reverse-ssh-tunneling
Проблема в том, что вы либо должны:
Примером номера 2 может быть создание туннеля всякий раз, когда кто-то втыкает USB-устройство в машину. Тогда вместо того, чтобы отправлять вам видео по электронной почте, сотрудники музея просто сами записывали его на USB-накопитель и вставляли его в компьютер. Затем у вас будет какой-то способ запуска сценария, который создаст туннель (бонусные баллы для случайных портов в туннеле, сообщенные вам видеомашиной, отправившей электронное письмо (дополнительные бонусные баллы за шифрование этого электронного письма )вам, что готово ).
Еще одно решение, направляющее дух Рубена Гаррета Люциуса Голдберга.
Настройте сервер входящей почты на видеомашине. Попросите сотрудников музея отправить электронное письмо по адресу «newvideo@machine.whatever.org». Пусть скрипт удалит видео из письма и -закодирует его обратно в исходный формат. Переместите предыдущее видео в файл резервной копии. Поместите новое видео на место. Отправьте электронное письмо, чтобы сотрудники музея убедились, что воспроизводится «хорошее» видео.
Я не вижу в вашем -случае использования ничего, что требовало бы обратного.
Если вы не можете подключиться, вы можете подключиться. Имейте машину в музее, подключитесь к своей машине. Он может запрашивать изменения и загружать, если есть изменения.
напр.
Раз в день он может ssh
на пульте проверить даты, и если новый файл найден, то использовать scp
для его загрузки. Вероятно, есть инструменты, которые уже могут это сделать.
Обратный туннель нужен только в том случае, если вы хотите иметь общее ssh
соединение с машиной, и оно может подключаться только наружу. Поскольку ваш вариант использования не требует соединения общего назначения ssh
, оно вам не нужно.
Альтернативы включают. Подключитесь к защищенному веб-сайту -и загрузите оттуда. Есть даже способы, которые позволят вам подключиться к веб-сайту -и дождаться сообщения об изменении файла. (это устранит опрос и сократит трафик ).