未成功调用外部shell脚本作为非root用户

时间:2012-05-16 22:33:56

标签: c linux shell permissions

我希望用户以B用户身份完成一些工作。如果B是root,但非root用户失败,则没关系。以下是基本代码:

root.c:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
    setuid( 0 );
    system( "/tmp/script_of_root.sh" );

    return 0;
}

script_of_root.sh:

#!/bin/sh
echo $RANDOM >> /tmp/file_of_root

播放

$ cd /tmp
$ cc root.c -o root
$ su -
# chown root.root /tmp/root
# chmod 4755 /tmp/root
# exit
$ ./root

执行“./root”后,将更新文件“/ tmp / file_of_root”。但是,如果我将相同的东西应用于非root用户,则它不起作用。代码:

foobar.c但是:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
    setuid( 1001 );    // uid of user "foobar"
    system( "/tmp/script_of_foobar.sh" );

    return 0;
}

script_of_foobar.sh:

#!/bin/sh
echo $RANDOM >> /tmp/file_of_foobar

播放

$ cd /tmp
$ cc foobar.c -o foobar
$ su -
# chown foobar.users /tmp/foobar
# chmod 4755 /tmp/foobar
# exit
$ ./foobar

如果我像其他普通用户一样运行“./foobar”(不是“foobar”本身),那就错了:

/tmp/script_of_foobar.sh: line 2: file_of_foobar: Permission denied

我完全糊涂了。为什么第二种情况不起作用?

最好的问候。

2 个答案:

答案 0 :(得分:1)

foobar.c中的setuid调用只有在你是root用户或者你的有效UID为1001时才会成功。

因此。如果您不是root用户,则setuid(1001)将失败,并且您将无权覆盖“foobar”所拥有的文件。

答案 1 :(得分:0)

从输出看起来,非root用户可以执行script_of_foobar.sh,但无法写入/ tmp / file_of_foobar。 / tmp上的权限是否可能已关闭?我认为它应该设定为1777年。