使用Java在Linux上执行DHCP

我正在尝试在java中开发一个DHCP客户端应用程序,可以在端口68上接收DHCP提供和确认,而不需要以root身份运行。 我知道绑定到端口<1024的linux限制。 有什么select可用?

[编辑]应用程序可以发送DHCP发现和请求。 它需要能够从使用自定义DHCP选项的DHCP服务器接收DHCP提供和确认。 一旦DHCP过程完成,应用程序将不会修改任何系统信息,但它将执行“自定义”操作。

[编辑]有没有办法configurationDHCP守护进程将收到的数据包转发到应用程序,比如如何configurationSNMP守护进程?

有一个Apache Commons Daemon服务可以帮助你。 它允许您执行特权操作,如绑定到端口68,然后切换到非特权用户。

那么,在你的情况下,你的选择有限。

根据RFC ,客户端和服务器都需要监听特权端口。

另一件事是 – DHCP客户端通常会更改系统信息,如IP地址,域名,主机名等,所以如果你的客户端不是以root身份运行的话,唯一能够实现的就是接收报价和并且对这些信息不做任何事情。

[编辑]

还有一件事情 – 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); } } 

我想林恩的建议应该在这种情况下工作。 一个警告 – 我认为它将需要以root身份启动 ,之后会自动切换到非特权用户,所以如果您根本没有root访问权限,恐怕您运气不好。