Использование уже установленного канала SSH

50

У меня уже установлено соединение SSH между двумя машинами.

Есть ли способ отправить команды на удаленный компьютер из сценария оболочки, который запускается на локальном компьютере, с использованием уже открытого соединения и без запуска другого сеанса SSH?

SWeko
источник

Ответы:

56

Это очень просто с достаточно недавними версиями OpenSSH, если вы планируете заранее.

Откройте мастер-соединение в первый раз. Для последующих подключений маршрутизируйте подчиненные соединения через существующее главное соединение. В ваших ~/.ssh/config, настроить обмен происходит автоматически подключение:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Если вы запустите сеанс ssh с тем же пользователем (пользователь, порт, компьютер), что и с существующим соединением, второй сеанс будет туннелироваться поверх первого. Установка второго соединения не требует новой аутентификации и выполняется очень быстро.

Жиль "ТАК - перестань быть злым"
источник
Похоже, что второй не будет зарегистрирован в / var / log / secure или /var/log/auth.log. Однако будет ли второй зарегистрирован в / var / log / wtmp?
SOUser
@XichenLi /var/log/secureи /var/log/auth.logпротоколировать SSH-соединения; ведомое соединение там не появляется, потому что оно соединяется с существующим соединением. Если ваш сеанс ssh выделяет терминал (то есть ssh somehostбез предоставленной команды или ssh -t), то он (обычно) вошел в систему wtmp, независимо от того, как этот терминал появился (sshd, какой бы метод ни использовался для установления соединения, приложение эмулятора терминала,…)
Жиль "ТАК - перестань быть злым"
2
Вы также можете использовать ControlPersist 600задержку в секундах, в течение которой сокет находится в режиме ожидания, прежде чем он будет автоматически удален. В противном случае он автоматически закроется, когда закончится главное соединение. Это бесполезно для выполнения серии команд удаленно (например, серии команд rsync для разных папок)
2
Если вы не хотите редактировать глобальную конфигурацию, вы также можете использовать параметры -S(указать сокет) и -M(создать главное соединение) клиента SSH.
Янки
22

Этого довольно легко достичь с помощью инструмента nc и туннелей ssh.

1. Откройте туннель SSH

В вашей сессии SSH введите ~Cв новой строке. Вы получите приглашение ssh "service console", которое выглядит следующим образом:

ssh> 

Введите команду local forward, чтобы открыть туннель ssh:

ssh> -L22000:targethost:22001
Forwarding port.

Где targethostнаходится имя хоста или IP-адрес компьютера, к которому вы подключены.

Теперь, предполагая, что сервер ssh на целевой машине не настроен на запрет туннелей, у вас есть желаемая переадресация соединения: sshклиент на вашей машине прослушивает порт 22000 и перенаправляет весь трафик, отправленный ему, на порт 22001 targethost.

2. Запустите сетевой сервер на удаленной машине

Это так же просто, как ввод в уже открытый сеанс ssh следующей команды:

remote$ nc -l localhost 22001 | sh

Это запустит TCP-сервер, прослушивающий порт 22001 - который является целевым портом нашего туннеля ssh - и направит полученные данные (предположительно, команды оболочки) в targethostэкземпляр оболочки.

3. Отправьте ваш сценарий через туннель

local$ cat yourscript.sh | nc localhost 22000

Это отправит тело скрипта в ваш ssh-туннель и в конечном итоге будет выполнено в оболочке на targethost. Вы увидите вывод скрипта в вашем терминале с сессией ssh.


Также отмечу, что туннель ssh (шаг 1.) в этом сценарии не обязателен; Вы также можете открыть сервер и подключиться к нему напрямую через Интернет. Однако вам нужно будет использовать туннель, если целевой хост не может быть достигнут напрямую (например, находится за NAT), или требуется шифрование ssh.

ulidtko
источник
3
Отличный ответ. Технически, чтобы добраться до служебной консоли, ~персонаж должен идти после новой строки, так LF ~ Cчто, вероятно, это лучшая последовательность.
Алексиос
@ Алексиос, правильно.
ulidtko
Удивительный трюк! Для справки, страница ssh man показывает дополнительную информацию об этом (прокрутите вниз до раздела под названием «ESCAPE CHARACTERS»)
Carles Sala
@CarlesSala также полезно знать, что less, стандартный пейджер по умолчанию, поддерживает поиск, который может сэкономить некоторую прокрутку, если вы знаете свои ключевые слова: просто введите man ssh /ESCAPEи вы там.
ulidtko
@ulidtko, конечно, но, насколько я знаю, нельзя связать команду CLI с SO-комментарием, поэтому я нашел более подходящей справочную страницу html ;-)
Carles Sala