使用 sudo 运行时获取 shell 脚本

Posted

技术标签:

【中文标题】使用 sudo 运行时获取 shell 脚本【英文标题】:Sourcing a shell script, while running with sudo 【发布时间】:2011-06-05 04:56:26 【问题描述】:

我想编写一个 shell 脚本来设置一个 mercurial 存储库,并允许组中的所有用户 “开发者”来执行这个脚本。

脚本归用户“hg”所有,运行时运行良好。当我尝试运行它时问题就来了 对于另一个使用 sudo 的用户,当它尝试获取另一个文件时,执行会因“权限被拒绝”错误而停止。

有问题的脚本文件:

create_repo.sh

#!/bin/bash

source colors.sh

REPOROOT="/srv/repository/mercurial/"
... rest of the script ....

create_repo.sh 和 colors.sh 的权限:

-rwxr--r-- 1 hg hg  551 2011-01-07 10:20 colors.sh
-rwxr--r-- 1 hg hg 1137 2011-01-07 11:08 create_repo.sh

Sudoers 设置:

%developer ALL = (hg) NOPASSWD: /home/hg/scripts/create_repo.sh

我正在尝试运行的内容:

user@nebu:~$ id
uid=1000(user) gid=1000(user) groups=4(adm),20(dialout),24(cdrom),46(plugdev),105(lpadmin),113(sambashare),116(admin),1000(user),1001(developer)

user@nebu:~$ sudo -l
Matching Defaults entries for user on this host:
    env_reset

User user may run the following commands on this host:
    (ALL) ALL
    (hg) NOPASSWD: /home/hg/scripts/create_repo.sh

user@nebu:~$ sudo -u hg /home/hg/scripts/create_repo.sh
/home/hg/scripts/create_repo.sh: line 3: colors.sh: Permission denied

因此脚本被执行,但在尝试包含其他脚本时停止。

我也尝试过使用:

user@nebu:~$ sudo -u hg /bin/bash /home/hg/scripts/create_repo.sh

结果相同。

如果脚本可以由不同的用户通过 sudo 运行,那么包含另一个 shell 脚本的正确方法是什么?

【问题讨论】:

您的权限看起来不对。脚本应该可供有权阅读的每个人执行。如果一个脚本只是被获取而不被执行,它不应该是可执行的:chmod a+x create_repo.sh; chmod a-x colors.sh ''create_repo.sh'' 没有 ''a+x'' 的原因是因为它打算使用 ''sudo -u hg'' 运行。 colors.sh 没有为其他人设置 exec 位,不需要删除它。 【参考方案1】:

可能发生的情况是脚本尝试 source 当前目录中的文件 colors.sh 并失败,因为它由于 sudo 而没有读取当前目录的权限。

尝试使用source /home/hg/scripts/colors.sh

【讨论】:

看准了!将其替换为 $(dirname $0)/colors.sh。谢谢。

以上是关于使用 sudo 运行时获取 shell 脚本的主要内容,如果未能解决你的问题,请参考以下文章

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

如何从需要SUDO的php调用shell脚本?

如何从需要 SUDO 的 php 调用 shell 脚本?

运行自己的shell脚本

调用 aws cli 的用户数据脚本

简化bash脚本,以sudo身份运行时从命令中提取第一个单词