[Megoldva]bash lekérdezés

Még ugyan semmi nincs belőle, de elgondolkodtam hogy kéne írnom egy kis scriptet miszerint pld. hetente megnézné van-e új kiadás az Opera-developerből, majd azt letöltené, és fel is telepítené.
Amin biztos elcsúsznék az a lekérdezés.
A feltelepített program verzió számát gondoltam összevetni hogy van-e frissebb a szerveren.
ftp://ftp.opera.com/pub/opera-developer/

Bár van dátum is. Viszont mindenhogy kérdés hogy miként szedjem le pont azt, ami kell?
Félreértés ne essék, nem komplett megoldást keresek, csak hogy hogyan hasonlítsam össze és jelöljem ki a legfrissebbet?
Amihez nem értek az a sed. Pedig ide biztos az kell.

Talán az utolsó telepítés, és az aktuális időhöz legközelebbi időpontot kell figyelembe vennem. Nem is tudom melyik lenne az egyszerűbb?

Hozzászólások

Ehhez nagyon hasonlót csináltam magamnak. :) Én Fedorához a Koji build szerverről szedek le néha csomagokat, amelyek még nincsenek az update repóban. File listából awk-val szedd ki a verziószámokat. Van a sort parancsnak -V opciója, ez verziószám szerint rendez sorba. Lehet fordított sorrendbe rendezni:

sort -rV

Ekkor a lista első eleme lesz a legfrissebb. Ha ezen egy sor után teszed az aktuális verziódat, ezt egy változóban eltárolod, utána csinálsz egy

sort -urV

rendezést, akkor épp visszakapod az előbbi stringedet, ha frissíteni kell, hiszen még mindig az első sor marad a frissebb, a második az aktuális, régi. Ha viszont változik a tárolthoz képest a string, akkor vagy a gépeden lévő változat a frissebb, vagy azonos a verziószám, de a -u unique miatt egy sor lesz ebben az esetben belőle, tehát változik a string. Ekkor nem kell frissíteni.

A wget, curl, aria2c parancsok valamelyikével megoldod a letöltést, csomagkezelővel, vagy ki tudja, mivel a telepítést, su -c paranccsal pedig a root joggal futtatást, jelszó kérést.

Kihagytam valamit? :)

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

De akár abból is ke lehet indulni, hogy időben rendezve van, így az info könyvtárat figyelembe nem véve, az utolsó sor kell (grep -v és tail).

Just for fun:

 curl -s ftp://ftp.opera.com/pub/opera-developer/ | grep -v info | sed -rn '$ s,.*([0-9]{2}\.[0-9]\.[0-9]{4}\.[0-9]*),ftp://ftp.opera.com/pub/opera-developer/\1/linux/opera-developer_\1_amd64.deb,p'

Hello!
Valami gáz van.
down_url="${server}${new_version}/${os}"
ha visszanézem a -x paraméterrel:
+ down_url=$'ftp://ftp.opera.com/pub/opera-developer/32.0.1899.0\r/linux'
A verziószám után betesz nekem két karaktert: \ r
Ha tovább viszem a dolgot, és szétbontom hogy legyen architektúrára is változó. akkor a változóba beteszem az "amd64"-et a down_url-be meg odabiggyeszteném eléje az alsóvonást: _${arch} és az alsóvonás elé is
32.0.1899.0\r_amd64 odakerül a két karakter.
Mert gondoltam összegyűjtöm az útvonalat a változókból, mivel nem akartam direktben megadni a wgetnek, hátha nem eszi meg.

down_url="${server}${new_version}/${os}/${name}_${new_version}_${arch}.${ext}"

Ez lesz belőle:

+ down_url=$'ftp://ftp.opera.com/pub/opera-developer/32.0.1899.0\r/linux/opera-developer_32.0.1899.0\r_amd64.deb'

Valahol a new_version-nál akad el.

Azt meg így kérdeztem le:
wget --no-remove-listing ${server} >/dev/null 2>&1
new_version=$(cat .listing | awk '{print $9}' | grep -v info | sort -rV | head -n1)

Igaz, már tegnap megoldottam, sőt az egész flottul működik. Bár biztos lehetne egyszerűsíteni. Érdekes módon a
su $USER -c parancs nem oldotta meg a dolgot. Nem volt engedélyem.
Tehát maradt a sima su -c parancs; parancs

Tehát mindenképpen beavatkozásra van szükség a script lefutása során. Nevezetesen a jelszó beírása miatt.
Ha cronba teszem hogy jelenik meg egy terminál, hogy kiírja az üzeneteket, meg hogy bekérje a jelszót?

A

su $USER -c parancs

Éppen $USER nevében fut amúgy is a parancs, így ennek semmi értelme.

su - -c parancs

jó, de nyilván kell a root jelszó. De ez miért is baj? Amúgy a visudo a barátod, ha jelszó nélkül akarod, de én nem tenném.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Ebből indultam ki:

#!/bin/bash

whoami
su -c whoami
whoami

Kéri a jelszót. Ha a sajátodat adod meg, akkor hitelesítési hiba. Ha a root-ét akkor elméletileg meg is kaptad a jogokat, de az újabb whoamira már nincs meg.

De ha tudnál inkább arra mondani valamit amit az utolsó sorban írtam. Jelenleg az izgat.

A második whoami már sima user joggal fut, hiszen visszatért a su. Egyébként tud standard inputról jelszót fogadni:

su - -c 'echo; whoami; echo $EUID' <<<'ez_a_jelszo'

Viszont ekkor a script root:root 0700-as jogú legyen, különben bárki elolvashatja a root jelszót. Bár még ezzel a joggal is elég meredeknek gondolom a root jelszó plain textben tárolását.

Hülyeséget írtam. Ha root:root 0700, akkor futtatni sem lehet sima felhasználóként. Ellenben, ha olvasható felhasználóként, akkor a jelszó is, ami meg nem jó. Marad az, hogy a sudoers-ben javítasz.

Másik trükkös megoldás, hogy írsz egy root joggal futó shell daemon-t, ez egy named pipe-ot (fifo) olvasgat néha - tehát pollingolja -, parse-olja, sima user joggal írják a fifo-t, s ha arra kap utasítást, root joggal elvégzi a daemon, amit kell. Nem bármilyen parancsot, csak előre definiáltakat. Ha bármit elvégezhetne, akkor a user bármire root jogot kapna közvetve. Tapasztalatból írom, ilyet csináltam a live linuxomban. :)

Cronból szerintem ne indíts terminált, mert be lehet jelentkezve több felhasználó, lehet :0, :1, stb. display is, de lehet, hogy nem is fut az X, szóval nem triviális ez.

Linuxon is lehet - én használom is -, hogy belépsz egy felhasználóval a grafikus felületen, elindítasz egy programot, az fut, zárolod a képernyőt, utána new session, ez indítja a display managert, belépsz másik - pl. vendég - felhasználóval, ő használja a gépet ugyanazon screen-en, de másik display-en.

Ekkor felmerül, hova tedd a terminált. Meg mi van, ha nem lépett be senki, csak a display manager van a képernyőn. Vagy az sem, mert konzolon léptek be. Vagy ott sem, mert várja a konzol logint. Vagy be vannak lépve X-en, aztán konzolon is, de másik konzolra kapcsolva loginra vár. :)

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Szerintem sokszor a bash dolgai túl kevesek. Lassú és olvashatatlan a kód. Én már nem nyúlnék shell-hez ha nem nagyon minimális a megoldandó feladat. Inkább magasabb szintű script nyelv.

Látnád az interaktív "videómagnómat." :-) Nincs videómagnóm de van (volt) tvkártyám, S ahhoz írtam egy (több) scriptet, mely kérdéseket tesz fel, ezért interaktív. Miszerint mit, honnan, mikor, milyen kodeccel, mekkora felbontással, időzítve, vagy anélkül vegyen fel.
S ez akkor is működött ha be sem volt kapcsolva a gép. Mivel bekapcsolta magát, felvette a műsort, és leállt.
Nekem később már csak annyi volt a dolgom hogy avidemuxszal kivágjam belőle a reklámokat illetve a film elején és végén hagyott + perceket.
Én nem tanultam soha semmilyen programozást, a sok netezéssel, fórumozással tarkított idő volt az amely összehozta ezt.

S igen láttam már perl-t, de az még meredek számomra. Elég csak belenéznem az xmltv perl fájljába mely a tévékártyának készített epg -t.
Pld. ez itt a magyar tévéé.

Nincs túl nagy kedvem ebbe belemenni, de maradjunk annyiban egy jól megírt shell-scripthez a legtöbb embernél hiányzk a tudás: azaz hogy mit is lehet megcsinálni a shell eszközeivel, illetve milyen dolgokra mit érdemes használni. És valóban lehet olvashatatlan kódot írni, de perlben pl. sokkal könnyebb. Szerintem a perl/python/ruby/php/js/... pont ugyanezekkel a hátrányokkal rendelkezik: lehet benne olvashatatlan kódot írni, tud lassú lenni, és meg kell tanulni a rendszert/nyelvet, és csak akkor lehet hatékonyan használni.

Ez az a bonyolultság, amit én már tuti perlben akarnék megcsinálni. sed-del html-t parse-olni szopás.

Gondoltam beszúrom ide, mivel nem nagy. Hátha valakit érdekel. Az /etc/cron.weekly-be téve hetente leellenőrzi hogy van-e újabb Opera fejlesztői változat, és feltelepíti ha nincs.
Ha jelenleg sincs akkor is felteszi. Mind a 32 mind a 64 bites rendszeren működik. A stabil Operának nincs 32 bites változata.
S úgy vettem észre hogy a fejlesztői változat sem omlik azért össze olyan sűrűn.

Figyelem!
Ez csak az rpm alapú disztrókhoz jó. S mivel nincs is rpm csomag, így csak ez a megoldás működik.

Ha valaki ismer gyorsabb szervert mint az Opera sajátja, az szóljon. Majd 5 perc kell neki hogy leszedje a 40-43M csomagot.


#!/bin/bash

clear

name="opera-developer"
server="ftp://ftp.opera.com/pub/opera-developer/"
version=$(opera-developer --version)
os="linux"
arch=$(uname -i)
ext="deb"

if [ "${arch}" = "x86_64" ]; then
arch="amd64"
libpath="lib64"
else
arch="i386"
libpath="lib"
fi

# make temp folder
workdir=/tmp/$(awk 'BEGIN { srand (); print rand() }')
mkdir -m 700 "${workdir}"

cd ${workdir}
wget --no-remove-listing ${server} >/dev/null 2>&1
new_version=$(cat .listing | awk '{print $9}' | grep -v info | sort -rV | head -n1 | tr -d '\r')

if [[ ${version} < ${new_version} ]]; then
# echo "Available the new version - ${new_version}"
# download
wget ${server}${new_version}/${os}/${name}_${new_version}_${arch}.${ext}
new_version="${name}_${new_version}_${arch}.${ext}"
# extract
ar -x ${new_version}
tar xJf data.tar.xz
# delete old opera-developer
rm -fr /usr/${libpath}/${name}
# copy the new opera-developer
cp -r ${workdir}/usr/${libpath}/${arch}-linux-gnu/${name} /usr/${libpath}/
chmod 4755 /usr/${libpath}/${name}/opera_sandbox
# del temp folder (workdir)
rm -rf ${workdir}
fi
exit