#!/bin/bash# dhclient-script for Linux. Dan Halbert, March, 1997.# Updated for Linux 2.[12] by Brian J. Murrell, January 1999.# No guarantees about this. I'm a novice at the details of Linux# networking.# Notes:# 0. This script is based on the netbsd script supplied with dhcp-970306.# 1. ifconfig down apparently deletes all relevant routes and flushes# the arp cache, so this doesn't need to be done explicitly.# 2. The alias address handling here has not been tested AT ALL.# I'm just going by the doc of modern Linux ip aliasing, which uses# notations like eth0:0, eth0:1, for each alias.# 3. I have to calculate the network address, and calculate the broadcast# address if it is not supplied. This might be much more easily done# by the dhclient C code, and passed on.# 4. TIMEOUT not tested. ping has a flag I don't know, and I'm suspicious# of the 1ドル in its args.# 5. Script refresh in 2017. The aliasing code was too convoluted and needs# to go away. Migrated DHCPv4 script to ip command from iproute2 suite.# This is based on Debian script with some tweaks. ifconfig is no longer# used. Everything is done using ip tool from ip-route2.# 'ip' just looks too weird. Also, we now have unit-tests! Those unit-tests# overwirte this line to use a fake ip-echo tool. It's also convenient# if your system holds ip tool in a non-standard location.ip=/sbin/ip# update /etc/resolv.conf based on received values# This updated version mostly follows Debian script by Andrew Pollock et al.make_resolv_conf() {local new_resolv_conf# DHCPv4if [ -n "$new_domain_search" ] || [ -n "$new_domain_name" ] ||[ -n "$new_domain_name_servers" ]; thennew_resolv_conf=/etc/resolv.conf.dhclient-newrm -f $new_resolv_confif [ -n "$new_domain_name" ]; thenecho domain ${new_domain_name%% *} >>$new_resolv_conffiif [ -n "$new_domain_search" ]; thenif [ -n "$new_domain_name" ]; thendomain_in_search_list=""for domain in $new_domain_search; doif [ "$domain" = "${new_domain_name}" ] ||[ "$domain" = "${new_domain_name}." ]; thendomain_in_search_list="Yes"fidoneif [ -z "$domain_in_search_list" ]; thennew_domain_search="$new_domain_name$new_domain_search"fifiecho "search ${new_domain_search}" >> $new_resolv_confelif [ -n "$new_domain_name" ]; thenecho "search ${new_domain_name}" >> $new_resolv_conffiif [ -n "$new_domain_name_servers" ]; thenfor nameserver in $new_domain_name_servers; doecho nameserver $nameserver >>$new_resolv_confdoneelse # keep 'old' nameserverssed -n /^\w*[Nn][Aa][Mm][Ee][Ss][Ee][Rr][Vv][Ee][Rr]/p /etc/resolv.conf >>$new_resolv_conffiif [ -f /etc/resolv.conf ]; thenchown --reference=/etc/resolv.conf $new_resolv_confchmod --reference=/etc/resolv.conf $new_resolv_conffimv -f $new_resolv_conf /etc/resolv.conf# DHCPv6elif [ -n "$new_dhcp6_domain_search" ] || [ -n "$new_dhcp6_name_servers" ]; thennew_resolv_conf=/etc/resolv.conf.dhclient-newrm -f $new_resolv_confif [ -n "$new_dhcp6_domain_search" ]; thenecho "search ${new_dhcp6_domain_search}" >> $new_resolv_conffiif [ -n "$new_dhcp6_name_servers" ]; thenfor nameserver in $new_dhcp6_name_servers; do# append %interface to link-local-address nameserversif [ "${nameserver##fe80::}" != "$nameserver" ] ||[ "${nameserver##FE80::}" != "$nameserver" ]; thennameserver="${nameserver}%${interface}"fiecho nameserver $nameserver >>$new_resolv_confdoneelse # keep 'old' nameserverssed -n /^\w*[Nn][Aa][Mm][Ee][Ss][Ee][Rr][Vv][Ee][Rr]/p /etc/resolv.conf >>$new_resolv_conffiif [ -f /etc/resolv.conf ]; thenchown --reference=/etc/resolv.conf $new_resolv_confchmod --reference=/etc/resolv.conf $new_resolv_conffimv -f $new_resolv_conf /etc/resolv.conffi}# set host nameset_hostname() {local current_hostnameif [ -n "$new_host_name" ]; thencurrent_hostname=$(hostname)# current host name is empty, '(none)' or 'localhost' or differs from new one from DHCPif [ -z "$current_hostname" ] ||[ "$current_hostname" = '(none)' ] ||[ "$current_hostname" = 'localhost' ] ||[ "$current_hostname" = "$old_host_name" ]; thenif [ "$new_host_name" != "$old_host_name" ]; thenhostname "$new_host_name"fififi}# run given scriptrun_hook() {local scriptlocal exit_statusscript="1ドル"if [ -f $script ]; then. $scriptfiif [ -n "$exit_status" ] && [ "$exit_status" -ne 0 ]; thenlogger -p daemon.err "$script returned non-zero exit status $exit_status"fireturn $exit_status}# run scripts in given directoryrun_hookdir() {local dirlocal exit_statusdir="1ドル"if [ -d "$dir" ]; thenfor script in $(run-parts --list $dir); dorun_hook $script || trueexit_status=$?donefireturn $exit_status}# Must be used on exit. Invokes the local dhcp client exit hooks, if any.exit_with_hooks() {exit_status=1ドル# Source the documented exit-hook script, if it existsif ! run_hook /etc/dhclient-exit-hooks; thenexit_status=$?fi# Now run scripts in the Debian-specific directory.if ! run_hookdir /etc/dhclient-exit-hooks.d; thenexit_status=$?fiexit $exit_status}# This function was largely borrowed from dhclient-script that# ships with Centos, authored by Jiri Popelka and David Cantrell# of Redhat. Thanks guys.add_ipv6_addr_with_DAD() {${ip} -6 addr replace ${new_ip6_address}/${new_ip6_prefixlen} \dev ${interface} scope global valid_lft ${new_max_life} \preferred_lft ${new_preferred_life}if [ ${dad_wait_time} -le 0 ]then# if we're not waiting for DAD, assume we're goodreturn 0fi# Repeatedly test whether newly added address passed# duplicate address detection (DAD)for i in $(seq 1 ${dad_wait_time}); dosleep 1 # give the DAD some timeaddr=$(${ip} -6 addr show dev ${interface} \| grep ${new_ip6_address}/${new_ip6_prefixlen})# tentative flag == DAD is still not completetentative=$(echo "${addr}" | grep tentative)# dadfailed flag == address is already in use somewhere elsedadfailed=$(echo "${addr}" | grep dadfailed)if [ -n "${dadfailed}" ] ; then# address was added with valid_lft/preferred_lft 'forever',# remove it${ip} -6 addr del ${new_ip6_address}/${new_ip6_prefixlen} \dev ${interface}exit_with_hooks 3fiif [ -z "${tentative}" ] ; thenif [ -n "${addr}" ]; then# DAD is overreturn 0else# address was auto-removed (or not added at all)exit_with_hooks 3fifidonereturn 0}# Invoke the local dhcp client enter hooks, if they exist.run_hook /etc/dhclient-enter-hooksrun_hookdir /etc/dhclient-enter-hooks.d# Execute the operationcase "$reason" in### DHCPv4 HandlersMEDIUM|ARPCHECK|ARPSEND)# Do nothing;;PREINIT)# The DHCP client is requesting that an interface be# configured as required in order to send packets prior to# receiving an actual address. - dhclient-script(8)# ensure interface is up${ip} link set dev ${interface} upif [ -n "$alias_ip_address" ]; then# flush alias IP from interface${ip} -4 addr flush dev ${interface} label ${interface}:0fi;;BOUND|RENEW|REBIND|REBOOT)set_hostnameif [ -n "$old_ip_address" ] && [ -n "$alias_ip_address" ] &&[ "$alias_ip_address" != "$old_ip_address" ]; then# alias IP may have changed => flush it${ip} -4 addr flush dev ${interface} label ${interface}:0fiif [ -n "$old_ip_address" ] &&[ "$old_ip_address" != "$new_ip_address" ]; then# leased IP has changed => flush it${ip} -4 addr flush dev ${interface} label ${interface}fiif [ -z "$old_ip_address" ] ||[ "$old_ip_address" != "$new_ip_address" ] ||[ "$reason" = "BOUND" ] || [ "$reason" = "REBOOT" ]; then# new IP has been leased or leased IP changed => set it${ip} -4 addr add ${new_ip_address}${new_subnet_mask:+/$new_subnet_mask} \${new_broadcast_address:+broadcast$new_broadcast_address} \dev ${interface} label ${interface}if [ -n "$new_interface_mtu" ]; then# set MTU${ip} link set dev ${interface} mtu ${new_interface_mtu}fi# if we have $new_rfc3442_classless_static_routes then we have to# ignore $new_routers entirelyif [ ! "$new_rfc3442_classless_static_routes" ]; then# set if_metric if IF_METRIC is set or there's more than one routerif_metric="$IF_METRIC"if [ "${new_routers%% *}" != "${new_routers}" ]; thenif_metric=${if_metric:-1}fifor router in $new_routers; doif [ "$new_subnet_mask" = "255.255.255.255" ]; then# point-to-point connection => set explicit route${ip} -4 route add ${router} dev $interface >/dev/null 2>&1fi# set default route${ip} -4 route add default via ${router} dev ${interface} \${if_metric:+metric$if_metric} >/dev/null 2>&1if [ -n "$if_metric" ]; thenif_metric=$((if_metric+1))fidonefifiif [ -n "$alias_ip_address" ] &&[ "$new_ip_address" != "$alias_ip_address" ]; then# separate alias IP given, which may have changed# => flush it, set it & add host route to it${ip} -4 addr flush dev ${interface} label ${interface}:0${ip} -4 addr add ${alias_ip_address}${alias_subnet_mask:+/$alias_subnet_mask} \dev ${interface} label ${interface}:0${ip} -4 route add ${alias_ip_address} dev ${interface} >/dev/null 2>&1fi# update /etc/resolv.confmake_resolv_conf;;EXPIRE|FAIL|RELEASE|STOP)if [ -n "$alias_ip_address" ]; then# flush alias IP${ip} -4 addr flush dev ${interface} label ${interface}:0fiif [ -n "$old_ip_address" ]; then# flush leased IP${ip} -4 addr flush dev ${interface} label ${interface}fiif [ -n "$alias_ip_address" ]; then# alias IP given => set it & add host route to it${ip} -4 addr add ${alias_ip_address}${alias_subnet_mask:+/$alias_subnet_mask} \dev ${interface} label ${interface}:0${ip} -4 route add ${alias_ip_address} dev ${interface} >/dev/null 2>&1fi;;TIMEOUT)if [ -n "$alias_ip_address" ]; then# flush alias IP${ip} -4 addr flush dev ${interface} label ${interface}:0fi# set IP from recorded lease${ip} -4 addr add ${new_ip_address}${new_subnet_mask:+/$new_subnet_mask} \${new_broadcast_address:+broadcast$new_broadcast_address} \dev ${interface} label ${interface}if [ -n "$new_interface_mtu" ]; then# set MTU${ip} link set dev ${interface} mtu ${new_interface_mtu}fi# if there is no router recorded in the lease or the 1st router answers pingsif [ -z "$new_routers" ] || ping -q -c 1 "${new_routers%% *}"; then# if we have $new_rfc3442_classless_static_routes then we have to# ignore $new_routers entirelyif [ ! "$new_rfc3442_classless_static_routes" ]; thenif [ -n "$alias_ip_address" ] &&[ "$new_ip_address" != "$alias_ip_address" ]; then# separate alias IP given => set up the alias IP & add host route to it${ip} -4 addr add \${alias_ip_address}${alias_subnet_mask:+/$alias_subnet_mask} \dev ${interface} label ${interface}:0${ip} -4 route add ${alias_ip_address} dev ${interface} >/dev/null 2>&1fi# set if_metric if IF_METRIC is set or there's more than one routerif_metric="$IF_METRIC"if [ "${new_routers%% *}" != "${new_routers}" ]; thenif_metric=${if_metric:-1}fi# set default routefor router in $new_routers; do${ip} -4 route add default via ${router} dev ${interface} \${if_metric:+metric$if_metric} >/dev/null 2>&1if [ -n "$if_metric" ]; thenif_metric=$((if_metric+1))fidonefi# update /etc/resolv.confmake_resolv_confelse# flush all IPs from interfaceip -4 addr flush dev ${interface}exit_with_hooks 2fi;;V6ONLY)if [ -n "$old_ip_address" ]; then# flush leased IP${ip} -4 addr flush dev ${interface} label ${interface}fi;;### DHCPv6 Handlers# TODO handle prefix change: ?based on ${old_ip6_prefix} and ${new_ip6_prefix}?PREINIT6)# ensure interface is up${ip} link set ${interface} up# We need to give the kernel some time to active interfaceinterface_up_wait_time=5for i in $(seq 0 ${interface_up_wait_time})do${ip} link show dev ${interface} | grep -q LOWER_UP 2>&1if [ $? -eq 0 ]; thenbreak;fisleep 1done# flush any stale global permanent IPs from interface${ip} -6 addr flush dev ${interface} scope global permanent# Wait for duplicate address detection for this interface if the# --dad-wait-time parameter has been specified and is greater than# zero.if [ ${dad_wait_time} -gt 0 ]; then# Check if any IPv6 address on this interface is marked as# tentative.${ip} addr show ${interface} | grep inet6 | grep tentative \&> /dev/nullif [ $? -eq 0 ]; then# Wait for duplicate address detection to complete or for# the timeout specified as --dad-wait-time.for i in $(seq 0 $dad_wait_time)do# We're going to poll for the tentative flag every second.sleep 1${ip} addr show ${interface} | grep inet6 | grep tentative \&> /dev/nullif [ $? -ne 0 ]; thenbreak;fidonefifi;;BOUND6|RENEW6|REBIND6)if [ "${new_ip6_address}" ] && [ "${new_ip6_prefixlen}" ]; then# set leased IPadd_ipv6_addr_with_DADfi# update /etc/resolv.confif [ "${reason}" = BOUND6 ] ||[ "${new_dhcp6_name_servers}" != "${old_dhcp6_name_servers}" ] ||[ "${new_dhcp6_domain_search}" != "${old_dhcp6_domain_search}" ]; thenmake_resolv_conffi;;DEPREF6)if [ -z "${cur_ip6_prefixlen}" ]; thenexit_with_hooks 2fi# set preferred lifetime of leased IP to 0${ip} -6 addr change ${cur_ip6_address}/${cur_ip6_prefixlen} \dev ${interface} scope global preferred_lft 0;;EXPIRE6|RELEASE6|STOP6)if [ -z "${old_ip6_address}" ] || [ -z "${old_ip6_prefixlen}" ]; thenexit_with_hooks 2fi# delete leased IP${ip} -6 addr del ${old_ip6_address}/${old_ip6_prefixlen} \dev ${interface};;esacexit_with_hooks 0
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。