Portál AbcLinuxu, 7. května 2025 17:18
mtd
zapisovat.
Pripravil jsem si k tomu 2 skripty . Prvni nakopiruje pres ssh potrebne soubory a spusti druhy skript na cilovem stroji. V tomto druhem skriptu mam cast, ktera ma provest kontrolu, jestli se jedna o spravny typ routeru a az pak zacne provadet zapis. Zde je cele zneni skriptu, vcetne popisu funkce a toho kde na ni nastava problem:
#!/bin/sh workdir=$PWD firmware=$PWD/firmware.mtd1.bin boardinfo=$(cat /proc/cpuinfo | grep machine) model="Archer C6 v3" ## Kontrola, jestli je pripraven soubor s firmware pro obnovu. if [ -f "$firmware" ]; then echo "Nalezen soubor pro instalaci."; else echo "Soubor nenalezen. Spustte znovu skript router_setup.sh" && exit fi sleep 2 ## Flash samotneho obrazu s konfiguraci a balicky echo "Bude provedena obnova konfigurace." read -p $'Press enter to continue...\n' echo "##################################" echo "### ###" echo "### PROBIHA OBNOVA KONFIGURACE ###" echo "### ! NEVYPINEJTE NAPAJENI ! ###" echo "### ###" echo "##################################" ## Kontrola retezce "Archer C6 v3" v /proc/cpuinfo (testovaci, nedestruktivni cast na overeni spravne funkce kontroly). <-- Selhava na tom, ze tzv. "here redirection <<<" neni v OpenWrt shellu "ash" podporovana. ## Psalo mi to "<<< unknown operand". V BASH na linuxu nebo ZSH na OSX vsak funkce normalne funguje if grep -q "$model" <<< "$boardinfo"; then echo "TEST OK"; else echo "NOT OK" fi ## Kontrola retezce "Archer C6 v3" a flash balicku s upravenym firmware ## if grep -q "$model" <<< "$boardinfo"; then ## mtd write $firmware firmware; else ## echo "Balicek neni urcen pro tento model a revizi" ## echo "Pouzijte odpovidajici balicek" ## fi ## Kontrola retezce "Archer C6 v3" v /proc/cpuinfo pomoci "if []" <-- Taky neni funkcni, dostavam chybu ":: unknown operand". ## Zjisteno ze chyba nastane hned na prvnim radku nasledujici funkce: if [ $boardinfo = $model ]; then echo "TEST OK"; else echo "NOT OK" fiPro jistotu jsem si skript nechal zkontrolovat pomoci utility
shellcheck
, chybu podle nej nemam, myslim si vsak, ze bude nastavat nekde chyba v parsovani vystupu z /proc/cpuinfo. Nicmene i po delsim hledani na google a zkoumani jak napsat test sekvenci, kontrolujici retezec, si dale uz nevim rady a budu rad, kdyz me navedete, kde delam chybu..
Diky za vas cas a odpovedi.
cat /proc/cpuinfo | grep machineked mozem dat rovno:
grep machine /proc/cpuinfoK problemu - skus:
if echo "$boardinfo" | grep "$model" >/dev/null; then ...
UUoC vzniká logicky z „cat soubor... sakra to je dlouhé, ještě potřebuju grep/less - šipka nahoru, |grep aaa“. UUoC je použitelnější, protože „cat soubor|grep foo... sakra potřebuju hledat bar, ne foo - šipka nahoru, ←←←, bar“. UUoC brání překvapivému a nečekanému chování u nástrojů pracujících inplace (gzip a bzip2 co smažou originální soubor pokud si na to člověk nevzpomene a nedá -k). UUoC brání nahodilému přepsání při neoscapování grep "Jenda>" irc.logA jinak je problém v uvozovkách a může snadno nastat i v bashi (si představ že v té proměnné bude napsáno
-o 1 -eq 1
, což bude každý [ interpretovat jako or).
A jinak já do openwrt dávám bash pokud si můžu dovolit spotřebovat asi 300 kB nebo kolik má. Naštěstí máme všude Mikrotiky s 16MB flash, takže můžu.
if [ "$boardinfo" = "$model" ]; then ..
binwalk
nebo Firmware mod kit (https://github.com/openwrt-stuff/firmware-mod-kit), mi v tomto moc nepomohly.
Jinak dnes jsem si overil ze mtd
kontroluje, jestli je image kompletni. Pri dnesnim flashovani jednoho routeru jsem omylem nahral prazdny soubor se jmenem toho firmware a mtd
vyhodil chybu ze soubor je chybny (nevim ted presne cele zneni, ale bylo tam cosi o chybe CRC) a dale odmitl pokracovat, takze toto je osetreno. Co osetreno neni je to, ze pokud by nahodou nekdo flashnul soubor s upravenym FW treba do starsi revize Archer C6, ktera ma Atheros chipset, tak by ji tim bricknul, proto ta kontrola na retezec modelu.
#/bin/bash profile="tplink_archer-c6-v3" target="ramips" subtarget="mt7621" file="openwrt-imagebuilder-${target}-${subtarget}.Linux-x86_64.tar.xz" dir="${file/.tar.xz}" [[ -d ${dir} ]] || { [[ -f "${file}" ]] && rm "${file}" wget "https://downloads.openwrt.org/snapshots/targets/${target}/${subtarget}/${file}" tar xf "${file}" exit } cd ${dir} ln -f bin/targets/${target}/${subtarget} -s OUT mkdir -p ADD package_enable="luci luci-i18n-base-cs luci-theme-material bash openssh-client openssh-server openssh-sftp-server" package_disable="-dropbear" files_add="ADD" make image PROFILE=${profile} PACKAGES="${package_enable} ${package_disable}" FILES="${files_add}" echo "Result image's in ${dir}/OUT dir..."s tim ze do adresare ADD pridas soubory v adresarove strukture jak ma byt v /
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.