Когда я пытаюсь определить, используется ли мой выбранный интерфейс для 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, но я сомневаюсь в этом.