Я могу передать stdout по каналу на одном сервере к stdin на другом сервере?

Можно определить имя сетевых интерфейсов любой через udev (в любой современной системе Linux) или через /etc/network/interfaces на Debian, Ubuntu и других дистрибутивах с помощью ifupdown. Не Теперь покрытия ответа udev; я буду обсуждать ifupdown.

В /etc/network/interfaces, можно использовать mapping директива для предоставления псевдонимов интерфейсу на основе результата выполнения сценария оболочки. Типичное использование для этой функции должно дать интерфейсам различные имена на основе сетевой среды (например. eth0-home и eth0-work) или определять имя интерфейса на основе его характеристик, таких как MAC-адрес. Существует названный сценарий в качестве примера get-mac-address.sh то, что можно использовать для определения имени интерфейса на основе его MAC.

auto eth0 eth1
mapping eth0 eth1
    script /usr/share/doc/ifupdown/examples/get-mac-address.sh
    map 11:22:33:44:55:66 lan
    map AA:BB:CC:DD:EE:FF internet
iface lan inet static
    address 192.168.42.1
    netmask 255.255.255.0
iface internet inet dhcp

Теперь Ваши два сетевых интерфейса называют lan и internet. Если Вы когда-либо заменяете один из них, только необходимо обновить MAC-адрес в том одном месте в /etc/network/interfaces.

76
16.03.2012, 01:10
6 ответов

Это - невозмутимое да.

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

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

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

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

97
27.01.2020, 19:31
  • 1
    Это не вид "необычного внутреннего перенаправления ввода/вывода" - просто простой, скучный регулярный материал. ssh читает из STDIN, точно так же, как любой другой инструмент и передачи это к удаленному процессу. :) –  Daniel Pittman 15.03.2012, 22:06
  • 2
    @DanielPittman: Но это - именно так намного больше забавы звонить, это "представляет себе внутренний" мусор. –  Scott Pack 15.03.2012, 22:07
  • 3
    Точно так же netcat на обоих концах делает для большого простого, легкого канала передачи. tar cf - /path/to/dir | nc 1.2.3.4 5000 на одном сервере, nc -l -p 5000 > backupfile.tar на другом. –  MikeyB 15.03.2012, 22:14
  • 4
    @MikeyB: Положительная сторона. Netcat является протоколом открытого текста так быть осторожным с уязвимыми данными. Я склонен использовать netcat для более определенных вещей как приобретения сетевого диска (крыло dd) по локальной сети и сканированию портов. –  Scott Pack 15.03.2012, 22:23
  • 5
    @MikeyB: Вы люди, что с Вашим полетом и Вашими местами штанов! –  Scott Pack 15.03.2012, 22:49

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

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

На "получателе" (действительно, у Вас будет двухсторонняя связь, но легче думать о нем как это), работайте:

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

И на "отправителе", выполненном:

tar cf - /path/to/dir | nc 1.2.3.4 5000
29
27.01.2020, 19:31
  • 1
    Очень хороший для знания. Это хорошо, если физическому соединению доверяют как, возможно, резервная сеть или если соединение уже туннелировано. –  Wesley 15.03.2012, 23:39
  • 2
    Или если данные - что-то, что это общедоступно так или иначе. –  Samuel Edwin Ward 16.03.2012, 00:24
  • 3
    +1 netcat является неоценимым инструментом, особенно когда у Вас нет ssh выполнения сервера. –  kwarrick 16.03.2012, 01:31

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

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

21
27.01.2020, 19:31
  • 1
    @WesleyDavid: К Вашему "Обновлению": Только для полноты, я добавил к своему ответу, что socat имеет поддержку SSL, таким образом, шифрование с возможным socat, также. Однако ssh в большинстве случаев лучше и более легкое решение, таким образом, я выбрал бы ответ ScottPack's, также. –  jofel 16.03.2012, 01:46

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

(global-set-key "\C-f" 'clear-shell)
Некомпрессированная

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

2
27.01.2020, 19:31

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

ssh root@example.com 'cat >> .ssh/authorized_keys' < .ssh/id_rsa.pub
2
27.01.2020, 19:31

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 .

Однако, когда вы начинаете видеть такую ​​опцию, как Отключить выделение псевдотерминалов. и Принудительное выделение псевдотерминалов. вам может потребоваться немного проб и ошибок. Но, как общее правило , вы не хотите изменять поведение 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.
5
27.01.2020, 19:31

Теги

Похожие вопросы