| 本帖最后由 sunsili 于 2024-3-1 23:45 编辑 
 【Shell】Linux udhcpc动态获取IP命令详解
 
 
 前言
 
 由于要使用网络通讯,所以不可避免的要用到dhcp。理想的网络通讯方式是下面3种都要支持:   1,接入已有网络。这便要求可以作为dhcp客户端。   2,作为DHCP服务器,动态分配IP。   3,指定固定IP   第3种情况没有什么好说的,简单说下前2种情况。   使用步骤:   (1)在内核的网络项里面把DHCP配置上;   (2)在busybox里面把udhcp server(udhcpd) udhcp client(udhcpc)都选上。 
   udhcpd就是终端设备作为DHCP服务器   udhcpc就是终端设备作为DHCP客户端   busybox里面对dhcp都已经给出例子了,   [zhh@localhost busybox-1.14.1]$ ls ./examples/udhcp/   sample.bound  sample.deconfig  sample.nak  sample.renew  sample.script  simple.script  udhcpd.conf   比如使用udhcpc时   就可以直接把simple.script拿来使用,改不改名字都可以,busybox里面默认的目录文件是/usr/share/udhcpc/default.script   可以查看下帮助 udhcpc: option requires an argument -- h
 BusyBox v1.23.2 (2023-07-24 16:54:35 CST) multi-call binary.
 
 Usage: udhcpc [-fbqRB] [-t N] [-T SEC] [-A SEC/-n]
 [-i IFACE] [-s PROG] [-p PIDFILE]
 [-oC] [-r IP] [-V VENDOR] [-F NAME] [-x OPT:VAL]... [-O OPT]...
 
 -i,--interface IFACE    Interface to use (default eth0)
 -s,--script PROG        Run PROG at DHCP events (default /usr/share/udhcpc/default.script)
 -p,--pidfile FILE       Create pidfile
 -B,--broadcast          Request broadcast replies
 -t,--retries N          Send up to N discover packets (default 3)
 -T,--timeout SEC        Pause between packets (default 3)
 -A,--tryagain SEC       Wait if lease is not obtained (default 20)
 -n,--now                Exit if lease is not obtained
 -q,--quit               Exit after obtaining lease
 -R,--release            Release IP on exit
 -f,--foreground         Run in foreground
 -b,--background         Background if lease is not obtained
 -S,--syslog             Log to syslog too
 -r,--request IP         Request this IP address
 -o,--no-default-options Don't request any options (unless -O is given)
 -O,--request-option OPT Request option OPT from server (cumulative)
 -x OPT:VAL              Include option OPT in sent packets (cumulative)
 Examples of string, numeric, and hex byte opts:
 -x hostname:bbox - option 12
 -x lease:3600 - option 51 (lease time)
 -x 0x3d:0100BEEFC0FFEE - option 61 (client id)
 -F,--fqdn NAME          Ask server to update DNS mapping for NAME
 -V,--vendorclass VENDOR Vendor identifier (default 'udhcp VERSION')
 -C,--clientid-none      Don't send MAC as client identifier
 Signals:
 USR1    Renew lease
 USR2    Release lease
 
 
 应用
 
 
 一、udhcpc -i
 
 udhcpc是一款用于获取DHCP地址的工具。其中,“-i”选项用于指定需要获取DHCP地址的网络接口名称。sudo udhcpc -i eth0 以上命令表示使用eth0接口获取DHCP地址。 二、udhcpc一直发送discover
 
 
 在DHCP协议中,客户端首先需要发送discover消息,请求获取ip地址。 udhcpc工具在执行时,会一直发送discover消息,直至获取成功或失败。以下是udhcpc发送discover消息的代码片段。 复制代码while (!(udhcp_send_raw(discover_pkt, sizeof(discover_pkt), NULL, PEER_PORT))) 
{
    if (no_background) {
        bb_error_msg("sending discover");
    } else {
        bb_info_msg("sending discover");
    }
    sleep(config_timeouts[timeout++]);
    if (timeout >= 7) {
        bb_error_msg("no lease, failing");
        /* Typically, client immediately sends DHCPDECLINE here,
         * and shuts down after that. We don't support it */
        return EXIT_FAILURE;
    }
}
 
 三、udhcpc命令
 
 
 udhcpc命令可用于在命令行中手动获取DHCP地址。以下是具体的命令使用方法:sudo udhcpc -i eth0 
 四、udhcpc参数详解
 
 
 udhcpc命令还可以使用其他参数来执行特定的功能: -b: 后台执行udhcpc命令。-s: 指定脚本文件,在DHCP成功获取地址后执行该脚本文件。-H: 指定客户端主机名,会在DHCP消息中发送。-p: 指定pid文件,记录udhcpc进程的id。-t: 指定超时时间,单位为秒。
 五、dhcpc工具向DHCP服务器发送discover消息
 
 
 udhcpc sending discover
 
 
 当udhcpc工具向DHCP服务器发送discover消息时,会进行日志记录。以下是发送discover消息时的日志输出。...udhcpc: sent discoverudhcpc: sending discoverudhcpc: lease of xxx.xxx.xxx.xxx obtained, lease time xxx... 
 六、udhcpc无法获取DHCP地址
 
 udhcpc no lease failing
 
 
 如果udhcpc无法获取DHCP地址,会输出“no lease, failing”的错误信息,并返回EXIT_FAILURE。udhcpc: no lease, failing 以上就是对udhcpc的详细阐述,并提供相应的命令和代码示例。 
 |