Enquanto ssh
fornece dois fluxos de saída separados (para stdout e stderr), ele alimenta apenas um fluxo de entrada (stdin). Então, você precisaria passar o conteúdo do script e o arquivo de entrada por meio de mecanismos diferentes.
Por exemplo, um através de uma variável, um via stdin:
LC_CODE=$(cat local_script.sh) ssh host 'eval "$LC_CODE"' < input
(supondo que seu cliente ssh
passe a variável LC_*
( SendEnv
in ssh_config
) e o servidor sshd
os aceite ( AcceptEnv
in sshd_config
))
Ou simplesmente passe o conteúdo do local_script.sh
como o código do shell remoto supondo que o shell de login do usuário remoto seja o correto para a sintaxe desse script:
ssh host "$(cat local_script.sh)" < input
Ou concatene o código e a entrada alimentados para o stdin de ssh
como:
{
echo '{'; cat local_script.sh; echo '}; exit'
cat input
} | ssh host 'bash -s some arguments'
Aqui, usando bash
, porque bash
cuidará da leitura da entrada, um byte de cada vez, para não ler além daquela linha }; exit
, enquanto nem todas as outras camadas fazem isso.
Ou se sed
no host remoto for GNU sed
:
echo '#END-OF-SCRIPT' | cat local_script.sh - input |
ssh host 'set some arguments; eval "$(sed -u "/^#END-OF-SCRIPT/q")"'
(aqui tendo o código avaliado pelo shell de login do usuário remoto e assumindo que é como o Bourne)