Нужна помощь в использовании GeekTool с system_profiler и networksetup
Алоха всем,
Я создал небольшой скрипт оболочки bash, который хотел использовать с GeekTool, но у меня были разные результаты при использовании одного и того же скрипта на моем iMac (11,1) и MacBook Pro (8,3). Я извлекаю данные из сети, используя networksetup и system_profiler. Пока что у меня есть несколько вызовов для обоих, но я хотел бы объединить их в один вызов для каждого процесса, создавая переменные для использования в моем сценарии. Вот мой сценарий до сих пор:
# Get Ethernet and Wi-Fi information and display it for GeekTool
WiFi=$(networksetup -getairportnetwork en1 | awk '{print $4 " " $5 " " $6 " " $7 " " $8}')
WiFi_IP=$(networksetup -getinfo Wi-Fi | grep -v IPv6 | awk '/IP address/ {print $3}')
SubMask=$(networksetup -getinfo Wi-Fi | awk '/Subnet mask/ {print $3}')
S2N=$(system_profiler SPAirPortDataType | awk '/Noise/ {print $4 " " $5 " " $6 " " $7 " " $8}')
TRate=$(system_profiler SPAirPortDataType | awk '/Rate/ {print $3 " Mbps"}')
echo -e "\033[4;33m" AirPort
if [ "$WiFi_IP" = "" ];
then echo "Not connected to wireless AP."
else echo -e "Wi-Fi AP: " $WiFi "\nIP Address: " $WiFi_IP "\nSubnet Mask: " $SubMask "\nTransmit Rate: " $TRate
fi
EthIP=$(networksetup -getinfo Ethernet | grep -v IPv6 | awk '/IP address/ {print $3}')
EthSubMask=$(networksetup -getinfo Ethernet | grep -v IPv6 | awk '/Subnet mask/ {print $3}')
echo -e "\033[4;33m" "\nEthernet"
if [ "$EthIP" = "" ];
then echo "Not connected to wired network."
else echo -e "IP Address: " $EthIP "\nSubnet Mask: " $EthSubMask
fi
Когда я создаю оболочку в GeekTool и вписываю путь к моему сценарию, все отлично работает на моем MacBook Pro, но на моем iMac GeekTool отображает результаты один раз, а затем при обновлении (у меня было установлено значение 15 с), результат исчезают и никогда не возвращаются на экран. Хотя я знаю, что то, что у меня есть, работает слишком много вызовов обоим процессам, и я хотел бы объединить его в один вызов на процесс, извлекая нужную информацию в контейнер, такой как массив, из которого я могу получить доступ к указанной желаемой информации.
Другими словами, кто-нибудь знает, как я могу сделать всего один звонок в networksetup, чтобы получить всю информацию, собранную как из -getairportnetwork en1 и -getinfo Wi-Fi, так и из system_profiler SPAirPortDataType (который занимает больше всего - около 5-8 секунд каждый время)?
1 ответ
Я немного изменил сценарий своего инструмента Geek и пропустил функцию "Сигнал к шуму". Вот как выглядит новый файл AirportStatus.sh:
#! /bin/bash
# echo -e "\033[0;30m" echo in black
# echo -e "\033[0;31m" echo in red
# echo -e "\033[0;32m" echo in green
# echo -e "\033[0;33m" echo in yellow
# echo -e "\033[0;34m" echo in blue
# echo -e "\033[0;35m" echo in magenta
# echo -e "\033[0;36m" echo in cyan
# echo -e "\033[0;37m" echo in white
# echo -e "\033[4;37m" echo in white underlined
echo -e "\033[4;33m" "Airport"
# Get Airport status from OS X
Status=$(ifconfig en1 | awk '/status/ {print $2}')
if [ "$Status" = "inactive" ];
then echo -e "\033[0;31m" "Status: " $Status "\nNot connected to wireless AP."
else echo -e "\033[0;32m" "Status" $Status
# Get wireless stats from OS X
WiFi=$(networksetup -getairportnetwork en1 | awk '{print $4 " " $5 " " $6 " " $7 " " $8}')
WiFi_IP=$(networksetup -getinfo Wi-Fi | grep -v IPv6 | awk '/IP address/ {print $3}')
SubMask=$(networksetup -getinfo Wi-Fi | awk '/Subnet mask/ {print $3}')
TRate=$(system_profiler SPAirPortDataType | awk '/Transmit/' | sed 's/[^0-9]//g')
# Get bytes in/out
# get the current number of bytes in and bytes out
myvar1=$(netstat -ib | grep -e en1 -m 1 | awk '{print $7}') # bytes in
myvar3=$(netstat -ib | grep -e en1 -m 1 | awk '{print $10}') # bytes out
#wait one second
sleep 1
# get the number of bytes in and out one second later
myvar2=$(netstat -ib | grep -e en1 -m 1 | awk '{print $7}') # bytes in again
myvar4=$(netstat -ib | grep -e en1 -m 1 | awk '{print $10}') # bytes out again
# find the difference between bytes in and out during that one second
subin=$(($myvar2 - $myvar1))
subout=$(($myvar4 - $myvar3))
# convert bytes to megabytes
mbin=$(echo "scale=2 ; $subin/1048576;" | bc)
mbout=$(echo "scale=2 ; $subout/1048576 ; " | bc)
usedMB=$(echo "scale=2 ; $mbin+$mbout ; " | bc)
AvailBW=$(echo "scale=2 ; $TRate-$usedMB ; " | bc)
echo -e "\033[0;37m" "Wi-Fi AP: " "\033[0;36m" $WiFi "\033[0;37m" "\nIP Address: " "\033[0;36m" $WiFi_IP $3 "\033[0;37m" "\nSubnet Mask: " "\033[0;36m" $SubMask "\033[0;37m" "\nTransmit Rate: " "\033[0;36m" $TRate " Mbps\n" "\033[0;37m" "Data In: " "\033[0;36m" $mbin "Mbps" "\n" "\033[0;37m" "Data Out: " "\033[0;36m" $mbout "Mbps\n" "\033[0;37m" "Available Bandwidth: " "\033[0;36m" $AvailBW " Mbps"
fi
Я проверил наличие активного состояния, предполагая, что оно изначально было неактивным. Если нет, то я вставил массивный оператор if, в котором все переменные инициализированы и вычисления выполнены. Существует только один вызов system_profiler, который извлекает скорость передачи, но я хотел увидеть "скорость линии" моей беспроводной сети. Это работает, не так хорошо, как мне бы хотелось, но это все же было хорошим упражнением, чтобы немного узнать о том, где взять информацию на моем Mac и как использовать awk и see. Мне еще нужно многому научиться, но до сих пор это было захватывающе.