是否有可能在使用 sudo 命令时应该首先获取文件?

Posted

技术标签:

【中文标题】是否有可能在使用 sudo 命令时应该首先获取文件?【英文标题】:Is it possible that when using sudo command it should first source a file? 【发布时间】:2015-07-17 19:43:13 【问题描述】:

我需要运行一堆脚本(使用 sudo),它们使用单​​个 file.sh 作为所有人的配置文件。最初我将 file.sh 放在 /etc/profile.d 中,当我以 root 身份运行脚本时,一切正常(因为当我连接到机器时,它首先获取了 file.sh 并且该文件中的所有变量都可用) 但现在,出于安全原因,我需要与另一个具有 sudo 权限的用户一起运行它们。

使用 sudo 运行时,即使我是 root 并执行 sudo,/etc/profile.d 中的“配置文件”也不会被获取 - 它是一样的。

使用“sudo -E”不是一个选项,这种解决方案“Defaults env_keep +=”ftp_proxy http_proxy https_proxy no_proxy”对我不起作用,因为文件中的变量变化很大,而且更容易抛出一个包含所有变量的文件,位于某个位置(例如 /etc/profile.d/),而不是向 /etc/sudoers 添加选项。

后期编辑(工作):

将原始 sudo 命令移至 sudo.orig。创建了一个新的 sudo bash 脚本

[root@NS1 bin]# cat sudo
#!/bin/bash
source /etc/profile.d/set_env_vmdeploy.sh
sh /usr/bin/sudo.orig "$@"

并授予它权限

[root@NS1 bin]# chmod 4111 sudo
[root@NS1 bin]# ll sudo*
---s--x--x 1 root root     78 May  7 13:42 sudo
---s--x--x 1 root root 123832 Jul 31  2014 sudo.orig

【问题讨论】:

你的意思是than to modify other files 吗? 我不明白你的问题。当我运行“sudo some_script.sh”时,我需要一些存储在 file.sh 中的变量来获取/可用。 所以你的意思是then?对不起,只是人们互换使用它们,它完全改变了句子的含义。 我想你可以在 sudo 周围加上一个包装器... ***.com/questions/24200924/… 您没有将参数从包装器传递到原始... exec /usr/bin/sudo.orig "$@" 【参考方案1】:

如果您希望sudo 执行子 shell 中的所有配置文件脚本,您可以告诉它调用 shell 作为登录 shell:sudo -i /usr/local/bin/my_script.sh。 (请注意,子 shell 将从设置为 /root 的工作目录开始,并且这可能会产生其他意想不到的副作用。)

或者,使用命令参数显式调用 bash:sudo /bin/bash -c "source ./config.sh; ./real_script.sh"

【讨论】:

我需要的是@Mark Setchell 的建议 我会说我建议的方法比重命名 sudo 可执行文件要干净得多——除此之外,它不会在您下次执行覆盖您的 sudo 二进制文件的 apt/yum 更新时中断。 我同意你的观点,但对于我需要的(数十个 shell 命令),它比通过在末尾添加内容来修改所有命令更容易。我正在使用 ansible 运行 sudo - 因此,为每个 shell 命令添加 -c "source /file.sh" 对于我来说,为这种特定情况实施您的解决方案将是一项繁重的工作。谢谢

以上是关于是否有可能在使用 sudo 命令时应该首先获取文件?的主要内容,如果未能解决你的问题,请参考以下文章

sudo和root权限有啥区别,为啥有的命令sudo无法执行,只能root执行?

使用sudo命令时出现如下错误,为啥应当如何处理

sudo命令背后你所不知道的秘密

su和sudo命令详解

cygwin输入 ls命令为啥总是返回命令找不到

CentOS7--su和sudo