在bash脚本中更改网络IP是从NFS挂载的文件夹开始的

时间:2012-08-27 16:29:41

标签: linux bash ip nfs

我写了一个简单的Bash脚本来更改Linux主机的网络地址:

#!/bin/sh
REMOTE_HOST=192.168.2.127   # Default Host address
NEW_IP=192.168.30.33        # New IP I want to set
NEW_GW=192.168.30.1         # New Gateway I want to set

sudo ifconfig eth0 192.168.2.1     # Moving to the right network...
#ping $REMOTE_HOST -c 3            # I can correctly ping the host here...

ssh-copy-id root@${REMOTE_HOST} > /dev/null   # ...for my comfort...

# Setting the network with new values for the IP addr and the GW...
COMMAND="sed -i 's@address *\\([0-9.]\\+\\)@address ${NEW_IP}@' /etc/network/interfaces\
      && sed -i 's@gateway *\\([0-9.]\\+\\)@gateway ${NEW_GW}@' /etc/network/interfaces"

ssh root@${REMOTE_HOST} $COMMAND
# done!

# Now restart the network services:
ssh root@${REMOTE_HOST} "/etc/init.d/networking restart &" &   # (Note the 2nd '&' !!!)

# Come back to my old IP
sudo ifconfig eth0 192.168.30.10
sudo route add default gw 192.168.30.1

这个脚本几乎完美无缺,但是:

1)如果我从我的主文件夹运行它,没有问题;如果我从NFS共享文件夹运行它,脚本会挂起一两分钟才能正确结束

2)如果我省略第二个'&'当在主机上重新启动网络时,命令永远不会返回...

问题是:

1)导致漫长等待的原因是什么(NFS,不同的IP地址,不同的网关)?是否有可能解决它?

2)为什么会这样?我怎么能避免它?

感谢您提供任何帮助,并对我糟糕的英语表示抱歉!

1 个答案:

答案 0 :(得分:0)

您正在重新启动网络服务,这会丢弃所有活动连接。

Bash会逐行读取您正在运行的文件。由于NFS是网络文件系统,因此将终止与文件的连接。因此系统在networking restart之后执行行,等待(实际上不能),直到重新建立连接。

相反,您应首先制作整个脚本的本地副本,然后在本地运行它。 您也可以为此编写脚本; - )