【问题标题】:ssh not working correctly with sudossh 无法与 sudo 一起正常工作
【发布时间】:2015-02-09 16:17:00
【问题描述】:

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

sudo menu.sh

脚本按预期启动,然而,当在脚本中调用 ssh UN@ADDRESS 之类的东西时,known_hosts 文件被放置在 /root/.ssh 目录中,而不是调用脚本的用户帐户!我尝试修改 .profile 以调用“sudo -E menu.sh”和“sudo -H menu.sh”,但两者都未能在调用脚本的用户主目录中创建 known_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 目录变量,为什么我需要以特定用户的身份再次显式调用 sudo 以保留该信息(即使 sudo 被告知要通过/etc/sudoers 文件)。没有线索,但想为遇到它的任何人更新这篇文章,直到找到更好的解决方案。

【问题讨论】:

  • 抱歉,用户主目录中的 .profile 脚本通常不在系统启动时执行。它仅在该用户登录系统时执行(如果有的话)。
  • 感谢您的快速评论 arkascha。该脚本正在按设计加载,因此 .profile 脚本没有任何问题。还有其他想法吗?
  • 我并不是说脚本没有被执行。我只是想指出这个问题是不精确的。关于这个问题:在根主目录中肯定会生成一个 known_hosts 文件,因为它是生成另一个进程的根用户(这里是 ssh 客户端)。那么你为什么声称 sudo 不能正常工作呢?它完全按预期工作。
  • 问题不在于 .profile,而在于 ssh 和 sudo。我将其包括在内是为了提供尽可能多的信息,因为该调用可能需要调整。
  • 当 sudo 被告知要保留调用者的主目录时,为什么会在根的主目录中生成文件?

标签: linux bash shell ssh sudo


【解决方案1】:

关于 OpenSSH,known_hosts 的默认位置是 ~/.ssh/known_hosts。在文件名中扩展“~”时,SSH 不支持 $HOME。它查找用户的实际主目录并使用它。当您以 root 身份运行 ssh 时,无论您将 HOME 设置为什么,它都会解释相对于 root 主目录的路径名。

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

ssh -o UserKnownHostsFile=$HOME/.ssh/known_hosts user@host...

但是,您应该对此进行测试。 SSH 可能会抱怨使用属于另一个用户的文件,如果它必须更新文件,那么该文件可能最终归 root 所有。

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

【讨论】:

  • 在这些技巧之后,我经常遇到文件权限问题。请记住,if ssh 符合该文件仍将由用户 root 创建。因此,普通用户随后的 ssh 调用将无法写入该文件...
  • 感谢肯斯特的回复。问题是这个脚本有几件事需要root权限(因此脚本是通过sudo运行的)。我原以为通过保持某些环境变量完整,脚本中调用的二进制文件将使用该信息而不是提升的帐户信息。到目前为止,我采取的步骤似乎是唯一可行的解​​决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
  • 2020-08-19
  • 2013-02-06
  • 2019-02-02
  • 2021-10-15
  • 2016-07-05
  • 2016-09-13
相关资源
最近更新 更多