#!/bin/sh
# Setup portforwarding on router depending on interface running scripts from a directory 10.0.0.30 being eth0 represented by folder 30 and 10.0.0.31 being wlan0 represented by folder 31
eth0_status=$(cat /sys/class/net/eth0/operstate)
wlan0_status=$(cat /sys/class/net/wlan0/operstate)
if [ "$eth0_status" = "up" ] && [ "$wlan0_status" = "down" ] ;
then
CURRDEV=eth0
fi
if [ "$eth0_status" = "down" ] && [ "$wlan0_status" = "up" ] ;
then
CURRDEV=wlan0
fi
if [ "$eth0_status" = "down" ] && [ "$wlan0_status" = "down" ] ;
then
CURRDEV=
fi
if [ "$CURRDEV" = "eth0" ] ;
then
run-parts "/opt/portmapper/30"
echo "Current device Ethernet"
elif [ "$CURRDEV" = "wlan0" ] ;
then
run-parts "/opt/portmapper/31"
echo "Current device WiFi"
else
echo "No changes need to be made to port mappings"
fi
Сценарий в настоящее время работает, но чтобы это было меньше загрузки, мне нужна проверка переменной, чтобы препятствовать тому, чтобы части выполнения выполнили каждый раз выполнения сценария. Мне только нужен он для выполнения однажды, когда устройство изменяется от одного до другого и не неоднократно каждый раз, когда я заявляю portmappings путем запущения скрипта.
Примером сценария отображения порта, который я имею в/opt/portmapper/30|31 каталоге 30 или 31 каталога, является eth0 набора устройств Ethernet или wlan0 соответственно.
#!/bin/sh
exec java -jar /opt/portmapper/portmapper.jar -lib org.chris.portmapper.router.sbbi.SBBIRouterFactory -add -protocol TCP -internalPort 443 -externalPort 443 -ip 10.0.0.30 ; sleep 2 ;
fi
Я первоначально еще вытянул его из этого рабочего сценария в/etc/NetworkManager/dispatcher.d/-, часть не работает. Я должен работать над этим также. Заметьте, что эта часть имеет [[]] вместо []. Если я помещаю одиночные скобки сюда, сценарий не работает.
#!/bin/bash
# Enable/disable wlan0 depending on eth0 and wlan0 current state
eth0_status=$(cat /sys/class/net/eth0/operstate)
wlan0_status=$(cat /sys/class/net/wlan0/operstate)
if [[ "$eth0_status" = "up" ]];
then
nmcli con down id "wlan0"
elif [[ "$wlan0_status" = "down" ]] && [[ "$eth0_status" = "down" ]];
then
nmcli con up id "wlan0"
else
nmcli nm eth0 on
nmcli nm wlan0 off
fi
В основном то, что Вы хотите, должно изменить порт, отображающийся до run-parts
каждый раз интерфейсные используемые изменения, старающиеся не работать run-parts
, если бы используемый интерфейс не изменился, так как прошлый раз run-parts
был выполнен.
необходимо будет сохранить последний интерфейс в состоянии использования где-нибудь и каждый раз, когда скрипт запущен, сравнивают текущий интерфейс, используемый с этим так или иначе; этот сценарий делает это (он обновляет текущий интерфейс, используемый в /opt/mapper/prevdev
каждый раз, когда изменение происходит):
#!/bin/sh
eth0_status=$(cat /sys/class/net/eth0/operstate)
wlan0_status=$(cat /sys/class/net/wlan0/operstate)
touch /opt/portmapper/prevdev # Creates /opt/portmapper/prevdev if it doesn't exist
prevdev=$(cat /opt/portmapper/prevdev)
if [ "$eth0_status" = "up" ] && [ "$wlan0_status" = "down" ]; then # We're currently on Ethernet
currdev=eth0
fi
if [ "$eth0_status" = "down" ] && [ "$wlan0_status" = "up" ]; then # We're currently on WiFi
currdev=wlan0
fi
if [ "$currdev" != "$prevdev" ]; then # The interface in use has changed since the last time we checked
if [ "$currdev" = "eth0" ]; then # We're currently on Ethernet
run-parts /opt/portmapper/30
echo 'Current device and portmappings are on Ethernet'
echo 'eth0' >/opt/portmapper/prevdev # Updates /opt/mapper/prevdev
else # We're currently on WiFi
run-parts /opt/portmapper/31
echo 'Current device and portmappings are on WiFi'
echo 'wlan0' >/opt/portmapper/prevdev # Updates /opt/mapper/prevdev
fi
else
echo 'No changes need to be made to port mappings'
fi