Чи можна передавати stdout на одному сервері, щоб stdin на іншому сервері?


74

stdoutна одному сервері CentOS потрібно перенести stdinна інший сервер CentOS. Чи можливо це?

Оновлення

У ScottPack, MikeyB та jofel всі відповіді мають правильну відповідь. Я відповів Скотту за те, що, хоча моє запитання не визначає безпеку як вимогу, завжди приємно бути безпечним. Однак, пропозиції двох інших співпрацівників також спрацюють.


1
Варто зазначити, що (єдиною) головною перевагою не-ssh підходу є швидкість пропускної здатності; якщо ви користуєтеся швидкою мережею і безпека не потрібна, можливо, це зайве незручність введення двох команд у два вікна.
Випадково832

Відповіді:


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

Дуже добре знати. Це добре, якщо фізичному з'єднанню довіряти, як, можливо, резервну мережу або якщо з'єднання вже налаштовано.
Веслі

Або якщо дані все-таки є загальнодоступними.
Семюель Едвін Уорд

1
+1 netcat - це безцінний інструмент, особливо коли у вас не працює сервер ssh.
kwarrick

21

Дуже потужним інструментом для створення одно- та двосторонніх зв’язків є socat. За короткий погляд на можливості, подивіться на приклади у своїй сторінки керівництва .

Він повністю замінює netcatта подібні інструменти та має підтримку шифрованих ssl з'єднань. Для початківців це може бути недостатньо просто, але, принаймні, добре знати, що воно існує.


1
@WesleyDavid: До вашого "Оновлення": Просто для повноти, я додав у свою відповідь, що socat має підтримку SSL, тому шифрування також можливе за допомогою socat. Однак у більшості випадків ssh є кращим і простішим рішенням, тому я також обрав би відповідь ScottPack.
jofel

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-агент моєї робочої станції пересилався, і щоб дистанційно запущений 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

2

Я вважаю це найпростішим, якщо не налаштовувати рукостискання паролем між серверами для користувача, за допомогою якого ви виконуєте команду:

Нестиснений

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

Стиснення на льоту

tar czf - . | ssh servername "cd /path-to-dir && tar xzf -"

Використання стиснення файлу tar - дуже погана ідея, якщо ваш файл sshуже налаштований на стиснення.
Антон

@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)
Stéphane Chazelas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.