Как определить, является ли интерфейс Ethernet с помощью команды ip - PullRequest
0 голосов
/ 12 июля 2019

Когда я пытаюсь определить, используется ли мой выбранный интерфейс для Ethernet, с помощью команды ip, которую он показывает ether как в интерфейсе WiFi, так и в интерфейсе Ethernet, как определить, какой интерфейс Ethernet?

Я начал писать некоторые программы, чтобы заменить другие большие программы, которые я не полностью использую, и работаю над написанием программы для замены nm-applet.Программа, которую я пишу, написана на 100% сценарием оболочки UNIX (не BASH, ZSH, FISH и т. Д., А сценарий оболочки UNIX).Мне удалось выяснить практически все проблемы, которые мне нужно решить, но у меня возникли некоторые проблемы с окончанием.Итак, наброски для программы следующие (я только добавляю наброски, чтобы вы могли лучше понять, как работает эта программа и что она должна делать) все, что с - было решено:

# Outline:

* list available network interfaces -

* ask which interface the user would like to use -

* check if the interface is for Ethernet

* check if the selected interface is up or down, if down set the interface up -

* scan for available networks -

* ask which network the user would like to use -

* check if the network is open or requires a password

* if the network is open connect, else if the network is WPA (closed) then ask for the password

* associate the interface with desired network -

* connect to the network -

* if the script is run with the -s option, then save the network information in wpa_supplicant -

Я работаю над решением check if the interface is for Ethernet.Когда я начал писать это, я перешел от команды ifconfig к команде ip, так как ip легче анализировать и форматировать.Проблема, с которой я столкнулся, заключается в том, что мне нужно проверить, используется ли интерфейс, заданный ip, если он используется для ethernet.Итак, чтобы получить представление о том, какие ip-выходы я запускал:

ip link show

, однако, под моей картой WiFi и моей картой Ethernet есть это:

link/ether

Мой вопрос, как я могу на самом деле проверить, является ли интерфейс на самом деле интерфейс Ethernet с помощью IP?Я знаю, как сделать это с помощью ifconfig, но не могу понять это по ip.

Мой текущий скрипт выглядит следующим образом:

#!/bin/sh

save_nwid=0

while [ $# -gt 0 ]; do
    key="$1"
    case "$key" in
        -s|--save)
            save_nwid=1
            shift
            ;;
    esac
done

setup_interface() {
    # list network interfaces
    iface=$(ip link show | awk '{if (NR % 2 == 1) print $2}' | sed -e 's/://' | awk -F: '{printf "%s, ",$1 }' | sed 's/\(.*\),/\1/')

    # pick interface
    echo "interfaces found: $iface"
    echo "which interface would you like to use? "

    read -r inet

        # check if interface is Ethernet (this is not how to do it)
        ip link show "$inet" | grep "ether"

    # check if interface is up or down
    state=$(ip link show "$inet" | awk '{print $9}')

    if [ "$state" = DOWN ]; then
        sudo ip link set "$inet" up
    fi
}

scan_networks() {
    # scan for networks
    echo "scanning available networks..."
    nets=$(sudo iw $inet scan | grep 'SSID' | sort -u | awk -F: '/SSID/ {printf "%s\n",$2 }' | sed -e '/^SSID/d' -e '/^[[:space:]]*$/d')
    printf "networks found:\n%s\n" "$nets"
}

connect_network() {
    # pick SSID and SSID Password
    echo "which network would you like to connect to? "
    read -r ssid

    echo "what is the network password? "
    read -r key

    # associate the interface with desired SSID
    sudo iwconfig "$inet" essid "$ssid"

    # save connection details if -s passed
    if [ $save_nwid -eq 1 ]; then
        save_network
    fi
}

save_network() {
    sudo sh -c ' echo
    "network {
        ssid="$ssid"
        psk="$psk"
    }" ' >> /etc/wpa_supplicant/wpa_supplicant.conf
}

check_connection() {
    ping_cmd="ping"
    ping_url="duckduckgo.com"

    $ping_cmd -c 3 $ping_url > /dev/null
    if [ $? -eq 0 ]; then
        echo "connection made."
    else
        echo "connection failed."
    fi
}

setup_interface
scan_networks

connect_network
check_connection

Я ожидал, что в ip link show будетEthernet где-то как в ifconfig, но, к сожалению, это не так.Я не уверен, что ether означает, что оба могут быть использованы для Ethernet, но я сомневаюсь в этом.

...