我有一个“无头”*NIX 主机(我们称之为“foo”),可通过 SSH 和 VNC-tunneled-over-SSH 在任意 192.168.xy/24 私有 LAN 上访问。有时,我想将“foo”从一个 LAN 物理移动到另一个 LAN,因此“x”取决于 LAN,并且我希望“y”保持不变,并有一个有序的备选方案列表来处理分配争用。
因此,尽管我想要一个静态地址(以 SSH 为目标),但我还需要它是动态的(以匹配它所连接到的 LAN 的子网)。
是的,一些路由器允许“特殊功能”,例如 DHCP 保留或额外的路由配置,但假设我无法访问路由器,但我可以期望它提供 DHCP。
因此,如果我要手动执行此操作,我会将“foo”设置为在启动时使用 DHCP,一旦我获得 shell,我就可以查看网关地址以找出我的子网 192.168.x.0,其中“x”因 LAN 而异;然后我会编辑“/etc/network/interfaces”(或等效文件)以从 DHCP 切换到静态,从“x”和常量“y”合成地址(首先 ping 192.168.xy 以检查它是否被占用,如果是,则从预定义选项列表中选择下一个“y”,因此在不太理想的情况下,我可能必须在运行 SSH 时尝试多个地址),然后重新启动网络服务。
一种更棘手的变化是缺少 DHCP 的 LAN;在这种情况下,可以通过对一些 LAN 流量进行采样来猜测子网。
如果这样的设置可以自动化,那么“foo”就可以简单地连接到任意 LAN 并启动,并且很有可能第一次尝试就找到它的 IP 地址。
有没有什么聪明的方法可以实现我想要的效果?
请记住,所有配置都必须在主机“foo”上完成,并且对其所连接的目标 LAN 的唯一假设是它使用 192.168.xy/24 私有子网。
答案1
可能存在一些错误,但足以完成所需的工作。
以 root 身份运行。
#!/bin/bash
ARPCOUNT=10
LOCALNET=`route | grep default | awk '{print $2}' | cut -f1-3 -d'.'`
NETMASK=`route | grep default | awk '{print $3}'`
DEVICE=`route | grep default | awk '{print $8}'`
for ((xval=100; xval<254; xval++ )) ; do
CURIP=$LOCALNET.$xval
arping -c $ARPCOUNT $CURIP > /dev/null
ARPRESULT=$?
if ! [ $ARPRESULT ] ; then
echo "No IP found at $CURIP."
else
route
ifconfig $DEVICE down
ifconfig $DEVICE $LOCALNET.$xval netmask $NETMASK
ifconfig $DEVICE up
route
echo "Changed to IP $CURIP."
exit
fi
done