У меня уже установлено соединение SSH между двумя машинами.
Есть ли способ отправить команды на удаленный компьютер из сценария оболочки, который запускается на локальном компьютере, с использованием уже открытого соединения и без запуска другого сеанса SSH?
Это очень просто с достаточно недавними версиями 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.
Отличный ответ. Технически, чтобы добраться до служебной консоли, ~персонаж должен идти после новой строки, так LF ~ Cчто, вероятно, это лучшая последовательность.
Алексиос
@ Алексиос, правильно.
ulidtko
Удивительный трюк! Для справки, страница ssh man показывает дополнительную информацию об этом (прокрутите вниз до раздела под названием «ESCAPE CHARACTERS»)
Carles Sala
@CarlesSala также полезно знать, что less, стандартный пейджер по умолчанию, поддерживает поиск, который может сэкономить некоторую прокрутку, если вы знаете свои ключевые слова: просто введите man ssh/ESCAPEи вы там.
ulidtko
@ulidtko, конечно, но, насколько я знаю, нельзя связать команду CLI с SO-комментарием, поэтому я нашел более подходящей справочную страницу html ;-)
/var/log/secure
и/var/log/auth.log
протоколировать SSH-соединения; ведомое соединение там не появляется, потому что оно соединяется с существующим соединением. Если ваш сеанс ssh выделяет терминал (то естьssh somehost
без предоставленной команды илиssh -t
), то он (обычно) вошел в системуwtmp
, независимо от того, как этот терминал появился (sshd, какой бы метод ни использовался для установления соединения, приложение эмулятора терминала,…)ControlPersist 600
задержку в секундах, в течение которой сокет находится в режиме ожидания, прежде чем он будет автоматически удален. В противном случае он автоматически закроется, когда закончится главное соединение. Это бесполезно для выполнения серии команд удаленно (например, серии команд rsync для разных папок)-S
(указать сокет) и-M
(создать главное соединение) клиента SSH.Этого довольно легко достичь с помощью инструмента nc и туннелей ssh.
1. Откройте туннель SSH
В вашей сессии SSH введите ~Cв новой строке. Вы получите приглашение ssh "service console", которое выглядит следующим образом:
Введите команду local forward, чтобы открыть туннель ssh:
Где
targethost
находится имя хоста или IP-адрес компьютера, к которому вы подключены.Теперь, предполагая, что сервер ssh на целевой машине не настроен на запрет туннелей, у вас есть желаемая переадресация соединения:
ssh
клиент на вашей машине прослушивает порт 22000 и перенаправляет весь трафик, отправленный ему, на порт 22001targethost
.2. Запустите сетевой сервер на удаленной машине
Это так же просто, как ввод в уже открытый сеанс ssh следующей команды:
Это запустит TCP-сервер, прослушивающий порт 22001 - который является целевым портом нашего туннеля ssh - и направит полученные данные (предположительно, команды оболочки) в
targethost
экземпляр оболочки.3. Отправьте ваш сценарий через туннель
Это отправит тело скрипта в ваш ssh-туннель и в конечном итоге будет выполнено в оболочке на
targethost
. Вы увидите вывод скрипта в вашем терминале с сессией ssh.Также отмечу, что туннель ssh (шаг 1.) в этом сценарии не обязателен; Вы также можете открыть сервер и подключиться к нему напрямую через Интернет. Однако вам нужно будет использовать туннель, если целевой хост не может быть достигнут напрямую (например, находится за NAT), или требуется шифрование ssh.
источник
~
персонаж должен идти после новой строки, такLF ~ C
что, вероятно, это лучшая последовательность.less
, стандартный пейджер по умолчанию, поддерживает поиск, который может сэкономить некоторую прокрутку, если вы знаете свои ключевые слова: просто введитеman ssh
/ESCAPE
и вы там.