Unix suid位问题

时间:2010-01-04 23:47:51

标签: c unix

我用c编写了一个程序,然后进行一些计算然后创建一个文件夹。该文件夹的所有者是root用户。对于其他用户,我正在尝试运行此c应用程序。我有这个错误:

mkdir: lol: Permission denied

好的,我知道这个错误没问题,因为我没有权利,但我已经在网上看过,如果我在文件上设置suid位,那么这个文件将以所有者的权利运行。 我用过这个命令:

chmod +s filename

但它不起作用...... :(任何想法?

编辑:
所以,首先,我的Unix发行版是Mac OS X 10.5.8。我的文件名是a.out,因为我已经使用以下命令从ic.c编译它:gcc ic.c 我正在以root用户身份运行chmod命令。

6 个答案:

答案 0 :(得分:4)

我认为您还需要在程序中setuid(0);成为root用户。仅设置s位是不够的。

  

我同意所有其他人的看法,做所有这些事情都是非常冒险的......

修改

Jonathan Leffler在评论中是对的。在这种情况下,setuid(0);可能不是必需的。在/etc

下创建文件的必要步骤

create_file_under_etc.c

#include <stdio.h>
int main() {
  FILE *fp = fopen("/etc/so-su-test.txt", "wt");
  if (fp) {
    fprintf(fp, "I'll be back\n");
    fclose(fp);
    printf("File created.\n");
  } else {
    printf("File not created.\n");
  }
  return 0;
}

...并测试和编译

cc create_file_under_etc.c
sudo chmod +s a.out
sudo chown root:staff a.out
./a.out

...你最好还清理

sudo rm a.out
sudo rm /etc/so-su-test.txt

答案 1 :(得分:2)

好吧,你没有说'filename'是什么。你只能对可执行文件进行suid。特别是你不能在shell脚本上设置它 - 它必须是真正的机器代码可执行文件。在现代的UNIX中,就像一些可怕的Linux发行版一样,如果不跳过比你想象的更多的箍,你可能根本无法设置它。

答案 2 :(得分:1)

尝试以root用户身份运行chmod。

过去我一直都是这样:(

答案 3 :(得分:1)

语法不正确。命令必须像chmod u + s filename一样锁定 chmod http://en.clihelper.com/chmod/向导可以帮助chmod语法

答案 4 :(得分:0)

从你的问题中不清楚“文件名”是指什么 - 可执行文件, 或者您要在其中创建文件的目录?要做你想做的事,你需要使用 可执行文件的chmod +s命令,因此它将以root权限运行。目标目录上的chmod +s将无法为非root用户打开文件创建权限。

然而,整个概念让我觉得有点安全风险 - 不会更好 为了在这个应用程序的某个地方创建一个目录,然后chmod它775或777分别授予“group”或“world”的写入权限?

编辑:我看到你确实试图chmod可执行文件,并且你正在运行 chmod命令为root。但root是否拥有可执行文件?你可能需要一个“chown” 除了chmod + s命令之外,命令(以root身份),以确保它运行setuid root 而不是setuid whoever-built-the-executable。

答案 5 :(得分:0)

您使用了命令

chmod +s filename

您用于发出该命令的语法不正确。正确的语法是

chmod [ugoa]+s filename

您可以使用字母u,g,o和a。

的任意组合

Unix,正如您所知,存储有关每个文件夹/文件的权限的信息。每个文件都有读,写,执行,粘贴和更多附加权限。对于单个文件,所有者,组和其他所有人都有一组不同的权限。因此,虽然文件的所有者可能能够读取,写入和执行文件,但所有者组中的所有其他用户可能只能读取该文件,而其他所有用户可能根本无法访问该文件

发出chmod命令时,您需要指定要更改权限的用户组。通过使用字母u,g,o和a的组合来完成此操作。 'u'更改文件所有者的权限,为所有者组中的所有用户更改'g',为所有者组以外的所有其他用户更改'o',为所有三组用户更改'a'。

示例:

chmod ga-r confidential.txt将使其只有文件的所有者才能读取'confidential.txt'。所有其他用户(包括所有者组中的用户)将无法阅读“confidential.txt”

chmod ga-rwx really_confidential.txt将使除了该文件的所有者之外的任何人都无法读取,写入或执行'really_confidential.txt'。换句话说,你删除从除了所有者以外的所有用户读取,写入或执行'really_confidential.txt'的能力。

chmod u+s filename将粘性位添加到'filename',仅适用于该文件的所有者。

编辑:哦,是的,因为该文件归root所有,所以请务必在命令前面加上'sudo'。但看起来你已经知道了。