Един в двух лицах
Oct. 7th, 2020 11:20 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Наткнулся на засаду в своей технологии подцепления свежего ssh-agent-а при коннекте к скрину, которая у меня тут обсуждалась. Пока сидел на удаленке в деревне, проблем не было.
А как приехал домой и рядом с десктопом открыл ноутбук, тут-то оно и вылезло.
Как оказалось, предлагаемое мной решение перебивает агента от предыдуших сессий агентом от последней сессии. И если эта сессия закрылась раньше предыдущих, агент пропадает совсем.
Когда речь идет о нескольких ssh-сессиях внутрь одного screen проблемы нет - ну открыл еще одну, новую ssh-сессию. Десктопная-то сессия, к которой у тебя привязан агент, одна и та же все равно.
А тут есть две десктопные сессии - на ноутбуке и на десктопе, и если зачем-то заходишь на десктоп с ноутбука (ну скажем посмотреть куда оттуда файлы копировать) то после закрытия этой сессии, всем ssh открытым на десктопе, становится плохо. Вплоть до того, что закрытие лоскального скрина не помогает заново прицепиться к локальному агенту. А вот десктопную сессию целиком закрывать и переоткрывать жалко. Там кроме скрина с удаленными ssh-сессиями еще браузер с вкладками, мессенджеры всякие и т.д.
Уточняю постановку задачи - некоторое время назад мне удалось добиться, чтобы по умолчанию любая консольная программа у меня запускалась внутри мультиплексора терминалов, независимо от того, локально или по ssh я ее запускаю.
То есть для того чтобы открыть xterm, который тут же при старте не приаттачится к запущенному screen, нужно было специально об этом задуматься и залезть глубоко в меню. Ну а чтобы по ssh зайти и не приаттачиться к тамошнему скрину - такой вариант вообще не предусмотрен. Потому что связь может оборваться в любой момент, и обрыв связи - не повод прерывать компиляцию или тесты.
При этом предусмотрено то, что далеко не на все машины куда я могу зайти по ssh, я могу зайти снаружи, не зайдя предварительно на какую-нибудь другую из машин в той же локальной сети. Ну и scp или rsync я постоянно пользуюсь, поэтому в любой сессии должен быть доступен ssh-agent. То что агент не доступен, если меня нет за экраном - это не баг а фича. Но если я зашел на машину, мой агент должен быть со всех уже работющих на ней консольных сессий доступен.
Поэтому когда я захожу на машину по ssh, последняя вновь созданная сессия перенаправляет симлинк, на который указывает SSH_AUTH_SOCK всех сессий в скрине этой машины, на свой сокет. В случае пока я в каждый конкретный момент хожу с одного компьютера - это работает. Еслип вдруг у меня оказывается несколько одновременных сессий с разными работающими агентами, начинаются чудеса. Еще чудеса начинаются если организовать цикл из ssh-соединений. Но это пока не уперлось.
Пока приходит в голову следующее решение - прежде чем переназначать общий для всех сессий на данной машине симлинк, проверить, а слушает ли тот сокет, на который он сейчас указывает, какой-то агент, и переназначать к себе, только если агента там нет. (причем, естественно, в GUI-шных сессиях этого не делать).
no subject
Date: 2020-10-07 09:46 am (UTC)Зайди на десктопе по ssh на него же самого.
no subject
Date: 2020-10-07 10:45 am (UTC)Не пустят. Поскольку в локальном скрине агент уже потерян. Нужно тогда открыть эмулятор терминала без приконнекчивания к скрину.
no subject
Date: 2020-10-07 06:42 pm (UTC)no subject
Date: 2020-10-08 04:31 am (UTC)На самом деле решение - открыть терминал без скрина, и в нем выполнить .profile. После чего этот терминал можно закрыть. Симлинк уже подправится и будет показывать на сокет локального агента.
no subject
Date: 2020-10-07 01:32 pm (UTC)и поэкспериментируйте с другими (кстати, более лёгкими и
более простыми) программами, вроде 'dvtm' с дополнениями
к ней (напр, 'dtach' и 'abduco') - были живы несколько
лет назад, не проверял с 2016го.
no subject
Date: 2020-10-07 02:08 pm (UTC)Боюсь что не спасет. Поскольку в отношении взаимодейстсвия с ssh-agent-ом scren - простая программа.
Он не делает с ним ничего. И все проблемы - в моей собственной скриптовой обвязке, которая будет такой же при использовании любого другого мультиплексора терминалов.
И проблема тут вполне содержательная - как определить что та сессия, на сокет от которой сейчас указывает SSH_AUTH_SOCK, еще жива, и надо или не надо перенаправлять запросы на авторизацию на агент вновь открываемой сессии.
Дополнительный вопрос - что делать если мы закрыли ту сессию, куда перенаправлись запрсоы к агенту, а десять других остались открытыми - как сделать чтобы запросы к агентам теперь шли в какую-нибудь из них.
no subject
Date: 2020-10-07 08:07 pm (UTC)no subject
Date: 2020-10-07 09:06 pm (UTC)С весьма высокой вероятностью для него понятие "живой" не совпадает с тем, что нужно мне.
Например, пошел я с машины A на машиуну Б, а потом на машине А закрыл на ней десктопную сессию.
С точки зрения мультиплексора терминалов на машине Б, сессия - живая. Потому что ssh на машине A продолжает быть запущен - в тамошнем мультиплексоре.
Но агента у него уже нет, он накрылся вместе с десктопной сессией.
no subject
Date: 2020-10-08 02:42 am (UTC)Если есть где-то руководство по приготовлению - будет интересно посмотреть.
PS. screen это не только ценный мех, но и возможность потыкать последовательные устройства. (Да, я знаю про minicom).
PPS. Разница в размере - 80кб против 450кб (не считая библиотек), имхо, на современных устройствах (если это не роутер) - не критично. А с учётом использования не только у себя, но и на машинах где доступ есть, а админских прав может не быть - всё равно двойной набор навыков держать в голове придётся. Но надо будет посмотреть ещё раз.