setuid位是可执行文件的一个属性,
ls -l /bin/ping 或mount等可以看到权限为
-rwsr-xr-x 1 root root 含有s位,所属用户为root表明该文件可以被其他用户以该文件所属用户的权限去执行。因此root用户设置s位后普通用户可以执行。
ping需要root权限是因为要创建原始套接字发送ICMP报文。
因此你自己编写的程序要达到这种效果可以:
sudo chown root xxx
sudo chmod +s xxx
此处以root身份赋予之权限以后就可以方便的让普通用户直接执行了,无需再输入密码。当然不用输密码就可执行的方法还有一些,如通过visudo编辑/etc/sudoers,设置NOPASSWD的程序,用户,但执行时仍需在命令前输入sudo
ICMP套接字是3.0内核新加入的功能,容许不需要set-user-id和CAP_NET_RAW权限的ping程序的实现,然而没有了兼容性,并且需要调整一个内核参数:
sudo sysctl -w net.ipv4.ping_group_range=‘0 10‘
或者写/proc/sys/ipv4/ping_group_range
默认值是‘1 0‘,意味着没有用户能够使用这个特性
若系统不支持则在创建套接字时显示Protocal not supported
若没有权限是Permission denied
创建socket时使用SOCK_DGRAM,不是SOCK_RAW,意味着不会收到20字节的IP头,而且不需要自己计算校验和,内核会帮你计算。ICMP id也是由内核填的。
时间: 2024-11-03 22:26:54