我有一个在我自己的用户帐户下运行的脚本,负责处理各种无线接口。它(或多或少)智能地关闭和打开无线局域网等等。但是,它是通过调用 和 等工具iwconfig
来hciconfig
启动和关闭设备来实现的。但由于这些需要超级用户权限,我决定在我的个人脚本文件夹中创建这些二进制文件的副本并设置 suid 标志(我是唯一可以读取和执行该目录的人)。因此,这些二进制文件的权限看起来像-rwsr-x---
它们属于root
我自己的主要组。
但是,suid 位似乎被完全忽略,因为在执行该二进制文件时我得到以下结果:
me@host:~/scripts/suid$ stat iwconfig
File: `iwconfig'
Size: 26968 Blocks: 72 IO Block: 4096 regular file
Device: 15h/21d Inode: 4194732 Links: 1
Access: (4750/-rwsr-x---) Uid: ( 0/ root) Gid: ( 1000/ me)
Access: 2011-08-24 04:15:39.008148182 +0200
Modify: 2013-02-09 21:25:47.777488386 +0100
Change: 2013-03-12 15:55:20.765681857 +0100
Birth: -
me@host:~/scripts/suid$ ./iwconfig wlan0 txpower off
Error for wireless request "Set Tx Power" (8B26) :
SET failed on device wlan0 ; Operation not permitted.
我还尝试将组设置为 root、guid 位并使二进制文件可执行且可读。结果相同。
那么,这是为什么?我该如何解决它?
答案1
您的主目录可能已安装有该nosuid
标志。您可以通过查看来检查/proc/mounts
。如果您不确定哪个文件系统包含您的主目录,df ~
它会告诉您(然后您可以使用 grep 在 中轻松找到它/proc/mounts
)。
不过,更好的选择是将 sudo 与该NOPASSWD
标志一起使用。例如,运行(以 root 身份)visudo -f /etc/sudoers.d/local-iwconfig
并添加如下行:
your-user-name ALL=(root) NOPASSWD: /sbin/iwconfig
您还可以使用 sudo 进一步锁定事物。例如,您可以指定要运行的完整命令行,包括参数(然后有多个条目,每个命令行一个)。有关完整详细信息,请检查sudoers(5) 手册页。