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

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

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

答案1

ssh忽略$HOME,它根据用户数据库获取主目录真实的1 uid(使用pw_dir返回的结构体字段getpwuid())。

考虑到ssh可以像上面那样在其中写入文件known_hosts,所以最好不要这样做,因为/home/me/.ssh您最终会在那里得到一个 root 拥有的文件。

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

sudo --preserve-env=SSH_AUTH_SOCK ssh ...

或者

sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" ssh ...

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


1 您实际上可以将真实 uid 恢复为原始 uid,同时保留有效 uid 0:

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

答案2

虽然sudo允许您“以另一个用户身份执行命令”( man sudo),但如果缺少,它将使用“默认目标用户(通常是 root)”。这就是为什么它会root在远程端查找帐户。

相关内容