
У меня есть пара открытого и закрытого ключей, которая ~/.ssh
используется для SSH-подключения к GitHub.
Чтобы проверить, правильно ли я настроил SSH с GitHub, я использовал , и это отлично работает.ssh -T [email protected]
Кроме того, если я выполняю указанную выше команду как суперпользователь, то она работает нормально.
su
ssh -T [email protected]
Однако, когда я использую sudo, команда не работает. Я подозреваю, что она не может получить доступ к паре ключей, хранящейся в ~/.ssh
при запуске сsudo
Приведенная ниже команда не выполняется.
sudo ssh -T [email protected]
Вы можете легко воспроизвести проблему с любым дистрибутивом Ubuntu иэтотСтраница помощи GitHub.
Редактировать:
Я понимаю, что могу передать закрытый ключ следующим ssh
образом:
ssh -i <path-to-private-key> -T [email protected]
Мне просто интересно, почему использование делает закрытый ключ недоступным.sudo ssh -T [email protected]
решение1
Гипотеза: для вашего обычного пользователя запущен агент аутентификации, и у агента есть ключ.
ssh
созданная из оболочки без повышенных привилегий, наследует важную переменную среды SSH_AUTH_SOCK
, которая сообщает ей местоположение сокета для связи с агентом. ssh
может использовать агент, именно так вы обычно используете агент.
su
не сбрасывает переменную. ssh
after su
может найти сокет благодаря переменной. Обычно сокет недоступен для пользователей, отличных от владельца, но теперь ssh
запускается как root, и root может получить доступ (почти) к любому файлу независимо от его разрешений.
sudo
делаетсбросить переменную (по умолчанию; см.этотичто). ssh
in sudo ssh …
не может найти сокет. Как будто агента там не было. ssh
пытается найти правильный закрытый ключ в нескольких местах по умолчанию в ~/.ssh
, но теперь он проверяет домашний каталог root, а не домашний каталог вашего обычного пользователя, где находится правильный закрытый ключ.
решение2
Путь к файлу идентификации можно передать с помощью параметра -i для ssh.
ssh user@host -i /path/to/keyfile