Можно ли направить стандартный вывод на одном сервере в стандартный вывод на другом сервере?

74

stdoutна одном сервере CentOS необходимо подключить к stdinдругому серверу CentOS. Это возможно?

Обновить

ScottPack, MikeyB и Jofel имеют правильные ответы. Я присудил ответ Скотту, потому что, хотя в моем вопросе безопасность не указывалось как требование, всегда приятно быть в безопасности. Тем не менее, предложения двух других стипендиатов также будут работать.

Wesley
источник
1
Стоит отметить, что (единственным) основным преимуществом подхода не-ssh является скорость передачи данных; если вы работаете в быстрой сети и безопасность не требуется, это может стоить дополнительных неудобств при вводе двух команд в два окна.
Random832

Ответы:

94

Это беззастенчивое да.

Когда кто-то использует sshкоманду на удаленном сервере, он выполняет какое-то причудливое внутреннее перенаправление ввода / вывода. На самом деле, я считаю, что это одна из едва заметных особенностей OpenSSH. В частности, если вы используете sshдля выполнения произвольной команды на удаленной системе, то SSH будет отображать STDINи STDOUTк тому , что команды выполняется.

В качестве примера, давайте предположим, что вы хотите создать резервный архив, но не хотите или не можете хранить его локально. Давайте рассмотрим этот синтаксис:

$ tar -cf - /path/to/backup/dir | ssh remotehost "cat - > backupfile.tar"

Мы создаем тарбол и пишем его STDOUTобычным вещам. Поскольку мы используем ssh для выполнения удаленной команды, STDIN отображается в STDINоф cat. Который мы затем перенаправить в файл.

Скотт Пак
источник
11
Это не какая-то «причудливая внутренняя переадресация ввода / вывода» - просто обычные, скучные обычные вещи. ssh читает из STDIN, как и любой другой инструмент, и передает его удаленному процессу. :)
Даниэль Питтман
7
@DanielPittman: Но гораздо интереснее называть это "причудливым внутренним" мусором.
Скотт Пак
7
Аналогичным образом, netcatна обоих концах создается отличный простой и легкий канал связи. tar cf - /path/to/dir | nc 1.2.3.4 5000на одном сервере, nc -l -p 5000 > backupfile.tarна другом.
MikeyB
1
@MikeyB: Хороший вопрос. Netcat - это протокол с открытым текстом, поэтому будьте осторожны с конфиденциальными данными. Я склонен использовать netcat для более конкретных вещей, таких как приобретение сетевых дисков (ala dd) по локальной сети и сканирование портов.
Скотт Пак
2
@MikeyB: Вы, люди, что с вашим полетом и штанами!
Скотт Пак
28

На netcatобоих концах соединения используется удобный способ передачи данных между узлами, когда вам не нужно беспокоиться о безопасности по проводам .

Это также позволяет вам устанавливать их асинхронно:

На «приемнике» (действительно, вы будете иметь двустороннюю связь, но об этом проще думать так), запустите:

nc -l -p 5000 > /path/to/backupfile.tar

И на «отправителя» запустите:

tar cf - /path/to/dir | nc 1.2.3.4 5000
MikeyB
источник
Очень приятно знать. Это хорошо, если физическому соединению доверяют, как, например, резервная сеть, или если соединение уже туннелировано.
Уэсли
Или, если данные в любом случае общедоступны.
Сэмюэль Эдвин Уорд
1
+1 netcat - бесценный инструмент, особенно если у вас не работает ssh-сервер.
kwarrick
21

Очень мощный инструмент для создания однонаправленных и двунаправленных соединений socat. Для краткого обзора возможностей, посмотрите на примеры в его man-странице .

Он полностью заменяет netcatаналогичные инструменты и поддерживает зашифрованные соединения ssl. Для начинающих это может быть не так просто, но, по крайней мере, полезно знать, что оно существует.

jofel
источник
1
@WesleyDavid: к вашему «Обновлению»: просто для полноты я добавил к своему ответу, что у socat есть поддержка SSL, так что шифрование возможно и с помощью socat. Тем не менее, ssh в большинстве случаев является лучшим и простым решением, поэтому я бы тоже выбрал ответ Скотпака.
Джофель
5

TL; DR

Все становится немного сложнее, когда у вас есть бастионный сервер, который нужно использовать.

  1. Вы можете передать 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"
  2. Остерегайтесь псевдо-терминалов


Обратите внимание, что ключевой момент здесь заключается в том 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.
Бруно Броноски
источник
2

Попытайтесь поместить ваш открытый ключ ssh в другой хост просто одной командой

ssh root@example.com 'cat >> .ssh/authorized_keys' < .ssh/id_rsa.pub
pylover
источник
2

Я считаю, что это проще всего, после того, как вы не установили подтверждение пароля между серверами для пользователя, для которого вы запускаете команду:

несжатого

tar cf - . | ssh servername "cd /path-to-dir && tar xf -"

Сжатие на лету

tar czf - . | ssh servername "cd /path-to-dir && tar xzf -"
user60802
источник
Использование сжатия в tar-файле - очень плохая идея, если вы sshуже настроены на сжатие.
Anthon
@Anthon Почему так плохо, и как можно проверить, если ssh-сжатие уже включено?
Том Хейл
1
@TomHale В зависимости от скорости вашей системы, это может замедлить общую работу, так как второе сжатие требует времени, но вряд ли побьет дополнительные байты. Compressionможет быть установлен в любом из файлов конфигурации, быстрая проверка для того, чтобы увидеть, ssh -v localhost exit 2>&1 | fgrep -i compressдает ли какой-либо вывод (AFAIK нет возможности вывести конфигурацию, поскольку ssh прочитал ее).
Антон
tarимеет -C pathфлаг , который работает для обоих cи xкоманд. Вам не нужно вводить отдельную cdкоманду там. (Но хорошо отметить, что вы можете запустить более одной команды.)
Бруно Броноски
@Bruno, -Cрасширение GNU (хотя теперь также поддерживается bsdtar и schily tar)
Стефан