Все становится немного сложнее, когда у вас есть сервер-бастион , который необходимо использовать.
Вы можете передать 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
.
Однако, когда вы начинаете видеть такую опцию, как Отключить выделение псевдотерминалов.
и Принудительное выделение псевдотерминалов.
вам может потребоваться немного проб и ошибок. Но, как общее правило , вы не хотите изменять поведение tty
, если только вы не пытаетесь исправить искаженный / двоичный мусор в эмуляторе терминала (что вводит человек).
Например, я обычно использую -At
, чтобы перенаправлять ssh-agent моей рабочей станции и чтобы удаленный запуск tmux не блокировал двоичный файл (например, ssh -At bastion. внутренний 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.
Класс [[:space:]]
является надмножеством класса [[:blank:]]
, который дополнительно (кроме пробела и табуляции из [[:blank: ]]
) включает
\n
, перевод строки в Unix, ASCII код 10),\v
, ASCII код 11),\f
, ASCII код 12), и\r
, ASCII код 13). ... в локали POSIX, то есть. В других локалях могут быть дополнительные символы пробела.