启动时以 root 身份运行 bash 脚本

启动时以 root 身份运行 bash 脚本

我有一个脚本,可以计算 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

相关内容