Назад | Перейти на главную страницу

Запуск сценария bash от имени пользователя root при загрузке

У меня есть сценарий, который вычисляет 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-адрес, который вы дадите своему серверу, уже используется?

Если вы на Джесси (или более поздней версии), я бы посоветовал следовать этот хорошее руководство, так как в нем используется системный подход.