我用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命令。
答案 0 :(得分:4)
我认为您还需要在程序中setuid(0);
成为root用户。仅设置s位是不够的。
我同意所有其他人的看法,做所有这些事情都是非常冒险的......
修改强>
Jonathan Leffler在评论中是对的。在这种情况下,setuid(0);
可能不是必需的。在/etc
#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可执行文件,并且你正在运行 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',仅适用于该文件的所有者。