Використання вже створеного каналу SSH


50

У мене вже встановлений ssh-зв’язок між двома машинами.

Чи є спосіб відправити команди на віддалену машину зі скрипту оболонки, який запускається на локальній машині, використовуючи вже відкрите з'єднання, і не запускаючи черговий сеанс ssh?

Відповіді:


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.
yankee

22

Цього досить легко досягти, використовуючи інструмент nc та ssh тунелі.

1. Відкритий тунель ssh

У сеансі ssh введіть ~Cновий рядок. Ви отримаєте підказку ssh "service console", яка виглядає приблизно так:

ssh> 

Введіть локальну команду переадресації, щоб відкрити 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.


3
Чудова відповідь. Технічно, щоб потрапити на сервісну консоль, ~персонаж повинен з’явитися після нового рядка, тому LF ~ C, мабуть, краща послідовність.
Олексій

@ Алексіос, правильно.
улідко

Дивовижна хитрість! Для запису, на сторінці ssh man з’являється додаткова інформація про неї (прокрутіть униз до розділу, який називається "ХАРАКТЕРИ ВСЕГО")
Carles Sala

@CarlesSala також добре знати less, що звичайний пейджер за замовчуванням підтримує пошук, який може врятувати вас, якщо ви знаєте свої ключові слова: просто введіть man ssh /ESCAPEі ви там.
ulidtko

@ulidtko впевнений, але, наскільки я знаю, не можна зв’язати команду CLI в коментарі SO, тому я знайшов сторінку html man кращим варіантом ;-)
Carles Sala
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.