Linux ssh不能正确使用sudo

Linux ssh不能正确使用sudo,linux,bash,shell,ssh,sudo,Linux,Bash,Shell,Ssh,Sudo,大家早上好!当系统通过用户主目录中的.profile文件引导时,我有一个bash脚本自动启动: sudo menu.sh 但是,当调用ssh之类的东西时,脚本会像预期的那样启动UN@ADDRESS在脚本内部,已知的_hosts文件被放置在/root/.ssh目录中,而不是调用脚本的用户帐户!我尝试修改.profile以调用'sudo-E menu.sh'和'sudo-H menu.sh',但都无法在调用脚本的用户主目录中创建已知的_hosts文件。我的/etc/sudoers如下所示: # De

大家早上好!当系统通过用户主目录中的.profile文件引导时,我有一个bash脚本自动启动:

sudo menu.sh

但是,当调用ssh之类的东西时,脚本会像预期的那样启动UN@ADDRESS在脚本内部,已知的_hosts文件被放置在/root/.ssh目录中,而不是调用脚本的用户帐户!我尝试修改.profile以调用'sudo-E menu.sh'和'sudo-H menu.sh',但都无法在调用脚本的用户主目录中创建已知的_hosts文件。我的/etc/sudoers如下所示:

# Declarations
Defaults env_keep += "HOME USER"

# User privilege specification
root    ALL=(ALL) ALL
user    ALL=NOPASSWD: ALL
任何帮助都将不胜感激

谢谢 戴夫


更新:所以我所做的工作是遍历脚本并在特定调用之前添加'sudo-u$USER'(因为sudo应该保留$USER env var)。在我看来,这似乎是解决这个问题的一个非常糟糕的方法。如果sudo应该在启动menu.sh时保留USER和HOME directory变量,为什么我需要再次以特定用户的身份显式调用sudo以保留该信息(即使sudo被告知通过/etc/sudoers文件保留该信息)。没有线索,但想为任何遇到它的人更新此帖子,直到找到更好的解决方案。

关于OpenSSH,已知\u主机的默认位置是
~/.ssh/known\u hosts
。在文件名中扩展“~”时,Ssh不支持$HOME。它查找用户的实际主目录并使用它。当您以root用户身份运行ssh时,它将解释相对于root用户主目录的路径名,而不管您将home设置为什么

您可以尝试将ssh参数
UserKnownHostsFile
设置为要使用的文件名:

ssh -o UserKnownHostsFile=$HOME/.ssh/known_hosts user@host...
但是,您应该对此进行测试。Ssh可能会抱怨使用了属于另一个用户的文件,如果它必须更新该文件,则该文件可能最终归root所有


实际上,您最好以希望ssh使用其
.ssh
文件夹的用户身份运行ssh。通过
sudo
运行进程会产生一种风险,即用户可能会找到一种方法来做您不希望他们做的事情。您应该尽可能少地使用提升的权限来限制这种风险。

对不起,在系统启动时,通常不会执行用户主目录中的.profile脚本。它只在用户登录系统时执行(如果有的话)。感谢arkascha的快速评论。脚本正在按设计加载,因此.profile脚本没有任何问题。还有其他想法吗?我不是说脚本没有执行。我只是想指出这个问题并不精确。关于这个问题:当然,在根主目录中会生成一个已知的_hosts文件,因为生成另一个进程的是根用户(这里是ssh客户机)。那你为什么说sudo不能正常工作呢?问题不是关于.profile,而是关于ssh和sudo。我加入了这个选项,以便在调用可能需要调整时提供尽可能多的信息。当sudo被告知保留调用方的主目录时,为什么会在根目录中生成文件?在这些技巧之后,我经常遇到文件权限问题。请记住,如果ssh符合要求,文件仍将由root用户创建。因此,普通用户的后续ssh调用将无法写入该文件…感谢Kenster的回复。问题是这个脚本有几个需要root权限的操作(因此脚本是通过sudo运行的)。我认为,通过保持某些env变量的完整性,脚本中被调用的二进制文件将使用该信息,而不是提升的帐户信息。到目前为止,我采取的措施似乎是唯一可行的解决办法。