linux下复制文件的权限

接上篇博文,思考如何在有root没sudo的情况下在脚本中切换到root执行。需要expect。懒得学习,看到有文章说设置脚本的suid也行:

赖半仙注:
其实最好的办法还是,用root用户编写脚本,最后在设置脚本权限的时候给这个脚本加上suid,命令很简单chmod 4755 ooxx.sh 或者是chmod +s也行
设置了suid后,切换回普通用户就可以执行这个脚本了,但切记有一点的是,脚本中调用root用户特权命令一定要像下面那样写可执行文件的绝对路径,不然普通用户找不到。

#!/bin/sh
qqid=$(/sbin/pidof qq)
echo "qq_pid=$qqid"

实验了一下,root新建一个400的demo文件,写脚本如下:

#!/bin/bash
/bin/more demo

给脚本加s权限然后执行:

[hean@localhost suid]$ sudo chmod +s suid.sh
[hean@localhost suid]$ ls -l
总用量 20
-r--------. 1 root root   43 3月   8 13:43 demo
-rwxr-xr-x. 1 root root 6755 3月   8 14:08 main
-rw-r--r--. 1 root root  258 3月   8 14:08 main.c
-rwsrwsrwx. 1 root root   31 3月   8 14:59 suid.sh
[hean@localhost suid]$ ./suid.sh
demo: 权限不够
[hean@localhost suid]$

看来上面文章的说法不靠谱。

继续搜索,找到另一篇文章:

出于安全考虑1,现代的大部分 UNIX 类系统都会忽略掉脚本的 suid ,只有二进制可执行程序的 suid 有效 。所以直接给脚本文件设置 suid 是达不到预期效果的。如果确实需要给脚本文件设 suid,常见的做法是用 C 写一个封装程序,在这个程序里调用脚本。这样,给封装程序(二进制可执行程序)设上 suid (chmod 4755 a.out) 就可以达到给脚本文件设 suid 的效果了。

原来如此。封装一下:

#include <unistd.h>
#include <stdio.h>
#include <errno.h>

int main(int argc, char* argv[]) {
    char* executable = "suid.sh";
    execl (executable, executable, NULL);
    perror("fail to exec"); // exec returns == error occured
    return errno;
}

注意封装的脚本需要添加p选项,即:

#!/bin/bash -p
/bin/more demo

关于p选项:

记得 "-p"

如果被封装的是 bash 脚本,还需注意必须记得给 bash 加上 "-p" 选项(如例二)。因为(还是出于安全考虑)bash 启动时会自动清掉 euid 。

If the shell is started with the effective user (group) id not equal to the real user (group) id, and the -p option is not supplied, no startup files are read, shell functions are not inherited from the environment, the SHELLOPTS variable, if it appears in the environment, is ignored, and the effective user id is set to the real user id. If the -p option is supplied at invocation, the startup behavior is the same, but the effective user id is not reset.

添加s权限并测试:

[hean@localhost suid]$ sudo vim main.c
[hean@localhost suid]$ sudo gcc main.c -o main
[hean@localhost suid]$ sudo chmod +s main
[hean@localhost suid]$ ls -l
总用量 20
-r--------. 1 root root   43 3月   8 13:43 demo
-rwsr-sr-x. 1 root root 6755 3月   8 15:04 main
-rw-r--r--. 1 root root  251 3月   8 15:04 main.c
-rwsrwsrwx. 1 root root   31 3月   8 14:59 suid.sh
[hean@localhost suid]$ ./main
kkkkkkm\k
kfjkds
fdsajkfjd;sa
fjwkemlm
kfd

测试通过。

接下来就是考虑怎么把封装的脚本批量同步到服务器了。用scp:

[hean@localhost tmp]$ ls -l
总用量 4
-rwsrwsrwx. 1 root root 31 3月   8 14:59 suid.sh
[hean@localhost tmp]$ scp suid.sh hean@10.217.13.242:/directory/tmp/
hean@10.217.13.242's password:
suid.sh                                                                                             100%   31     0.0KB/s   00:00
[hean@localhost tmp]$

登录242,s权限消失:

[hean@localhost tmp]$ ls -l
total 4
-rwxrwxr-x 1 hean hean 31 Mar  9 00:08 suid.sh
[hean@localhost tmp]$

换rsync,rsync服务端的文件:

[hean@localhost tmp]$ mv suid.sh ss.sh && chmod +s ss.sh
[hean@localhost tmp]$ ls -l
total 4
-rwsrwsr-x 1 hean hean 31 Mar  9 00:08 ss.sh
[hean@localhost tmp]$

客户端同步后:

[hean@localhost tmp]$ sudo rsync 10.217.13.242::hean/tmp/* .
[hean@localhost tmp]$ ls -l
总用量 8
-rwxr-xr-x. 1 root root 31 3月   8 15:16 ss.sh
-rwsrwsrwx. 1 root root 31 3月   8 14:59 suid.sh
[hean@localhost tmp]$

ss.sh的s权限又消失了。

看来,只能用expect了。或者,找老大加sudo权限。有点不甘心,可是想想又觉的自己特无聊。如果scp和rsync能想cp -p那样复制权限岂不乱套了?本来没有sudo权限的,却远程复制过来一个特nb的脚本,然后这个脚本保持了所有的属性,以sudo权限干掉了服务器....恩,linux这么安全的系统是绝对不允许这么做的。我瞎折腾了-_-#

参考资料:

1. 关于suid:文件的特殊权限:suid,sgid,sbit
2. 在脚本里输入root密码:http://www.blogjava.net/jasmine214--love/archive/2010/12/28/341794.html
3.  给脚本设置euid (suid):http://blog.163.com/wanglianchen1982@126/blog/static/8442751200791485542655/

4 thoughts on “linux下复制文件的权限

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注