Zápisník

// Čtení výstupu vzdáleného příkazu s Dropbear ssh klientem

Dneska jsem při programování jednoho skriptu narazil na drobný problém s Dropbear SSH klientem (dbclient) na mém domácím OpenWRT routeru. Rád bych zde podotkl, že nemám nejnovější verzi, ale verzi dostupnou v mé OpenWRT instalaci. Přesněji, je to Dropbear v0.53.1. Ale spousta distribucí nemá nejnovější verze, takže budu doufat, že to někomu přijde užitečné.

Mám shell skript, který používá ssh klienta na čtení informací z jiného serveru. Představte si následující kus kódu:

result=`ssh -i key_file user@server remote_command` && {
  echo "Obtained information is $result"
}

Kód způsobí připojení na vzdálený počítač a spuštění příkazu remote_command, který vypíše nějaký text. Tento výstup se přiřadí do proměnné $result. Pokud vzdálený příkaz skončí úspěšně (vrátí návratový kód 0), vypíše se zpráva se získanou hodnotou.

Z nějakého důvodu tento kód nefungoval v rámci skriptu spuštěného cronem. Hodně jsem googlil a našel popis problému v mailinglistu včetně jakéhosi řešení. Důvodem problému je to, že skript spuštěný cronem nemá k dispozici standardní vstup. Díky tomu se dbclient neobtěžuje vypisovat výsledek volání příkazu na výstup, takže proměnné $result je nastavena prázdná hodnota a není vrácen chybový kód.

Toto chování může být simulováno následovně:

ssh -i key_file user@server echo "foo" </dev/null

Nic se nevypíše. OpenSSH klienta (implementace SSH na běžných linuxových distribucích) toto neovlivní a stále funguje tak, jak má.

Nejrychlejší řešení je poskytnout ssh klientovi nějaký standardní vstup, zde postačilo přesměrovaní z /dev/zero. Následující tedy již funguje:

result=`ssh -i key_file user@server remote_command </dev/zero` && {
  echo "Obtained information is $result"
}

Nyní celý skript běží správně, jak samostatně spuštěný, tak i z cronu.

// Špatné načítání hardwarového času v Debian Lenny

Přibližně před více jak rokem jsem updatoval na notebooku na Debian Lenny (současný testing). Bylo to v době, když jsem programoval bakalářku. Kromě menších problémů s KDevelopem se vše povedlo, až na výjimku. Zřejmě kvůli nekompatibilitě mého Compaqu nx6310 se zdejším kernelem se mi začal načítat hardwarový čas při startu systému špatně. Z nějakého důvodu se interpretoval vždy jako UTC (namísto lokálního) a tím se pak ten lokální nastavil o hodinu (v létě o 2) dopředu. Což vadilo dost, protože když jsem čas ručně přeřídil během práce, projekt díky „budoucímu“ času nešel zkompilovat bez „cleanování“ a to zdržovalo. A čas jsem nechtěl nechávat špatně, zkuste si pracovat, když vidíte na hodinách 3:00 :-).

Nejprve jsem se to snažil vyřešit opravováním timezone souborů, parametrem UTC=no ve startovacích skriptech apod. Pak jsem to nechal odležet a nedávno se k tomu vrátil. Při ručním načítání času hwclock vrátil nějakou chybu s /dev/rtc. V man hwclock jsem našel jakýsi parametr, který používá starší způsob načítání. Tím parametrem je --directisa. Ve startovních skriptech /etc/init.d/hwclock.sh a /etc/init.d/hwclockfirst.sh je pro parametry vyhrazena definice proměnné HWCLOCKPARS na začátku souboru. Stačí tedy do ní přidat kýžený parametr, řádek bude vypadat například takto:

HWCLOCKPARS= --directisa

Od té doby načítání času funguje bez problémů. Jaká banalita :-).

// ADSL modem Sagem v Linuxu

Konečně se mi podařilo rozchodit ADSL modem Sagem i na novém linuxovém jádře. Součástí jádra od 2.6.10 je totiž driver ueagle-atm, který se po zavedení snaží najít firmware pro modem. Ten naleznete i s návodem na webu modulu. Je zde podrobný návod v angličtině. Akorát zde píší, že pro některé země (včetně ČR) je nutno extrahovat soubory z ovladače pro Windows. Mně to fungovalo i se standardními. Nevím, třeba se to týká Telecomu před přechodem na PPPoE (v tom se nevyznám, ale na webu modulu stále uvádějí u CZ PPPoA). Po nastavení bridge příkazem br2684ctl -c 0 -b -a 8.48 stačí místo skriptu z návodu pro připojení použít utilitu pppoe, tam zadáte jméno a heslo a příště už stačí zadat příkaz, který utilita na konci vypíše. Bylo to nějak pon dsl-provider. Odpojení pak poff.

Pro starší jádra bez tohoto modulu lze použít ovladač přímo z webu Sagemu. Pouze je nutno změnit nastavení těch 3 parametrů připojení (VPI=8, VCI=48, encapsulation PPPoE LLC). Tento ovladač mi fungoval na jádře 2.6.8. Na 2.4.x jsem modem netestoval.