stdout
на одном сервере CentOS необходимо подключить к stdin
другому серверу CentOS. Это возможно?
Обновить
ScottPack, MikeyB и Jofel имеют правильные ответы. Я присудил ответ Скотту, потому что, хотя в моем вопросе безопасность не указывалось как требование, всегда приятно быть в безопасности. Тем не менее, предложения двух других стипендиатов также будут работать.
Ответы:
Это беззастенчивое да.
Когда кто-то использует
ssh
команду на удаленном сервере, он выполняет какое-то причудливое внутреннее перенаправление ввода / вывода. На самом деле, я считаю, что это одна из едва заметных особенностей OpenSSH. В частности, если вы используетеssh
для выполнения произвольной команды на удаленной системе, то SSH будет отображатьSTDIN
иSTDOUT
к тому , что команды выполняется.В качестве примера, давайте предположим, что вы хотите создать резервный архив, но не хотите или не можете хранить его локально. Давайте рассмотрим этот синтаксис:
Мы создаем тарбол и пишем его
STDOUT
обычным вещам. Поскольку мы используем ssh для выполнения удаленной команды, STDIN отображается вSTDIN
офcat
. Который мы затем перенаправить в файл.источник
netcat
на обоих концах создается отличный простой и легкий канал связи.tar cf - /path/to/dir | nc 1.2.3.4 5000
на одном сервере,nc -l -p 5000 > backupfile.tar
на другом.На
netcat
обоих концах соединения используется удобный способ передачи данных между узлами, когда вам не нужно беспокоиться о безопасности по проводам .Это также позволяет вам устанавливать их асинхронно:
На «приемнике» (действительно, вы будете иметь двустороннюю связь, но об этом проще думать так), запустите:
И на «отправителя» запустите:
источник
Очень мощный инструмент для создания однонаправленных и двунаправленных соединений
socat
. Для краткого обзора возможностей, посмотрите на примеры в его man-странице .Он полностью заменяет
netcat
аналогичные инструменты и поддерживает зашифрованные соединения ssl. Для начинающих это может быть не так просто, но, по крайней мере, полезно знать, что оно существует.источник
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
флага заставляют некоторые трудно отследить повреждение данных, когда я пытаюсь сделать что-то вроде этого:источник
Попытайтесь поместить ваш открытый ключ ssh в другой хост просто одной командой
источник
Я считаю, что это проще всего, после того, как вы не установили подтверждение пароля между серверами для пользователя, для которого вы запускаете команду:
несжатого
Сжатие на лету
источник
ssh
уже настроены на сжатие.Compression
может быть установлен в любом из файлов конфигурации, быстрая проверка для того, чтобы увидеть,ssh -v localhost exit 2>&1 | fgrep -i compress
дает ли какой-либо вывод (AFAIK нет возможности вывести конфигурацию, поскольку ssh прочитал ее).tar
имеет-C path
флаг , который работает для обоихc
иx
команд. Вам не нужно вводить отдельнуюcd
команду там. (Но хорошо отметить, что вы можете запустить более одной команды.)-C
расширение GNU (хотя теперь также поддерживается bsdtar и schily tar)