为什么 ssh 在使用 sudo 运行时会在 /root/.ssh 中查找密钥?

Tim*_*mmm 2 ssh sudo

当我尝试sudo ssh ...我的权限被拒绝时,因为ssh查找/root/.ssh密钥,而不是在/home/me/.ssh. 但$HOME仍然设置为/home/me. 为什么不ssh进去看$HOME/.ssh

Sté*_*las 5

sshignores $HOME,它根据真实的¹ uid(使用由pw_dir返回的结构的字段getpwuid())从用户数据库中获取主目录。

鉴于ssh可以像那样在那里写入文件known_hosts,它不这样做也好,/home/me/.ssh因为你最终会在那里得到一个根拥有的文件。

您始终可以使用sudo ssh -i ~/.ssh/id_rsa ...,或使用身份验证代理,并确保将套接字的路径传递给该身份验证代理到 root:

sudo --preserve-env=SSH_AUTH_SOCK ssh ...
Run Code Online (Sandbox Code Playgroud)

或者

sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" ssh ...
Run Code Online (Sandbox Code Playgroud)

另外,您确定需要以sshroot身份运行吗?是否能够在 1024 以下的 TCP 端口上创建隧道或绑定本地端口转发?如果只是为了能够root在远程主机上登录,这样做ssh root@host就足够了。


¹您实际上可以将真实的 uid 恢复到我们原来的 uid,同时保留 0 的有效 uid:

sudo perl -e '$<=getpwnam($ENV{SUDO_USER}); exec@ARGV' ssh ...
Run Code Online (Sandbox Code Playgroud)