我有一个脚本,可以计算 IP 地址(使用网关地址)然后更改,
当我使用 sudo 手动启动脚本时,该脚本有效
sudo ./changework.sh
我希望这个脚本在启动时运行
我
sudo cp changework.sh /etc/init.d/changework
sudo chmod+x /etc/init.d/changework
sudo update-rc.d changework defaults
但它不起作用,
我也测试了它
sudo crontab -e
然后添加
@reboot sleep 10 && /home/ubunu/changework.sh
它也不起作用
变更工作
#!/bin/bash
#set interface
interface="enp0s5"
#read current IP address on interface
current_ip=`ifconfig $interface 2>/dev/null|awk '/inet addr:/ {print $3}'|sed 's/Bcast://'`
IP=`cut -f1,2,3 -d"." <<< $current_ip`
lIP=`cut -f4 -d"." <<< $current_ip`
lIP=`expr $lIP - 34`
IP=$IP"."$lIP
#return default gateway
gateway=$(/sbin/ip route | awk '/default/ { print $3 }')
#check if IP is taken using ping
count=`ping -c 1 $IP | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }'`
if [ $count -eq 0 ]; then
#change IP if available
ifconfig $interface down
ifconfig $interface $IP up
ifconfig $interface
#change gateway
ip route add default via $gateway
else
#IP change not possible
echo "IP not available"
fi
有人有解决方案或解决方法吗?谢谢您的帮助或建议
答案1
如果你正在使用 jessie(或后者),我建议你遵循这很好的指南,因为它使用了 systemd 方法。
答案2
如果您已经是 root,请不要使用 sudo。在系统启动时执行脚本的唯一方法是 root。
为什么要将文件全部复制到 /etc/init.d?将其复制到那里一次并保存在那里。然后从那里执行它。- 或者按照 Sandro B 的建议使用从 systemd 调用的脚本。
不要只使用命令。始终提供完整路径。特别是在启动和 cronjobs 中。例如:ifconfig 是 /sbin/ifconfig
您想使用“/bin/ip”而不是“ifconfig”。后者已经过时了。
为什么不使用 /etc/network/interfaces 和 /etc/network/interfaces.d ?(人机界面)特别是“pre-up”,以确保脚本总是在接口启动之前执行。
如果我理解你的意图,那么你希望在网络中使用 dhcp 服务器。如果你提供给服务器的第一个 IP 已被使用,会发生什么情况?
答案3
我改变了我的代码
#!/bin/bash
# /etc/init.d/changework
#set interface
interface="eth1"
#read current IP address on interface
current_ip=`/sbin/ifconfig $interface 2>/dev/null|awk '/inet addr:/ {print $3}'|sed 's/Bcast://'`
IP=`cut -f1,2,3 -d"." <<< $current_ip`
lIP=`cut -f4 -d"." <<< $current_ip`
lIP=`expr $lIP - 34`
IP=$IP"."$lIP
#return default gateway
gateway=$(/sbin/ip route | awk '/default/ { print $3 }')
#check if IP is taken using ping
count=`/bin/ping -c 1 $IP | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }'`
if [ $count -eq 0 ]; then
#change IP if available
/sbin/ifconfig $interface down
/sbin/ifconfig $interface $IP up
/sbin/ifconfig $interface
#change gateway
/bin/ip route add default via $gateway
else
#IP change not possible
echo "IP not available"
fi
然后
sudo crontab-e
并添加
外壳=/bin/bash
@reboot sleep 10 && /home/ubunu/changework.sh
但没有任何帮助,请
答案4
我最终改变了 rc.local 的内容,并且像 @user2563336 一样,我们不需要 root 访问权限,因为登录脚本具有 root 访问权限
#!/bin/bash
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
writeinterfacefile()
{
cat << EOF > $1
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
allow-hotplug eth0
iface eth0 inet static
address $2
#network 192.168.1.0
netmask $3
#broadcast 192.168.1.255
gateway $4
dns-nameservers 8.8.8.8
EOF
#don't use any space before of after 'EOF' in the previous line
}
file="/etc/network/interfaces"
current_ip=`sudo ifconfig eth0 2>/dev/null|awk '/inet addr:/ {print $3}'|sed 's/Bcast://'`
IP=`cut -f1,2,3 -d"." <<< $current_ip`
lIP=`cut -f4 -d"." <<< $current_ip`
lIP=`expr $lIP - 36`
ip=$IP"."$lIP
mask=`sudo ifconfig eth0 2>/dev/null|awk '/inet addr:/ {print $4}'|sed 's/Mash://'`
mask=`cut -f2 -d":" <<< $mask`
gateway=$(/sbin/ip route | awk '/default/ { print $3 }')
#/bin/rm $file
/bin/mv $file /etc/network/BAKinterfaces
/usr/bin/touch $file
writeinterfacefile $file $ip $mask $gateway
/etc/init.d/networking restart
exit 0