好吧,在您的情况下,您的选择有点有限。
根据RFC,客户端和服务器都需要监听特权端口。
另一件事是 - DHCP 客户端通常会更改系统信息,例如 IP 地址、域名、主机名等,因此如果您的客户端不以 root 身份运行,它唯一能够实现的就是接收报价和acks 并且对这些信息无所作为。
[编辑]
还有一件事 - DHCP 服务器不会单独向您发送报价。通常客户端发送一个 DHCP 请求,服务器尝试将其 MAC 地址与配置的主机和/或主机组匹配,然后发送一个提议。
我为非特权用户找到了一个 DHCP 实现:http ://code.google.com/p/ndhcp/wiki/ClientREADME
它使用以下 C 代码来删除特权:
void drop_root(uid_t uid, gid_t gid)
{
if (uid == 0 || gid == 0) {
log_line("FATAL - drop_root: attempt to drop root to root?\n");
exit(EXIT_FAILURE);
}
if (getgid() == 0) {
if (setregid(gid, gid) == -1) {
log_line("FATAL - drop_root: failed to drop real gid == root!\n");
exit(EXIT_FAILURE);
}
}
if (getuid() == 0) {
if (setreuid(uid, uid) == -1) {
log_line("FATAL - drop_root: failed to drop real uid == root!\n");
exit(EXIT_FAILURE);
}
}
/* be absolutely sure */
if (getgid() == 0 || getuid() == 0) {
log_line("FATAL - drop_root: tried to drop root, but still have root!\n");
exit(EXIT_FAILURE);
}
}
我想 Jon Lin 的建议应该适用于这种情况。一个警告 - 我假设它需要以root 身份启动,然后会自动切换到非特权用户,所以如果你根本没有 root 访问权限,恐怕你不走运。