Timmmm Asked: 2018-09-20 07:15:54 +0800 CST2018-09-20 07:15:54 +0800 CST 2018-09-20 07:15:54 +0800 CST 为什么 ssh 在使用 sudo 运行时会在 /root/.ssh 中查找密钥? 772 当我尝试sudo ssh ...获取权限时,因为ssh查找/root/.ssh密钥,而不是在/home/me/.ssh. 但$HOME仍设置为/home/me。为什么不ssh进去看$HOME/.ssh? ssh sudo 2 个回答 Voted Best Answer Stéphane Chazelas 2018-09-20T08:29:43+08:002018-09-20T08:29:43+08:00 ssh忽略$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 ... 或者 sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" ssh ... 另外,您确定需要以sshroot身份运行吗?是否能够在低于 1024 的 TCP 端口上创建隧道或绑定本地端口转发?如果只是为了能够root在远程主机上登录,那么做ssh root@host就足够了。 ¹您实际上可以将真实的 uid 恢复到我们原来的,同时保留 0 的有效 uid: sudo perl -e '$<=getpwnam($ENV{SUDO_USER}); exec@ARGV' ssh ... RudiC 2018-09-20T07:37:25+08:002018-09-20T07:37:25+08:00 虽然sudo允许您“以其他用户身份执行命令”(man sudo),但如果缺少,它将使用“默认目标用户(通常是 root)”。这就是为什么它将root在远程端查找帐户的原因。
ssh
忽略$HOME
,它根据真正的¹ uid 从用户数据库中获取主目录(使用由pw_dir
返回的结构的字段getpwuid()
)。鉴于
ssh
可以像这样在其中写入文件,known_hosts
因此它不会在其中执行操作,/home/me/.ssh
因为您最终会在那里获得一个根拥有的文件。您始终可以使用
sudo ssh -i ~/.ssh/id_rsa ...
,或使用身份验证代理,并确保将套接字的路径传递给该身份验证代理到 root:或者
另外,您确定需要以
ssh
root身份运行吗?是否能够在低于 1024 的 TCP 端口上创建隧道或绑定本地端口转发?如果只是为了能够root
在远程主机上登录,那么做ssh root@host
就足够了。¹您实际上可以将真实的 uid 恢复到我们原来的,同时保留 0 的有效 uid:
虽然
sudo
允许您“以其他用户身份执行命令”(man sudo
),但如果缺少,它将使用“默认目标用户(通常是 root)”。这就是为什么它将root
在远程端查找帐户的原因。