我想从非特权用户拥有的简单脚本中删除root用户拥有的文件(/var/lib/pacman/db.lck):
#!/bin/bash
rm -f /var/lib/pacman/db.lck
但我不想使用sudo
运行脚本,以避免每次以非特权用户身份执行脚本时输入密码。为了实现这一点,我设置了s
位:
-rwsrwsrwx 1 popov users 41 04.02.2015 10:35 unlock.sh
但是在运行脚本后我得到了
rm: cannot remove ‘/var/lib/pacman/db.lck’: Permission denied
似乎我错误地理解了s
位的目的。
所以问题是:如何设置脚本权限(和/或脚本的所有权),这将允许脚本在非特权用户调用时删除根拥有的文件?
答案 0 :(得分:4)
如果问题是sudo要求输入密码,你可以使用" NOPASSWD"来配置sudo。使用此命令的选项。这样的事情:
joe ALL=(ALL) NOPASSWD: /full/path/to/command
答案 1 :(得分:1)
另一种替代方法是用一个小程序替换shell脚本:
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#define FILENAME "/var/tmp/dummy"
int main() {
if(unlink(FILENAME) == -1) {
printf("unlink() of %s failed: %s\n", FILENAME, strerror(errno));
return 1;
}
return 0;
}
FILENAME
unlink_it.c
。gcc -Wall -o unlink_it unlink_it.c
/usr/local/bin
)。注意:系统上的任何用户都可以启动该程序,从而删除该文件,除非您使用UNIX权限限制其使用!
答案 2 :(得分:0)
首先,脚本需要由执行时提供给脚本的用户拥有(在您的情况下,root
)。但是,SUID shell脚本是个坏主意(请参阅注释)。
正确的解决方案不是将脚本作为SUID运行,而是应该授予用户对文件所在的目录的写入权限。然后脚本可以取消链接(删除)文件如果它属于另一个用户,并且没有权限写入它。
一个具体的例子:你有一个用户“popov”是“popov”组的成员和一个目录/ var / lib / pacman
chgrp popov /var/lib/pacman
chmod g+w /var/lib/pacman