热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Linux应用】udhcpc命令获取到ip后,但是没有生效(没有设置进去)

今天遇到一个很奇葩的问题,udhcpc获取到了,但是ifconfig命令查看时却没有生效。下面来看下是怎么回事。udhcpc是集成在busybox里面的

今天遇到一个很奇葩的问题,udhcpc获取到了,但是ifconfig命令查看时却没有生效。下面来看下是怎么回事。





udhcpc是集成在busybox里面的,所以在编译busybox的时候加入dhcp的选项就可以了。

如果没有udhcpc的执行文件,可以手动连接一个:ln -s /bin/busybox  /sbin/udhcpc。



1、命令执行打印

# udhcpc -b -i eth0
udhcpc: started, v1.31.1
udhcpc: sending discover
udhcpc: sending select for 172.30.15.20
udhcpc: lease of 172.30.15.20 obtained, lease time 691200

从上面打印可以明显得出结论,我们是获取到了ip地址的172.30.15.20,ip地址为。来看下ifconfig命令打印。


# udhcpc -b -i eth0
udhcpc: started, v1.31.1
udhcpc: sending discover
udhcpc: sending select for 172.30.15.20
udhcpc: lease of 172.30.15.20 obtained, lease time 691200
#
# ifconfig
eth0 Link encap:Ethernet HWaddr 02:31:A2:6D:75:BF inet addr:172.30.15.67 Bcast:172.30.255.255 Mask:255.255.0.0inet6 addr: fe80::31:a2ff:fe6d:75bf/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:1451 errors:0 dropped:27 overruns:0 frame:0TX packets:24 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:624135 (609.5 KiB) TX bytes:3879 (3.7 KiB)Interrupt:41 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

上面ifconfig命令打印出来的eth0网卡IP地址却不是172.30.15.20。说明我们虽然获取到了ip地址但是没有设置进去。



2、解决方案


通过搜索博客知道是:udhcpc命令只能去获取到ip,但是不能设置。设置过程是(default.script)脚本来完成的。这个脚本默认位置在/usr/share/udhcpc/default.script。

参考博客:https://blog.csdn.net/sddsighhz/article/details/46005629

来看下我的这个路径:


# ls -l /usr/share/
total 0
drwxr-xr-x 4 root root 0 Jul 13 2020 alsa

发现并没有这个脚本文件。应该是被系统裁剪掉了。下面尝试补充这个脚本,发现这个路径是只读路径。没办法添加到默认路径中去,只有/tmp/路径是可读可写的,想办法让udhcpc命令去执行这个路径下的(default.script)脚本文件。



3、udhcpc命令


从下面可以看到 -s 传参可以指定这个脚本文件路径,到此我们就可以解决这个问题了。


# udhcpc -h
udhcpc: option requires an argument -- 'h'
BusyBox v1.31.1 (2020-07-13 19:33:08 CST) multi-call binary.Usage: udhcpc [-fbqRB] [-a[MSEC]] [-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 IFACE Interface to use (default eth0)-s PROG Run PROG at DHCP events (default /usr/share/udhcpc/default.script)-p FILE Create pidfile-B Request broadcast replies-t N Send up to N discover packets (default 3)-T SEC Pause between packets (default 3)-A SEC Wait if lease is not obtained (default 20)-b Background if lease is not obtained-n Exit if lease is not obtained-q Exit after obtaining lease-R Release IP on exit-f Run in foreground-S Log to syslog too-a[MSEC] Validate offered address with ARP ping-r IP Request this IP address-o Don't request any options (unless -O is given)-O 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)-x 14:'"dumpfile"' - option 14 (shell-quoted)-F NAME Ask server to update DNS mapping for NAME-V VENDOR Vendor identifier (default 'udhcp VERSION')-C Don't send MAC as client identifier
Signals:USR1 Renew leaseUSR2 Release lease

4、解决方案


方案1:

1、在/usr/share/udhcpc/默认路径直接添加default.script文件

2、执行udhcpc命令(如:udhcpc -b -i eth0)

方案2:

1、在/tmp/路径下添加default.script文件

2、执行udhcpc命令,但是要带 -s 传参脚本路径(如:udhcpc -b -s /tmp/default.script -i eth0)

     如:busybox udhcpc -b -q -t 1 -i eth0 -s /etc/simple.script -p /var/run/udhcpc.pid &



方案1:/usr/share/udhcpc/路径是只读文件,需要编译文件系统时就要编译进去。但是用起来比较方便,所有程序直接都能共用。

方案2:/tmp/是可读可写文件,不需要编译时就生成。但是掉电就没有了,每次都需要应用程序去写一次,并且不能共用。

所以按需采用。



5、脚本


default.script脚本如下:


#!/bin/sh# udhcpc script edited by Tim Riker [ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1RESOLV_COnF="/etc/resolv.conf"
[ -e $RESOLV_CONF ] || touch $RESOLV_CONF
[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
[ -n "$subnet" ] && NETMASK="netmask $subnet"
# Handle stateful DHCPv6 like DHCPv4
[ -n "$ipv6" ] && ip="$ipv6/128"if [ -z "${IF_WAIT_DELAY}" ]; thenIF_WAIT_DELAY=10
fiwait_for_ipv6_default_route() {printf "Waiting for IPv6 default route to appear"while [ $IF_WAIT_DELAY -gt 0 ]; doif [ -z "$(ip -6 route list | grep default)" ]; thenprintf "\n"returnfisleep 1printf ".": $((IF_WAIT_DELAY -= 1))doneprintf " timeout!\n"
}case "$1" indeconfig)/sbin/ifconfig $interface up/sbin/ifconfig $interface 0.0.0.0# drop info from this interface# resolv.conf may be a symlink to /tmp/, so take careTMPFILE=$(mktemp)grep -vE "# $interface\$" $RESOLV_CONF > $TMPFILEcat $TMPFILE > $RESOLV_CONFrm -f $TMPFILEif [ -x /usr/sbin/avahi-autoipd ]; then/usr/sbin/avahi-autoipd -k $interfacefi;;leasefail|nak)if [ -x /usr/sbin/avahi-autoipd ]; then/usr/sbin/avahi-autoipd -wD $interface --no-chrootfi;;renew|bound)if [ -x /usr/sbin/avahi-autoipd ]; then/usr/sbin/avahi-autoipd -k $interfacefi/sbin/ifconfig $interface $ip $BROADCAST $NETMASKif [ -n "$ipv6" ] ; thenwait_for_ipv6_default_routefiif [ -n "$router" ] ; thenecho "deleting routers"while route del default gw 0.0.0.0 dev $interface 2> /dev/null; do:donefor i in $router ; doroute add default gw $i dev $interfacedonefi# drop info from this interface# resolv.conf may be a symlink to /tmp/, so take careTMPFILE=$(mktemp)grep -vE "# $interface\$" $RESOLV_CONF > $TMPFILEcat $TMPFILE > $RESOLV_CONFrm -f $TMPFILE# prefer rfc3397 domain search list (option 119) if availableif [ -n "$search" ]; thensearch_list=$searchelif [ -n "$domain" ]; thensearch_list=$domainfi[ -n "$search_list" ] &&echo "search $search_list # $interface" >> $RESOLV_CONFfor i in $dns ; doecho adding dns $iecho "nameserver $i # $interface" >> $RESOLV_CONFdone;;
esacHOOK_DIR="$0.d"
for hook in "${HOOK_DIR}/"*; do[ -f "${hook}" -a -x "${hook}" ] || continue"${hook}" "${@}"
doneexit 0

再来一个


#!/bin/sh
# udhcpc script edited by Tim Riker RESOLV_COnF="/etc/resolv.conf"[ -n "$1" ] || { echo "Error: should be called from udhcpc"; exit 1; }NETMASK=""
[ -n "$subnet" ] && NETMASK="netmask $subnet"
BROADCAST="broadcast +"
[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"case "$1" indeconfig)echo "Setting IP address 0.0.0.0 on $interface"busybox ifconfig $interface 0.0.0.0;;renew|bound)echo "Setting IP address $ip on $interface"busybox ifconfig $interface $ip $NETMASK $BROADCASTif [ -n "$router" ] ; thenecho "Deleting routers"while busybox route del default gw 0.0.0.0 dev $interface ; do:dOnemetric=0for i in $router ; doecho "Adding router $i"busybox route add default gw $i dev $interface metric $metric: $(( metric += 1 ))donefiecho "Recreating $RESOLV_CONF"# If the file is a symlink somewhere (like /etc/resolv.conf# pointing to /run/resolv.conf), make sure things work.realcOnf=$(readlink -f "$RESOLV_CONF" 2>/dev/null || echo "$RESOLV_CONF")tmpfile="$realconf-$$"> "$tmpfile"[ -n "$domain" ] && echo "search $domain" >> "$tmpfile"for i in $dns ; doecho " Adding DNS server $i"echo "nameserver $i" >> "$tmpfile"donebusybox mv "$tmpfile" "$realconf";;
esacexit 0

总结


这个问题的原因是,udhcpc命令只能获取ip,设置ip是靠default.script脚本来完成的。

解决步骤:

1、创建default.script脚本

2、添加default.script脚本的权限为0755(这个很重要)

3、执行udhcpc命令(udhcpc -b -s /tmp/default.script -i eth0)


正常打印:

# udhcpc -b -s /tmp/default.script -i eth0
udhcpc: started, v1.31.1
udhcpc: sending discover
udhcpc: sending select for 172.30.15.20
udhcpc: lease of 172.30.15.20 obtained, lease time 691200
deleting routers
adding dns 202.96.134.133
adding dns 202.96.128.166

 


推荐阅读
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • 给出一群女孩的重量和颜值和她们的朋友关系现在有一个舞台ab是朋友bc是朋友ac就是朋友给出最大承重可以邀请这些女孩来玩对于每一个朋友团体全邀请or邀请一个or不邀请问能邀请的女孩的 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 广度优先遍历(BFS)算法的概述、代码实现和应用
    本文介绍了广度优先遍历(BFS)算法的概述、邻接矩阵和邻接表的代码实现,并讨论了BFS在求解最短路径或最短步数问题上的应用。以LeetCode中的934.最短的桥为例,详细阐述了BFS的具体思路和代码实现。最后,推荐了一些相关的BFS算法题目供大家练习。 ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
author-avatar
ranger
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有