Хотя ssh
обеспечивает два отдельных выходных потока (для stdout и stderr), он подает только один входной поток (stdin). Поэтому вам нужно либо передавать содержимое скрипта и входной файл через разные механизмы.
Например, один через переменную, другой через stdin:
LC_CODE=$(cat local_script.sh) ssh host 'eval "$LC_CODE"' < input
(предполагая, что и ваш ssh
клиент передает LC_*
переменную (SendEnv
в ssh_config
) и ssh_config
sshd
сервер принимает их (AcceptEnv
в sshd_config
))
Или просто передайте содержимое local_script. sh
в качестве кода удаленной оболочки, предполагая, что оболочка входа удаленного пользователя соответствует синтаксису этого скрипта:
ssh host "$(cat local_script.sh)" < input
Или скомпонуйте код и ввод, переданный в stdin ssh
, как в примере:
{
echo '{'; cat local_script.sh; echo '}; exit'
cat input
} | ssh host 'bash -s some arguments'
Здесь используется bash
, потому что bash
позаботится о чтении ввода по одному байту за раз, чтобы не читать дальше этой строки }; exit
, в то время как не все другие оболочки делают это.
Или если sed
на удаленном хосте - GNU sed
:
echo '#END-OF-SCRIPT' | cat local_script.sh - input |
ssh host 'set some arguments; eval "$(sed -u "/^#END-OF-SCRIPT/q")"'
(здесь код оценивается оболочкой входа удаленного пользователя и предполагается, что она Bourne-подобная)
Похоже, используемая вами версия Amazon Linux не имеет systemd
. Я не уверен, что какая-либо версия Amazon Linux на сегодняшний день использует systemd
. Учитывая, что systemd
является основной частью операционной системы, его нельзя просто установить как пакет и ожидать, что он будет работать.
Если вы не можете найти нужные вам пакеты для Amazon Linux, я рекомендую начать заново с AMI из другой ОС. Например, существуют AMI для CentOS , с которых вы могли бы начать вместо этого.
Я рекомендую перейти на новый дистрибутив Linux. В более популярном дистрибутиве Linux, таком как CentOS или Ubuntu, у вас гораздо меньше шансов столкнуться с проблемами с отсутствующими пакетами, как в настоящее время с Amazon Linux.