Похоже, у меня возникло небольшое расхождение между поведением ssh-agent для двух настроенных мной учетных записей.
Я написал простой скрипт мониторинга для проверки доступности некоторых запущенных у нас виртуальных машин. Я выполнил все тестирование и отладку с помощью своей основной учетной записи доступа. В процессе я сгенерировал пару ключей SSH, запустил ssh-agent и добавил идентификатор к агенту, чтобы скрипт мог подключаться по ssh без необходимости ввода пароля.
Теперь я хотел бы запустить этот скрипт как пользователь учетной записи службы. Я создал учетную запись службы и для генерации ключей временно установил оболочку входа в /bin/bash. Я сгенерировал свои ключи, удалил парольную фразу и добавил идентификатор к агенту.
Похоже, что несоответствие заключается в том, как оболочка подключается к агенту. В моей учетной записи пользователя мне не приходилось перезапускать агент с тех пор, как я начал тестирование (примерно две недели). Но когда я пытаюсь запустить скрипт под учетной записью службы, мне, похоже, приходится каждый раз перезапускать агента, добавлять идентификатор и затем выполнять работу.
В идеале я хотел бы, чтобы агент работал бесконечно и чтобы учетная запись службы автоматически переподключалась к нему всякий раз, когда запускается скрипт, чтобы мне не нужно было управлять процессами внутри скрипта. Я просмотрел конфигурации каждой учетной записи и не нашел никаких различий. Любое понимание было бы очень ценно.
**Изменить: Я забыл указать, что агент работает непрерывно, но процессы оболочки для учетной записи службы, похоже, не используют его, и необходимо запустить новую:
ovmmon 14043 0.0 0.0 53916 204 ? Ss May17 0:00 ssh-agent
ovmmon 14952 0.0 0.0 53916 204 ? Ss May17 0:00 ssh-agent
решение1
Здесь происходит одно из двух:
- SSH-agent на самом деле закрывается, когда вы выходите из системы.
- SSH-agent все еще работает, но вы теряете информацию о его PID и канале
Вы можете проверить, какой из них имеет место, выполнив команду ps -ef и проверив наличие ssh-agent.
Если ssh-agent мертв, вам нужен способ сохранить его живым. Вот три способа сделать это:
- Вы можете запустить ssh-agent из startscript при загрузке сервера и вывести вывод в файл (с соответствующими правами доступа, чтобы предотвратить его несанкционированное использование). Если вы сделаете ключ без пароля, вы также можете добавить ключ из скрипта. (Очевидно, что последняя часть рекомендуется только в том случае, если учетная запись, к которой вы подключаетесь, имеет очень ограниченные права на удаленном сервере). Затем ваш скрипт должен прочитать информацию об агенте SSH из файла, созданного при запуске.
- Используйте экран при входе в учетную запись службы; затем отключитесь от сеанса экрана после запуска агента.
- Используйте nohup при запуске агента.
Если ssh-agent не мертв, но вы потеряли информацию об окружении, убедитесь, что при его запуске он записывает свои переменные окружения в определенный файл. Затем, при входе в систему, пусть ваша оболочка указывает этот файл.
решение2
Если вы используете метод вызова под-оболочки, ssh-agent завершит работу при выходе из оболочки. Если вы используете метод eval, оболочка будет продолжать работать до ручного завершения.
Видеть:http://docstore.mik.ua/orelly/networking_2ndEd/ssh/ch06_03.htm
Конкретно:http://docstore.mik.ua/orelly/networking_2ndEd/ssh/ch06_03.htm#ch06-50031.html
Также я знаю, что при запуске из cron переменные ENV могут вызывать проблемы. Так что это еще одна область для проверки.