在 Ubuntu 22.04 上我有以下脚本
#!/bin/bash
INTERFACE="enx00e04c681730"
echo "Interface: $INTERFACE set to IP $1"
ifconfig $INTERFACE down
ifconfig $INTERFACE $1 netmask 255.255.255.0 up
它应该更改指定适配器的 IP 地址。在我设置执行标志后
chmod ugo+x set_address.sh
我称之为
sudo ./set_address.sh 169.254.1.100
但给定接口的 IP 地址尚未更新。
当我手动运行命令时
sudo ifconfig enx00e04c681730 down
sudo ifconfig enx00e04c681730 169.254.1.100 netmask 255.255.255.0 up
运行正常。但脚本不行。
但如果我现在再次运行实际脚本,就像
sudo ./set_address.sh 192.168.200.100
然后它就可以正常工作了。
如何“修复”此问题,以便脚本即使不ifconfig
首先运行命令也能正常工作?
答案1
您可以尝试下面的脚本,它在我的虚拟机上运行良好。
#!/bin/bash
INTERFACE="enx00e04c681730"
echo "Interface: $INTERFACE set to IP $1"
ip address flush dev $INTERFACE
ip address add $1/24 dev $INTERFACE
ip link set $INTERFACE up
答案2
脚本和运行脚本的方法看起来不错。如果手动命令过程有效但脚本无效,则存在一些与以下方面相关的问题关闭和恢复接口的时间。您可以尝试添加睡觉命令。这可能使系统有足够的时间完成向下操作,然后再继续向上操作。
#!/bin/bash
INTERFACE="enx00e04c681730"
echo "Interface: $INTERFACE set to IP $1"
sudo ifconfig $INTERFACE down
sleep 5 # Adding a 5 sec short delay to allow the interface to go down
sudo ifconfig $INTERFACE $1 netmask 255.255.255.0 up
您可以根据您的系统或特定要求调整睡眠时间。此外,确保分配的 IP 地址在同一个子网作为您正在连接的,并验证DHCP服务器没有将 IP 分配给另一台设备。
此外,在脚本中使用命令的完整路径是一种很好的做法。修改是否配置命令使用完整路径,如/sbin/ifconfig
或/usr/sbin/ifconfig
,以避免脚本的任何潜在问题无法找到命令. 可以使用 找到命令的路径which ifconfig
。