Чи можна передавати 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.