TL; DR
As coisas só ficam um pouco mais complicadas quando você tem um servidor bastião que deve ser usado.
Você pode passar sshcomo o comando da seguinte sshmaneira:
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 stdoute stdincorrige 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 ttycomportamento, 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 -Atpara 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 -tsinalizadores 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.