Почему бы просто не использовать% 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.

Я хочу разделить соединение с одним и тем же удаленным хостом между всеми сеансами, инициированными одним и тем же локальным пользователем, независимо от удаленного пользователя и удаленного порта. Сокет главного клиента должен находиться под домашним каталогом локального пользователя.


«Я хочу разделить соединение с одним и тем же удаленным хостом между всеми сеансами, инициированными одним и тем же локальным пользователем, независимо от удаленного пользователя и удаленного порта». Краткий ответ: вы не можете . Я добавил своего рода объяснение в своем ответе.
Златовласка

Ответы:


13

«Я думал, что несколько сеансов должны использовать один и тот же сокет для подключения к одному хосту».

Они могут. Тем не менее, обратите внимание, что если вы подключаетесь к хосту через существующее соединение ControlPath, независимо от того, от какого пользователя вы собираетесь войти, вы будете зарегистрированы как исходный пользователь соединения. Например, без установленной связи с «где-то»:

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

Эта сессия Боб @ где-то.

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

Этот сеанс также будет где-то bob @, потому что вы использовали тот же ControlPath и set ControlMaster=no; Если ControlMaster=yesвы войдете в систему как sue, но ssh проигнорирует ваш аргумент ControlPath, как указано в man ssh_config:

Дополнительные сеансы могут подключаться к этому сокету, используя тот же ControlPath с ControlMaster, установленным в «нет» .

Как доказательство этого, если ControlMaster=yesв обоих случаях при выходе из bob сокет ControlPath ~/.ssh/somewhereисчезнет, ​​даже если сеанс sue все еще выполняется, то есть сеанс sue никогда не использовал этот сокет .

Итак, если вы хотите использовать одно и то же соединение, %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 с userB, а оригинал с 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.