LINUX.ORG.RU
ФорумAdmin

помогите написать bash скрипт

 ,


0

1
#!/bin/sh

get_mtu_static () {
    local IF=$1 MTU # ПЛОХО ПОНИМАЮ
    arp -i $IF | grep -ci xx:xx:xx:xx:xx:xx && MTU=2000 #home
    arp -i $IF | grep -ci xx:xx:xx:xx:xx:xx && MTU=1500 #cafe
    # НЕ ПОНИМАЮ КАК РАБОТАЕТ, НУЖНО ЧТОБЫ ФУНКЦИЯ ВОЗВРАЩАЛА $MTU ИЛИ НИЧЕГО
}

IF=enp5s0
MTU_MAX=9000

if ЕСЛИ get_mtu_static ВОЗВРАЩАЕТ $MTU использовать возвращаемый # ЗДЕСЬ ОЧЕНЬ СЛОЖНО МНЕ
then
    MTU=get_mtu_static $IF # ЗДЕСЬ ОЧЕНЬ СЛОЖНО МНЕ
else
    MTU=$MTU_MAX
fi

if [ "$MTU" -ne "$(cat /sys/class/net/$IF/mtu)" ]
then
    ip link set $IF mtu $MTU
fi

нужна помощь



Последнее исправление: why (всего исправлений: 12)

Ответ на: комментарий от Shulman

если mac есть в сети установить mtu статичный, а если mac не обнаружен в сети то установить mtu максимальный

why
() автор топика

пока сделал так

get_mtu_static () {
        local IF=$1
        unset MTU_RETURN
        arp -i $IF | grep -ci xx:xx:xx:xx:xx:xx && MTU_RETURN=2000 #home
        arp -i $IF | grep -ci xx:xx:xx:xx:xx:xx && MTU_RETURN=1500 #cafe
}

get_mtu_static $IF
if [ ! -z "$MTU_RETURN" ]
then
    	MTU=$MTU_RETURN
else
    	MTU=$MTU_MAX
fi

why
() автор топика
Последнее исправление: why (всего исправлений: 1)
Ответ на: комментарий от Shulman

т.е. нужно подобие этого

MTU=$(get_mtu_static $IF)

why
() автор топика

Будь проще, пиши напрямую, что хочешь. Зачем эти функции, условия, которые не понимаешь?

MTU=9000 # максимум
arp -i $IF | grep -ci xx:xx:xx:xx:xx:xx && MTU=2000 # изменит переменную MTU, если home
arp -i $IF | grep -ci xx:xx:xx:xx:xx:xx && MTU=1500 # изменит, если cafe
ip link set $IF mtu $MTU
anonymous
()

ping6

arp лучше наверно заменить на что-нибудь типа ip neigh show dev "$IF", раз уж вы дальше тоже используете ip.

А на момент запуска этого скрипта в arp-таблице что-то вообще будет?

Я бы попробовал вместо этой возни с ARP сделать: ping -I "$IF" fe80::4f62:35d0:xxxx:yyyy, проставив нужные вам количество пакетов, таймауты и локальный адрес (который как раз привязан к MAC) и по коду возврата или выполнить изменение MTU, или игнорировать.

LeNiN ★★
()

вот до чего сверхразум пока смог додуматься

#!/bin/sh

get_mtu_static () {
	local IF=$1
	unset MTU
	ip neigh show dev $IF | grep -ci xx:xx:xx:xx:xx:xx && MTU=2000 #home
	ip neigh show dev $IF | grep -ci xx:xx:xx:xx:xx:xx && MTU=1500 #cafe
}


for IF in wlp4s0 enp5s0   # $(ls /sys/class/net/)
do
	if [ "1" -eq "$(cat /sys/class/net/$IF/type)" ]
	then

		unset MTU

		get_mtu_static $IF

		if [ -z "$MTU" ]
		then

			if [ "wlp4s0" == "$IF" ]
			then
				MTU=2262
			fi

			if [ "enp5s0" == "$IF" ]
			then
				MTU=9000
			fi

		fi

		if [ ! -z "$MTU" ]
		then
			if [ "$MTU" -ne "$(cat /sys/class/net/$IF/mtu)" ]
			then
				ip link set $IF mtu $MTU
			fi
		fi

	fi
done
продолжение следует

why
() автор топика
Последнее исправление: why (всего исправлений: 1)

option interface-mtu

А ещё можно MTU раздавать с DHCP-сервера. Вот для ISC DHCPD:

option interface-mtu 9000;
LeNiN ★★
()
Ответ на: option interface-mtu от LeNiN

но как эту опцию считать потом, у меня code26='2000' на роутере

why
() автор топика
Последнее исправление: why (всего исправлений: 1)
Ответ на: комментарий от why

Тамада хороший и конкурсы веселые

Хорошие сети и MTU в них динамичные :) Надеюсь, что ты это делаешь на сервере перед увольнением в качестве квеста для следующего админа.

Почему не сделать просто

get_mtu_static () {
arp -ni "$1" | awk -v M=9000 '$3 == "xx:xx:xx:xx:xx:xx"{M=2000} \
   $3 == "yy:yy:yy:yy:yy:yy"{M=1500}END{print M}'
}

MTU="`get_mtu_static $IF`"

Если это клиенит и адрес он получает через dhcp, то в клиенте есть хуки которые можно использовать для задания MTU

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.