Ответы:
Это очень просто с достаточно недавними версиями OpenSSH, если вы планируете заранее.
Откройте мастер-соединение в первый раз. Для последующих подключений маршрутизируйте подчиненные соединения через существующее главное соединение. В ваших ~/.ssh/config, настроить обмен происходит автоматически подключение:
ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r
Если вы запустите сеанс ssh с тем же пользователем (пользователь, порт, компьютер), что и с существующим соединением, второй сеанс будет туннелироваться поверх первого. Установка второго соединения не требует новой аутентификации и выполняется очень быстро.
/var/log/secureи /var/log/auth.logпротоколировать SSH-соединения; ведомое соединение там не появляется, потому что оно соединяется с существующим соединением. Если ваш сеанс ssh выделяет терминал (то есть ssh somehostбез предоставленной команды или ssh -t), то он (обычно) вошел в систему wtmp, независимо от того, как этот терминал появился (sshd, какой бы метод ни использовался для установления соединения, приложение эмулятора терминала,…)
ControlPersist 600задержку в секундах, в течение которой сокет находится в режиме ожидания, прежде чем он будет автоматически удален. В противном случае он автоматически закроется, когда закончится главное соединение. Это бесполезно для выполнения серии команд удаленно (например, серии команд rsync для разных папок)
-S(указать сокет) и -M(создать главное соединение) клиента SSH.
Этого довольно легко достичь с помощью инструмента nc и туннелей ssh.
В вашей сессии SSH введите ~Cв новой строке. Вы получите приглашение ssh "service console", которое выглядит следующим образом:
ssh>
Введите команду local forward, чтобы открыть туннель ssh:
ssh> -L22000:targethost:22001
Forwarding port.
Где targethostнаходится имя хоста или IP-адрес компьютера, к которому вы подключены.
Теперь, предполагая, что сервер ssh на целевой машине не настроен на запрет туннелей, у вас есть желаемая переадресация соединения: sshклиент на вашей машине прослушивает порт 22000 и перенаправляет весь трафик, отправленный ему, на порт 22001 targethost.
Это так же просто, как ввод в уже открытый сеанс ssh следующей команды:
remote$ nc -l localhost 22001 | sh
Это запустит TCP-сервер, прослушивающий порт 22001 - который является целевым портом нашего туннеля ssh - и направит полученные данные (предположительно, команды оболочки) в targethostэкземпляр оболочки.
local$ cat yourscript.sh | nc localhost 22000
Это отправит тело скрипта в ваш ssh-туннель и в конечном итоге будет выполнено в оболочке на targethost. Вы увидите вывод скрипта в вашем терминале с сессией ssh.
Также отмечу, что туннель ssh (шаг 1.) в этом сценарии не обязателен; Вы также можете открыть сервер и подключиться к нему напрямую через Интернет. Однако вам нужно будет использовать туннель, если целевой хост не может быть достигнут напрямую (например, находится за NAT), или требуется шифрование ssh.
~персонаж должен идти после новой строки, так LF ~ Cчто, вероятно, это лучшая последовательность.
less, стандартный пейджер по умолчанию, поддерживает поиск, который может сэкономить некоторую прокрутку, если вы знаете свои ключевые слова: просто введите man ssh /ESCAPEи вы там.