如何从bash脚本中删除root拥有的文件?

时间:2015-02-04 10:32:39

标签: linux bash

我想从非特权用户拥有的简单脚本中删除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位的目的。

所以问题是:如何设置脚本权限(和/或脚本的所有权),这将允许脚本在非特权用户调用时删除根拥有的文件?

3 个答案:

答案 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)。
  • 将所有者更改为root
  • 将SUID位添加到程序
  • 从无特权的shell脚本中调用特殊目的程序。

注意:系统上的任何用户都可以启动该程序,从而删除该文件,除非您使用UNIX权限限制其使用!

答案 2 :(得分:0)

首先,脚本需要由执行时提供给脚本的用户拥有(在您的情况下,root)。但是,SUID shell脚本是个坏主意(请参阅注释)。

正确的解决方案不是将脚本作为SUID运行,而是应该授予用户对文件所在的目录的写入权限。然后脚本可以取消链接(删除)文件如果它属于另一个用户,并且没有权限写入它。

一个具体的例子:你有一个用户“popov”是“popov”组的成员和一个目录/ var / lib / pacman

chgrp popov /var/lib/pacman
chmod g+w /var/lib/pacman