gpt4 book ai didi

java - 使用 Java 在 Linux 上执行 DHCP

转载 作者:太空狗 更新时间:2023-10-29 12:05:59 27 4
gpt4 key购买 nike

我正在尝试用 java 开发一个 DHCP 客户端应用程序,它可以在端口 68 上接收 DHCP Offers 和 Acks 而无需以 root 身份运行。我知道绑定(bind)到端口 <1024 的 linux 限制。有哪些选项可用?

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

[编辑]有没有办法像配置 SNMP 守护进程那样配置 DHCP 守护进程将收到的数据包转发到应用程序?

最佳答案

好吧,你的选择有点有限。

根据 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);
}
}

我想 Jon Lin 的建议在这种情况下应该有效。一个警告 - 我假设它需要以 root 身份启动,稍后会自动切换到非特权用户,所以如果你根本没有 root 访问权限,恐怕你'运气不好。

关于java - 使用 Java 在 Linux 上执行 DHCP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12377373/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com