昨天调试一个shell 脚本(NAS.sh)发现一个问题,当用PUTTY登录后执行没有任何问题。可是用网络通过PHP调用时不能的到正确的结果,后经过仔细观察发现脚本中凡是出现sudo的语句都没有执行。怀疑是用户权限问题,网络搜后后发现有两个方法
1 通过配置sudo 赋予www-data (Apache或Nginx)的用户root权限
sudo 通过配置文件就是/etc/sudoers 分配给普通用户一些不具备的权利,让普通用户也可以具有root用户的相关权限(比如说sudo可以分配给某一用户某些特定的命令执行权限)。只有里面分配了的用户才能使用sudo。
感觉非常危险毕竟是网络访问的东西。
pi@pi:~ $ sudo
usage: sudo -h | -K | -k | -V
usage: sudo -v [-AknS] [-g group] [-h host] [-p prompt] [-u user]
usage: sudo -l [-AknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]
usage: sudo [-AbEHknPS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] [VAR=value] [-i|-s] [<command>]
usage: sudo -e [-AknS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] file ...
-V 显示版本编号
-h 会显示版本编号及指令的使用方式说明
-l 显示出自己(执行 sudo 的使用者)的权限
-v 因为 sudo 在第一次执行时或是在 N 分钟内没有执行(N 预设为五)会问密码,这个参数是重新做一次确认,如果超过 N 分钟,也会问密码
-k 将会强迫使用者在下一次执行 sudo 时问密码(不论有没有超过 N 分钟)
-b 将要执行的指令放在背景执行
-p prompt 可以更改问密码的提示语,其中 %u 会代换为使用者的帐号名称, %h 会显示主机名称
-u username /#uid 不加此参数,代表要以 root 的身份执行指令,而加了此参数,可以以 username 的身份执行指令(#uid 为该 username 的使用者号码)
-s 执行环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shell
-H 将环境变数中的 HOME (家目录)指定为要变更身份的使用者家目录(如不加 -u 参数就是系统管理者 root )
command 要以系统管理者身份(或以 -u 更改为其他人)执行的指令
#查看用户权限
pi@pi:~/$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
将:www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
改为:www-data:x:1000:1000:,,,:/home/pi:/bin/bash
2 间接完成
用 PHP 写一个值到文件中,然后用定时任务脚本,检测这个值,如果正确则执行相应的脚本。
pi@pi:~/crontab -e
# m h dom mon dow command
#10 * * * * sudo sdparm --command=stop /dev/sda
#周日定时更新
* 01 * * 7 sudo apt-get update
#每分钟执行一次,flock -xn 放置重复执行。
*/1 * * * * flock -xn /home/pi/Scripts/monitor.sh -c >/tmp/crontab_log.txt 2>&1
#周一到周五每天下午 5:00 寄一封信给 alex@domain.name :
0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata
#在 12 月内, 每天的早上 6 点到 12 点中,每隔3个小时执行一次 /usr/bin/backup :
0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata
#这将会在每天早上5点运行 /root/bin/backup.sh
0 5 * * * /root/bin/backup.sh