以不同用户身份运行 shell 脚本的好方法是什么?我正在使用 Debian etch,并且我知道我想模拟哪个用户。
如果我手动进行,我会这样做:
su postgres
./backup_db.sh /tmp/test
exit
Run Code Online (Sandbox Code Playgroud)
由于我想自动化该过程,因此我需要一种将 backup_db.sh 作为 postgres 运行的方法(继承环境等)
谢谢!
谁能帮我找出这里发生了什么?我有一些设置跟踪数据包计数的规则。当我以 root 身份运行以下脚本时:
#!/bin/bash
iptables -t mangle -xnvL
Run Code Online (Sandbox Code Playgroud)
我得到我期望的输出:
//snip
233203 199929802 MARK //blah blah blah
//snip
Run Code Online (Sandbox Code Playgroud)
但是,我想将它作为 cacti 的一部分运行,它作为 apache 运行。现在apache不能运行iptables,这就是我有脚本的原因。我将其设置为 SUID 根:
-rwsr-sr-x 1 root root 37 May 14 23:06 iptables_packet_report.sh
Run Code Online (Sandbox Code Playgroud)
但是后来我得到了这个输出:
server # sudo -u apache ./iptables_packet_report.sh
iptables v1.4.2: can't initialize iptables table `mangle': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
Run Code Online (Sandbox Code Playgroud)
显然我的内核很好,而且我以非 root 用户身份运行它的事实搞砸了一些事情,但我不明白为什么。我确实用 [演示]( http://en.wikipedia.org/wiki/Setuid#Demonstration )仔细检查了 SUID并确认它正在工作。
server # sudo -u apache …Run Code Online (Sandbox Code Playgroud) 我们公司的服务器运行 Ubuntu 12.04 (Precise) 和 Apache 2。我们安装了一个自定义的内部 Web 应用程序。我有一个 bash 脚本,可以将该应用程序的任何更新从源代码管理拉到服务器。系统上只有一个用户(脚本文件的所有者)拥有连接到源代码管理所需的 SSH 密钥,但我希望系统上的任何用户都能够运行此脚本来更新应用程序。
我做了一些研究,看起来这正是设计 setuid 位的目的,以便系统上的任何用户都可以运行脚本,并且脚本将使用脚本所有者的用户 ID 运行. 然而,现代发行版似乎忽略了脚本的 setuid 位,因为如果执行由 root 拥有的脚本会带来安全风险。
我以为我可以通过将它变成一个 perl 脚本来解决这个问题,但是从 Precise 开始,也不再有 suid-perl 包了。看起来这已被弃用。
我发现一些网站建议通过将用户添加到 sudoers 文件来解决这个问题,但是我的脚本不需要 root 权限来运行,并且它不会对文件系统的任何部分进行任何更改,除了网站,所以我宁愿不授予任何人 sudoer 权限。该脚本只需要脚本所有者的权限才能正常运行。
那么,使用(不同的、非 root、非 sudo)用户的 UID 执行脚本的首选现代方法是什么?
Nagios 有一个插件,check_dhcp它完全符合您的想法。它的广泛建议进行安装setuid root的,因为它使用了SO_BINDTODEVICE,通常只有root可以做到。当然也可以完成类似的事情sudo,但它仍然check_dhcp会在不需要 root 权限时以整个 root 权限执行。
不幸的是,check_dhcp似乎为这种用法编写的相当愚蠢,并且在完成需要执行的操作后并没有尝试删除 root 权限。这至少会导致一个已知的安全问题,但通常是不好的做法,我不想这样做。
所以我想知道,有没有什么方法可以使我能够check_dhcp执行其必要的网络接口 frobbing,而无需完全授予它所有 root 权限?也许是一些具有功能的东西,SELinux、AppArmor 或类似的东西?正在寻找 Linux 解决方案——尤其是 Ubuntu 14.04。
我有一个简单的命令,我希望能够以用户身份执行,但它需要 root 权限。我怀疑这是“SUID”位的情况,但我从未使用过它。
这是我尝试过的:
aioobe@e6510:~/bin$ sudo -s
root@e6510:~/bin# cat -> spindown_baydrive
#!/bin/bash
/sbin/hdparm -Y /dev/sdb
root@e6510:~/bin# chmod +x spindown_baydrive
root@e6510:~/bin# chmod ug+s spindown_baydrive
root@e6510:~/bin# exit
aioobe@e6510:~/bin$ ./spindown_baydrive
/dev/sdb: Permission denied
aioobe@e6510:~/bin$
aioobe@e6510:~/bin$ ls -la spindown_baydrive
-rwsr-sr-x 1 root root 37 2011-01-31 09:59 spindown_baydrive
Run Code Online (Sandbox Code Playgroud)
有什么建议?
我有一个标记为 setuid 的 Perl 脚本,但是当我运行它时,它说我没有这样做的权限。我正在运行 Solaris 10。这适用于另一个系统,但我不知道有什么不同。我究竟做错了什么?
$ ls -l
total 16
-r-sr-x--- 1 root root 7354 Apr 19 2008 myscript
$ ./myscript
./myscript: Permission denied.
Run Code Online (Sandbox Code Playgroud)