Чому б просто не використовувати% h у варіанті ControlPath OpenSSH ssh?


13

Чому «ssh_config (5)» сторінка керівництва рекомендують ControlPathваріант повинен містити , по крайней мере %h, %pі %rнаповнювачі для того , щоб однозначно ідентифікувати кожну загальну зв'язок?

Я думав, що кілька сеансів повинні спільно використовувати один і той же сокет із з'єднанням з одним і тим же хостом. Чи не має сенсу тоді мати просте визначення, наприклад:

ControlPath ~/.cache/ssh/mux/%h

Замість чогось такого:

ControlPath ~/.cache/ssh/mux/%r@%h:%p

Наскільки я розумію, з першого визначення одне з'єднання поділяється між декількома сеансами з різними віддаленими користувачами, до одного і того ж віддаленого хоста, на різних віддалених портах.

Я хочу мати перше визначення в розділі за замовчуванням хосту, щоб його було достатньо сказати ssh -o ControlMaster=no.

Я хочу поділитися з’єднанням з тим самим віддаленим хостом між усіма сеансами, ініційованими тим самим локальним користувачем, незалежно від віддаленого користувача та віддаленого порту. Розетка головного клієнта повинна міститись під домашнім каталогом користувача.


"Я хочу поділитися з’єднанням з тим самим віддаленим хостом між усіма сеансами, ініційованими тим самим локальним користувачем, незалежно від віддаленого користувача та віддаленого порту." Коротка відповідь: не можна . У свою відповідь я додав свого роду пояснення.
goldilocks

Відповіді:


13

"Я думав, що кілька сеансів повинні спільно використовувати один і той же сокет із з'єднанням з тим самим хостом."

Вони можуть. Однак зауважте, що якщо ви підключитесь до хоста за допомогою наявного з'єднання через ControlPathнезалежно від того, якого користувача ви маєте намір увійти в систему, ви ввійдете в систему як початковий користувач з'єднання. Наприклад, без встановленого зв'язку "десь":

ssh -o ControlPath=~/.ssh/%h -o ControlMaster=yes bob@somewhere

Цей сеанс десь bob @.

ssh -o ControlPath=~/.ssh/%h -o ControlMaster=no sue@somewhere

Цей сеанс також буде bob @ десь, тому що ви використовували той самий ControlPath і встановлений ControlMaster=no; якщо ControlMaster=yes, ви ввійдете в систему як sue, але ssh проігнорував ваш аргумент ControlPath, як мається на увазі в man ssh_config:

Додаткові сеанси можуть підключатися до цього сокета за допомогою того ж ControlPath з ControlMaster, встановленого на "ні" .

Як доказ цього, якщо ControlMaster=yesв обох випадках, коли bob виходить з сокета ControlPath ~/.ssh/somewhere, зникне, навіть якщо сесія "подати позов" все ще працює, тобто сесія позову ніколи не використовувала цей сокет .

Отже, якщо ви хочете використовувати одне і те ж з'єднання, це просто %hдобре, але будьте обережні, що ви не можете поділитися з’єднанням як кілька різних віддалених користувачів - ssh не дозволить вам.


Дуже дякую. Перед вашою детальною відповіддю я пропустив факт, що неможливо поділити головний сокет клієнта між різними віддаленими користувачами, не в той же час, коли другий віддалений користувач припустить особу першого.
Тім Фріске

5

Ви можете мати декілька користувачів і кілька портів, які використовуються навіть для одного сервера. Сам я підключаюсь до сотень систем на інтрамережі компанії, у більшості є декілька користувачів з різними функціями або сервери додатків. Доступ до userA дуже різний для доступу до userB, і головне з'єднання повинно бути іншим. Більш лаконічно, якби ви бігали:

$ ssh -n -o ControlMaster=auto -o ControlPath=~/.cache/ssh/mux/%h -l userA localhost sleep 10 & # create the master connection and background it
$ ssh -o ControlMaster=auto -o ControlPath=~/.cache/ssh/mux/%h -l userB localhost whoami
userA

Як бачите, ми отримуємо не сеанс OpenSSH з користувачемB, а оригінал з userA. Це означає, що домашній каталог, дозволи та навіть сама автентифікація - це не те, що очікується. Використовуючи це, якщо ви намагалися видалити файл у довіднику userB, то а) це може бути файл помилковий і б) це можуть бути неправильні дозволи.

Якщо ви ніколи не будете підключатися до більш ніж одного користувача на будь-якому одному сервері за допомогою одного порту, то так, використання %hможе бути достатньо. У вашому ~/.ssh/configфайлі ви хочете використовувати:

ControlMaster=auto  # use existing or create a master connection
ControlPath=~/.cache/ssh/mux/%h
ControlPersist=yes

З цією ControlPersistопцією, головне з'єднання залишається відкритим у фоновому режимі, поки не буде вбито чи не припинено ssh -O exit. Це хороша функція встановити і забути.

Але якщо є будь-яка можливість підключення до більш ніж одному користувачеві на будь-який хост, то ви хочете що - то більш безпечним:

ControlMaster=auto
ControlPath=~/.cache/ssh/mux/%r@%h:%p
ControlPersist=yes

Я все ще плутаюсь. Я спробував уточнити сценарій конфігурації та мій намір в параграфах "Я хочу". Чи може хтось із вас відповісти на моє запитання точніше за допомогою цієї додаткової інформації?
Тім Фріске
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.