TL; DR
Las cosas solo se vuelven un poco más complicadas cuando tienes un servidor bastión que debe usarse.
Puede pasar ssh
como el comando que ssh
desee:
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 con los pseudo terminales
Tenga en cuenta que el punto de importancia clave aquí es que ssh
, como la mayoría de las herramientas, solo trata stdout
y stdin
corrige por defecto.
Sin embargo, cuando comience a ver la opción Me gusta Disable pseudo-terminal allocation.
y Force pseudo-terminal allocation.
es posible que deba hacer un poco de prueba y error. Pero, como regla general , no desea alterar el tty
comportamiento a menos que esté tratando de arreglar basura ilegible / binaria en un emulador de terminal (lo que un humano escribe).
Por ejemplo, tiendo a usarlo -At
para que el agente ssh de mi estación de trabajo se reenvíe, y para que ejecutar tmux de forma remota no interrumpa el binario (así ssh -At bastion.internal tmux -L bruno attach
). Y, para Docker también (como así sudo docker exec -it jenkins bash
).
Sin embargo, esas dos -t
banderas causan algunos daños en los datos difíciles de rastrear cuando intento hacer algo como esto:
# 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.