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