У меня есть сценарий, который вычисляет 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
это тоже не работает
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
Может ли кто-нибудь найти решение или обходной путь, и спасибо за любую помощь или предложение
Я закончил тем, что изменил содержимое 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
я изменил свой код
#!/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
но ничего не помогите пожалуйста
Не используйте sudo, если вы уже являетесь пользователем root. И единственный способ выполнить скрипт при запуске системы - это root.
Зачем все копирование файла в /etc/init.d? Скопируйте его туда один раз и храните там. Затем выполните его оттуда. - Или используйте скрипт, вызываемый из systemd, как было предложено Сандро Б.
Не используйте только команды. Всегда указывайте полный путь. Особенно при загрузке и в cronjobs. Например: ifconfig - это / sbin / ifconfig
Вы хотите использовать «/ bin / ip» вместо «ifconfig». Последний устарел.
Почему вы не используете / etc / network / interfaces и /etc/network/interfaces.d? (человек интерфейсы). Особенно "pre-up", чтобы убедиться, что скрипт всегда выполняется до запуска интерфейса.
Если я правильно понимаю ваше намерение, вы хотите использовать DHCP-сервер в своей сети. Что произойдет, если первый IP-адрес, который вы дадите своему серверу, уже используется?
Если вы на Джесси (или более поздней версии), я бы посоветовал следовать этот хорошее руководство, так как в нем используется системный подход.