我需要一个可以以用户身份运行的脚本来修改 MAC 地址eth0
。我已想出以下脚本:
#!/bin/bash
/etc/init.d/networking stop
ifconfig eth0 hw ether 00:50:56:98:00:19
/etc/init.d/networking start
我设置了 setuid 权限并将其分配给 root:
-rwsr-xr-x 1 root root 110 May 24 14:22 ChangeMac.sh
但是当我以用户身份运行它时,它仍然会给我以下输出:
$ ./ChangeMac.sh
stop: Rejected send message, 1 matched rules; type="method_call", sender=":1.100" (uid=1000 pid=6746 comm="stop networking ") interface="com.ubuntu.Upstart0_6.Job" member="Stop" error name="(unset)" requested_reply="0" destination="com.ubuntu.Upstart" (uid=0 pid=1 comm="/sbin/init")
SIOCSIFHWADDR: Operation not permitted
start: Rejected send message, 1 matched rules; type="method_call", sender=":1.103" (uid=1000 pid=6753 comm="start networking ") interface="com.ubuntu.Upstart0_6.Job" member="Start" error name="(unset)" requested_reply="0" destination="com.ubuntu.Upstart" (uid=0 pid=1 comm="/sbin/init")
这是为什么?我怎样才能让用户可以调用它,但它以 root 身份执行?
答案1
如果您希望能够以普通用户身份运行此脚本且仅运行此脚本而无需任何其他 sudo 权限,或者您希望使用 sudo 运行它而无需输入密码,您可以将它们添加到您的 sudoers。
例如
sudo echo "[username] ALL = NOPASSWD: /path/to/your/script" >/etc/sudoers.d/myscript
然而,这在安全性上有点不妥,因为如果有人可以以您的用户身份编辑此脚本,他们可以在不知道您的密码的情况下以 sudo 身份运行任何命令,因此请小心使用它。
只需确保脚本由 root 拥有,并且写入权限只属于其所有者,因此其他任何人都无法更改它。
您还可以使用它chattr
来确保没有人可以修改您的脚本:
sudo chattr +i script.sh
从man chattr
:
具有“i”属性的文件无法被修改:无法删除或重命名,无法为该文件创建链接,也无法向该文件写入任何数据。
完成所有这些后,只需运行它sudo myscript
,它就会以 root 权限运行,而无需输入密码。