По сути, это то же самое, что и один из очень известных вопросов на техническом собеседовании UNIX, известных веками:
Предположим, что кто-то с корневым доступом запустил команда chmod -R 444 /
и сделала двоичный файл chmod
неисполняемым. Как вы оправитесь от этого?
Есть ответ perl, и есть этот, который в основном запускает неисполняемую программу, chmod
в этом случае:
/lib/ld-linux.so /bin/chmod +x /bin/chmod
Я думаю, вы можете применить это для любой другой программы, которая, как вы знаете, является исполняемой. В противном случае будьте готовы принять катастрофу, которая может последовать
PS> /lib/ld-linux.so
может отличаться по названию. Так что, если прямое соответствие недоступно, поищите одноименные so
. Например, на моем сервере CentOS 6 это /lib/ld-linux.so.2
, которая является символической ссылкой, указывающей на /lib/ld-2.12.so
. Итак, ваш пробег может отличаться.
Похоже, вы ожидаете, что "hello"
будет передано сценарию в качестве аргумента, но не передаете его в качестве аргумента командной строки оболочке.
Вместо этого, чтобы передать скрипт на стандартный ввод в bash
, используйте bash -s
. Это также позволяет вам передавать дополнительный аргумент командной строки, например.bash -s "hello"
:
ssh...options... 'sudo -u remoteuser /bin/bash -s "hello"' <./hello.sh
Обратите внимание, однако, что это делает стандартный поток ввода оболочки сценарием оболочки, поэтому чтение данных из стандартного ввода становится затруднительным внутри самого сценария.
Очевидно, что другой вариант — передать сценарий на удаленную систему и запустить его там.
Ваша команда
ssh...options... 'sudo -u remoteuser /bin/bash' <./hello.sh "hello"
идентично
ssh...options... 'sudo -u remoteuser /bin/bash' "hello" <./hello.sh
Позиционирование перенаправления на линии здесь не имеет значения. См., например. Насколько допустима эта команда? "> файл1 < файл2 кот"