Есть много команд более высокого уровня, которые почти сделают то, что вы хотите, но это хорошая демонстрация того, как сделать то же самое в сценарии оболочки. Это должно работать на любой системе, где есть /bin/sh
. Он не зависит ни от каких других команд.
Вы можете сохранить этот сценарий под любым именем, а затем набрать sh ./whatever_you_named_it
для его выполнения.
Я разделил это на две части, Перечисление файлов и Подсчет файлов. Перечисление файлов рекурсивно является самым сложным, но как только у нас есть список, их легко подсчитать.
Listing the Files
Этот скрипт рекурсивно перечисляет все файлы и каталоги в вашем домашнем каталоге или каталоге, который он получает в качестве параметра. При отсутствии параметров по умолчанию используется домашний каталог.
#!/bin/sh
if test $# -eq 0
then
startdir="$HOME"
else
startdir="$1"
fi
for f in "$start"/* # step through all files in the starting directory
do
echo "$f" # print the file name
if test -d "$f" # is the file a directory? (-d)
then
sh "$0" "$f" # yes call this script with the dir as arg
fi
done
Давайте обсудим каждый шаг:
Если скрипту не было передано никаких параметров, то в качестве начального каталога используйте "$HOME", в противном случае используйте первый параметр. ($# содержит количество параметров, переданных этому скрипту, и мы используем встроенную в shell команду test
, чтобы узнать, равно ли оно нулю):
if test $# -eq 0
тогда
startdir="$HOME"
else
startdir="$1"
fi
Итерация по файлам в вашем домашнем каталоге. "$HOME"/*
расширяется до всех не скрытых файлов и каталогов на верхнем уровне вашего домашнего каталога:
for f in "$HOME"/*
do
Выведите имя файла. Думаю, вы знаете echo
:
echo "$f" # вывести имя файла
Вызов встроенной в shell команды test
с опцией -d
. test
возвращает true, если аргумент, "$f"
, является каталогом. Для краткости это чаще всего записывается как [ -d "$f" ]
, но на самом деле это команда. [Поиск "test expr" в sh
man page]:
if test -d "$f" # является ли файл каталогом? (-d)
тогда
В этом следующем утверждении мы повторяемся. Мы запускаем новую копию текущего сценария и передаем ей имя текущего каталога "$f". $0
расширяется до имени файла текущего сценария оболочки. Вместо того чтобы вводить здесь имя файла, мы используем $0
, чтобы этот скрипт работал, даже если его имя изменится. Например, если скрипт назывался rlist
, то можно написать sh rlist "$f"
, но если переименовать скрипт, то он перестанет работать правильно, потому что будет вызывать несуществующий или неправильный скрипт. [См. раздел "Специальные параметры" на странице sh
руководства]:
sh "$0" "$f" # да вызывает этот скрипт с dir в качестве arg
Завершает оператор if
и цикл for
.
fi
done
Подсчет файлов
До сих пор сценарий перечислял файлы, но не подсчитывал их. Если вы хотите получить подсчет всех файлов и каталогов, выполните следующее:
sh ./scriptname | wc -l
wc -l
- это команда "word count", а с опцией -l
подсчитывает только строки. Приведенный выше конвейер выводит число, которое является количеством файлов в вашем домашнем каталоге.
В пространстве пользователя wpa_supplicant
можно управлять с помощью wpa_cli
.
Текущую информацию можно подтвердить с помощью следующей команды.
$ wpa_cli -p /var/run/wpa_supplicant status
Информация status
может использоваться для проверки различной информации о подключенной в данный момент точке доступа.
Я уверен, что вы можете судить об этой информации.
Ниже приведен пример использования. Информация о точке доступа, использованная во время теста, показана ниже.
ssid: test_ap
password: 12345678
Ниже приведен пример использования команды.
Возможно, psk
изменится в соответствии с вашим паролем.
root@test:~# wpa_cli -p /var/wpa status
Selected interface 'wlan0'
bssid=12:34:56:78:90:a1
ssid=test_ap
id=0
passphrase=12345678
psk=?????????????????????????????
mode=station
pairwise_cipher=CCMP
group_cipher=CCMP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
address=11:22:33:44:55:66
signal_level=-22
root@test:~#
Если вы хотите узнать, к какой сети вы подключены, вы также можете использовать BSSID для ее идентификации. Обычно это MAC-адрес точки доступа (, нотация :xx:xx:xx:xx:xx:xx
). Это зависит от системы, как найти BSSID. ifconfig
обычно показывает эту информацию для BSD и, возможно, других систем Unix.
Вы также можете использовать параметр bssid
для дальнейшего ограничения выбора точки доступа, чтобы это не сбивало с толку.
Пример:
network={
ssid="My network"
bssid=00:11:22:33:44:55
...
}
В случае, если вы просто забыли, какая конфигурация является правильной (, это означает, что у вас есть только одна сеть/AP )прокомментируйте один блок конфигурации (используйте#
)и посмотрите, не запрошен ли еще запрос wpa соединяется.
Первая попытка будет выглядеть так:
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
#Disable wifi direct
p2p_disabled=1
network={
ssid="SameSSID"
psk="12345678"
id_str="CorrectPSK"
}
#network={
# ssid="SameSSID"
# psk="00000000"
# id_str="WrongPSK"
#}
Затем перезапустите wpa _саппликант и посмотрите, соединяется ли он с точкой доступа. Если это не так, это другая конфигурация в другом блоке network { }
, которая является допустимой.