Почему задержка после ifconfig вниз необходима прежде при изменении MAC-адреса?

Когда я недавно установил Fedora 15, была опция для минимальной установки. Я просто нажал тот переключатель. Другой выбор был (если я помню правильно), Настольная Установка, Установка Сервера, Установка Разработчика.

3
30.08.2013, 10:03
3 ответа

Еще не может прокомментировать, таким образом, я надеюсь, что мое взятие прольет некоторый свет на Ваше наблюдаемое поведение. В целом я не рекомендовал бы использовать ifconfig для игры с интерфейсными настройками в соответствии с Linux. Это было де-факто "удержано от использования" более чем десять лет назад. Однако очевидно, это должно все еще работать, в то время как дистрибутивы продолжают поставлять ifconfig и маршрут.

Могли Вы проверять, изменяет ли этот подход поведение, Вы видите:

#!/usr/bin/env bash

INTF=eth0
INTERFACE_STATUS=$(cat /sys/class/net/${INTF}/operstate)
echo "$INTERFACE_STATUS"

if [ "$INTERFACE_STATUS" == "up" ]; then
    echo "Putting down ${INTF}"
    # if you need to remove all IP addresses associated with ${INTF}
    sudo ip addr flush dev ${INTF}
    # set the interface status down
    sudo ip link set dev ${INTF} down
    # flush neighbour cache
    sudo ip neigh flush dev ${INTF}
    # flush routing cache entries pertaining to ${INTF}
    sudo ip route flush table cache dev ${INTF}
    echo "New state: $(cat /sys/class/net/${INTF}/operstate)"
fi

sudo ip link set dev ${INTF} address "91:91:91:91:91:91"
sudo ip link set dev ${INTF} up

ПРИЛОЖЕНИЕ 1: Читая Вашу обратную связь, Вы могли бы хотеть предложить больше информации о своей установке маршрутизации. Я вскопал некоторые старые сценарии, которые я переписал десятилетие назад. Этот должен показать, что таблица маршрутизации произвела подобный netstat (корень необходим для выполнения этого):

#!/usr/bin/env bash

# 08/2000: Initial code to beautify iproute2 routing table output
# 08/2013: Updated it for the new decade and removed swearing.

: ${IPTOOL:=/sbin/ip}
: ${DEBUG:=0}

print_format="%-18s %-15s %-18s %-8s %-6s %-10s\n"

if [ "x$1" == "x-v" -o "x$1" == "x--verbose" ]; then
    DEBUG=1
fi

dbg_log(){
    if [ $DEBUG -eq 1 ]; then
        echo "$*"
    fi
}

printme(){
    if [ "x$via" == "x" -a $src_route -eq 0 ]; then
        via="0.0.0.0"
    fi
    if [ "x$src" == "x" ]; then
        src=$(${IPTOOL} addr show dev $dev label $dev | awk '/inet/ {print $2}')
        src=${src%%/*}
    fi
    printf "$print_format" "$net" "$via" "$src" "$dev" "$type" "$table_id"
}

eval_route(){
    not_parsed=0

    while read net rest; do
        if [ $src_route -eq 0 ]; then
            src=
            type=
        fi
        table_id="${TABLE_ID}"
        dev=
        via=
        set -- $rest
        while [ $# -ne 0 ]; do
            case $1 in
                proto)  shift 1;;
                scope)  shift 1;;
                metric) shift 1;;
                dev)    shift 1; dev=$1;;
                via)    shift 1; via=$1;;
                src)    shift 1; src=$1
                   # As soon as I've figured out, how to get back the
                   # interface/label definition from a given src IP
                   # I will adjust this ugly hack. --rn, 08/2000
                   if [ "x${src%.*}" != "x${net%.*}" ]; then
                       dev=$(${IPTOOL} addr show dev $dev to $src | \
                           awk -v check_ip=${temp_ip%%/*} 'BEGIN {/$check_ip/} END {print $7}')
                   fi
                   ;;
                *) dbg_log "option $1 not parsed"; not_parsed=1;;
            esac
            shift 1
        done
        # Check for 'throw, blackhole, unreachable, prohibit'
        # Since we only check for non-numeric strings, we have
        # to exclude the default target too.
        if [ "x${net//[0-9.]/}" == "x$net" -a "x$net" != "xdefault" ]; then
            type=${net:0:2}
            type=${type~~}
            net=$rest
            dev="all"
            src="0.0.0.0/0"
            not_parsed=0
        fi
        [ $not_parsed -eq 0 ] && printme
        not_parsed=0
    done < <(${IPTOOL} route show table $TABLE_ID)
}

src_route=0
printf "$print_format" "Destination" "Gateway" "Source" "Iface" "R_Type" "RT_table"
while read RULE_ID rest; do
    RULE_ID=${RULE_ID//:/}
    fromIP=
    toIP=
    TABLE_ID=
    set -- ${rest}
    while [ $# -ne 0 ]; do
        case $1 in
            from)   fromIP=$2  ; shift 2;;
            to)     toIP=$2    ; shift 2;;
            lookup) TABLE_ID=$2; shift 2;;
            *)                   shift 1;;
        esac
    done
    if [ $RULE_ID -ne 0 ]; then
        dbg_log "+------------------[RULE: $RULE_ID]------------------+"
        if [ "x$fromIP" != "xall" ]; then
            src_route=1
            src="$IP"
            type=SR
        fi
        eval_route
        src_route=0
    fi
done < <(${IPTOOL} rule show)
-1
27.01.2020, 21:32
  • 1
    Если ifconfig удерживается от использования, что мы должны использовать вместо этого? –  wchargin 25.08.2013, 00:42
  • 2
    iproute2 платформа, которая была представлена в ядре 2.1.x. Можно найти больше документации здесь. –  Moreaki 25.08.2013, 00:55
  • 3
    @Moreaki спасибо за Ваше предложение, но Это не работало. Посмотрите мое последнее редактирование. Ваши работы сценария для подобной второй и после использования его моя сеть недостижимы. –  piotrekkr 28.08.2013, 10:13
  • 4
    Ну, от того, что я вижу, если Вы не добавляете IP-адрес при увольнении Вас устройство снова (после сбрасывания всех IP-адресов) не будут работать вещи. Так, или добавьте IP-адрес в сценарий или не выполняйте строку sudo ip addr flush dev ${INTF} в моем отрывке, когда я подсказал в своем комментарии. –  Moreaki 28.08.2013, 13:25
  • 5
    @Moreaki я добавил маршрутизацию в своем последнем редактировании. Комментарий строки, которую Вы предложили, не работал. Я буду благодарен за другие предложения. –  piotrekkr 29.08.2013, 10:44

Я не думаю, что задержка требуется. Перед подавлением интерфейса необходимо смочь физически разъединиться от старого MAC-адреса. Я нахожусь на беспроводной связи в данный момент, таким образом, я не могу проверить это прямо сейчас, но смотреть на ifconfig - справка. Что-то вроде этого?:

ifconfig <interface> del <address>

На беспроводной связи, когда я разъединяюсь, я запускаю немного скрипта, который очищает все, включая MAC-адрес AP:

sudo dhcpcd --release "$INTERFACE"
sudo iwconfig "$INTERFACE" essid off
sudo iwconfig "$INTERFACE" ap off
sudo ifconfig "$INTERFACE" down
1
27.01.2020, 21:32

Задержка перевода в нерабочее состояние интерфейса, вероятно, связана с драйвером и/или аппаратными средствами для интерфейса. Если это корректно, то нет никакого стандартного способа знать, когда драйвер или аппаратные средства действительно подавили интерфейс.

Прочитывая остальную часть поиска и устранения неисправностей больше, это кажется, что мог быть конкурирующий процесс в игре - особенно часть об интерфейсе, возвращающемся "самостоятельно". Возможно, существует инструмент, который работает и откладывает интерфейс после попытки удалить его?

Это было бы немного хитро для обнаружения, но не невозможное. Я не могу думать ни о каком быстром и простом способе предположить, что Вы могли обнаружить его.

1
27.01.2020, 21:32

Теги

Похожие вопросы