我有一对公钥和私钥,用于~/.ssh
通过 SSH 连接到 GitHub。
为了测试我是否正确设置了 GitHub 的 SSH,我使用了,效果很好。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
从未提升的 shell 中生成的程序会继承关键的环境变量SSH_AUTH_SOCK
,该变量会告诉它与代理通信的套接字的位置。ssh
能够使用代理,这就是您通常使用代理的方式。
su
不取消设置变量。afterssh
能够su
通过变量找到套接字。通常,套接字不能由所有者以外的用户访问,但现在ssh
以 root 身份运行,并且 root 可以访问(几乎)任何文件,无论其权限如何。
sudo
做取消设置变量(默认情况下;参见这和那)。ssh
无法sudo ssh …
找到套接字。就好像代理不在那里一样。ssh
尝试在中的几个默认位置找到正确的私钥~/.ssh
,但现在它会在根目录的主目录中检查,而不是在正确私钥所在的常规用户主目录中检查。
答案2
您可以使用 ssh 的 -i 选项将路径传递给您的身份文件。
ssh user@host -i /path/to/keyfile