TL; DR
As coisas só ficam um pouco mais complicadas quando você tem um servidor bastião que deve ser usado.
Você pode passar ssh
como o comando da seguinte ssh
maneira:
cat local_script.sh | ssh -A usera@bastion ssh -A userb@privateserver "cat > remote_copy_of_local_script.sh; bash remote_copy_of_local_script.sh"
Cuidado com pseudo-terminais
Observe que o ponto de maior importância aqui é que ssh
, como a maioria das ferramentas, trata stdout
e stdin
corrige por padrão.
No entanto, quando você começa a ver a opção como Disable pseudo-terminal allocation.
e Force pseudo-terminal allocation.
pode ser necessário fazer uma pequena tentativa e erro. Mas, como regra geral, você não deseja alterar o tty
comportamento, a menos que esteja tentando corrigir lixo ilegível / binário em um emulador de terminal (o que um humano digita).
Por exemplo, eu costumo usar -At
para que o agente ssh da minha estação de trabalho seja encaminhado e para que a execução remota do tmux não seja binária (assim ssh -At bastion.internal tmux -L bruno attach
). E, para docker também (assim sudo docker exec -it jenkins bash
).
No entanto, esses dois -t
sinalizadores causam dificuldades para rastrear a corrupção de dados quando tento fazer algo assim:
# copy /etc/init from jenkins to /tmp/init in testjenkins running as a container
ssh -A bastion.internal \
ssh -A jenkins.internal \
sudo tar cf - -C /etc init | \
sudo docker exec -i testjenkins \
bash -c 'tar xvf - -C /tmp'
# note trailing slashes to make this oneliner more readable.