当我尝试时,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
在远程端查找帐户。