TL; DR
Все становится немного сложнее, когда у вас есть бастионный сервер, который нужно использовать.
Вы можете передать ssh
как команду ssh
так:
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"
Остерегайтесь псевдо-терминалов
Обратите внимание, что ключевой момент здесь заключается в том ssh
, что , как и большинство инструментов, просто обрабатывает stdout
и stdin
исправляет по умолчанию.
Тем не менее, когда вы начинаете видеть опцию, как Disable pseudo-terminal allocation.
и Force pseudo-terminal allocation.
вам, возможно, придется сделать небольшую пробную версию и ошибку. Но, как правило, вы не хотите изменять tty
поведение, если не пытаетесь исправить искаженное / двоичное барахло в эмуляторе терминала (что вводит человек).
Например, я склонен использовать -At
так, чтобы ssh-agent моей рабочей станции переадресовывался, и чтобы удаленный запуск tmux не мешал бинарному файлу (как это происходит ssh -At bastion.internal tmux -L bruno attach
). И для докера тоже (вроде так sudo docker exec -it jenkins bash
).
Тем не менее, эти два -t
флага заставляют некоторые трудно отследить повреждение данных, когда я пытаюсь сделать что-то вроде этого:
# 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.