Я использую следующие параметры в своем ~/.ssh/config
для включения мультиплексирования соединений:
ControlMaster auto
ControlPath ~/.ssh/control/master-%r@%h:%p
Однако в этом есть неприятная проблема, заключающаяся в том, что первая оболочка, подключающаяся к определенному серверу, должна отключаться последней, потому что это главное соединение, которое используют все остальные соединения. Так что, если вы выйдете из мастера, он просто зависнет. Чтобы решить эту проблему, я хотел бы обернуть ssh сценарием, который проверяет, существует ли главный управляющий файл, а если нет, запускает основной процесс ssh в фоновом режиме. Затем он запустит подчиненный сеанс ssh.
Для этого мой сценарий должен определить путь к управляющему файлу, который будет использовать ssh. Это повлечет за собой анализ параметров командной строки ssh и файлов конфигурации и реализацию логики для определения ControlPath. Есть ли способ просто спросить ssh, какой путь он будет использовать, чтобы я мог его проверить?
Только что нашел. ssh -O check HOST
Из моих тестов принятый ответ:
ssh -O check HOST
предоставит контрольный файл только в том случае, если он не завершится
Control socket connect(<path to control file>): No such file or directory
в противном случае
Master running (pid=<number>)
Однако grep и ssh -G
всегда укажет тебе путь.
-G Заставляет ssh распечатать свою конфигурацию после оценки блоков Host и Match и выхода.
>>> ssh -G HOST | grep controlpath
controlpath <path to control file>
Примечание: если вы используете %l
или %C
(например) в файле конфигурации ssh это будет оцениваться для локальной машины.