我以 sudo 身份运行我的应用程序,但我需要它根据我当前用户拥有的信息~/.gitconfig
和~/.netrc
文件使用 git pull。如何在不将我的凭据放入 root 用户帐户的情况下执行此操作。
答案1
根据sudo 手册页,更改HOME
环境变量可能是默认行为,但不一定如此。如果HOME
环境变量未更新,您可能只需不更改任何内容,它就会正常工作。检查sudoers 手册页有关sudo
策略的更多信息,包括更新HOME
环境变量。
这个 StackOverflow 问题介绍了如何以编程方式查找用户的主目录。你可以使用这种方法(显然不是使用HOME
环境变量方法,如果被更改sudo
)。请注意,getuid
返回调用进程的“真实”UID,即您想要的用户(geteuid
获取有效的UID,在您的情况下为 root)。然后,您可以找到用户的配置和凭据文件并使用它们,或者可能只是(临时或其他方式)HOME
在调用函数之前编辑进程的环境变量git
。
您也可以让您的程序将配置和/或凭证文件的路径git
作为参数。用户需要手动提供这些参数,但您可以将其传递到git
您的程序中。
重要警告:所有这些建议都基于用户值得信任的假设(即,如果用户可以调用 sudo,他们就可以完全接管系统)。
如果您的程序使用自定义sudo
策略,允许不受信任的用户调用它(或者它本身是 setuid root 并且可由不受信任的用户执行),那么您需要更加小心。例如,想要使用其他用户的git
凭据访问某些内容的不受信任的用户可能会创建指向目标用户的配置/凭据文件的符号链接,然后使用您的程序(或者如果您使用命令行参数方法,可能会传递其他用户的配置文件)。除了“不要以 root 身份运行您的程序”之外,缓解这种威胁的最佳方法是seteuid(getuid())
暂时将您的有效 UID 降低到您用户的真实 UID,这意味着尝试访问其他用户的文件将导致访问被拒绝。如果需要,您可以在之后恢复有效 UID。