commando mit o. ohne optionen abfangen

Post Reply
Message
Author
User avatar
killerhippy
Posts: 529
Joined: 19. May 2000 19:36
Contact:

commando mit o. ohne optionen abfangen

#1 Post by killerhippy »

Hi lug,

ist es moeglich, zb. das debian apt-get kommando abzufangen, sodass die option install abgefangen und geloggt wird, alle anderen wie zb. search jedoch nicht?

Ziel ist folgendes: Installation von debian bei einem newbie, der natuerlich selbst sachen macht, ohne genau bescheid zu wissen.
informativ soll er natuerlich machen was er will, jedoch moechte ich gerne nachinstallationen von software in einem logfile finden koennen, zb. dadurch, dass

apt-get install tollesoftware

durch

apt-get install tollesoftwaere | tee /var/spool/logdir/<$DATE>apt-get.install.tollesofware

substituiert wird.
kann man da einen alias setzen oder muss man das kommando wrappen und fuer beides gilt:

Wie macht man das am schlauesten?
Es gibt keine dumme Fragen!

Killerhippy

etwa so?

Re: commando mit o. ohne optionen abfangen

#2 Post by etwa so? »

mv apt-get apt-get-bin
vi apt-get
chmod a+x apt-get

User avatar
killerhippy
Posts: 529
Joined: 19. May 2000 19:36
Contact:

Re: commando mit o. ohne optionen abfangen

#3 Post by killerhippy »

etwa so ist mir schon klar, was schlaegst du an intelligenz zwischen "vi atp-get" und "chmod a+x apt-get" vor?

note: code bitte mit ub-code, siehe hilfe, escapen!
Es gibt keine dumme Fragen!

Killerhippy

rattengift

Re: commando mit o. ohne optionen abfangen

#4 Post by rattengift »

ich kenn deb zwar nicht, aber das problem ist ja allgemein.
wenn ich recht verstehe müsste das neue script nur prüfen, ob in den parametern "install" vorkommt. wenn nein, gibt er sie direkt weiter ans original apt-get, wenn nicht, zusätzlich mit dem logging. ist das richtig so?

also
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
PLUS=""
PAKET=$2 # ($2 falls der paketname immer an 2.pos)

for PARAM; do
if [ "$PARAM" = "install" ]; then
DATUM=$(date +%Y-%m-%d)
PLUS=" | tee /var/spool/logdir/$DATUM.apt-get.install.$PAKET"
fi
done

apt-get-bin $* $PLUS
</font><hr></pre></blockquote>

habs nicht ausprobiert, du musst halt ggf noch etwas rumfummeln.

Jochen

Re: commando mit o. ohne optionen abfangen

#5 Post by Jochen »

Ich behaupte jetzt einfach mal, dass es so nicht gehen wird. Die Pipeline in der Variablen "PLUS wird nicht als solche zum Zug kommen, da die Shell die Zerlegung in Kommandos schon abgeschlossen hat, bevor die Variablensubstitution beginnt. Alternativ-Vorschlag:

Als allererstes den Namen von apt-get unverändert lassen, statt dessen unter /usr/local/bin (/usr/local/sbin?) ein Skript gleichen Namens anlegen und die PATH-Variable um das entsprechende Verzeichnis am Anfang ergänzen.

/usr/local/bin/apt-get wäre dann beispielsweise<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">#!/bin/bash
if [ $1 = "install" ] ; then
/usr/bin/apt-get "$@" | tee /var/log/logdir/apt-install.$(date "+%s")
else
/usr/bin/apt-get "$@"
fi

exit $?
</font><hr></pre></blockquote>Also nur, wenn das erste Argument "install" ist, mit tee mitloggern. An das File wird die Anzahl der Sekunden seit 1.1.1970 GMT angehängt; so wird wenigstens automatisch sortiert, die Zeit lässt sich mittels date leicht umrechnen und die Zeitstempel der Datei sagen ja auch was aus..

Nur bin ich jetzt schon müde und den Fall, dass er irgenwelche Optionen mit angibt, habe ich übersehen. Die müssen dann natürlich erst mal überlesen werden... Aber nicht mehr heute.

Jochen

rattengift

Re: commando mit o. ohne optionen abfangen

#6 Post by rattengift »

Hi Jochen,

> Die Pipeline in der Variablen "PLUS wird nicht als solche zum Zug kommen, da die Shell die Zerlegung in Kommandos schon abgeschlossen hat, bevor die Variablensubstitution beginnt.

du hast (wie immer <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">) recht.

> if [ $1 = "install" ]; then

ok, wenn install immer der erste parameter ist (ich kenne apt-get wie gesagt - noch - nicht), kann man sich das scannen der parameterliste natürlich schenken.

> An das File wird die Anzahl der Sekunden seit 1.1.1970 GMT angehängt; so wird wenigstens automatisch sortiert, die Zeit lässt sich mittels date leicht umrechnen

hier finde ich meine lösung aber doch besser: das datum wird im "sql-format" erzeugt, was auch automatische sortierung gewährleistet.

> Nur bin ich jetzt schon müde

was, um diese zeit schon müde?!

> und den Fall, dass er irgenwelche Optionen mit angibt, habe ich übersehen.
> Die müssen dann natürlich erst mal überlesen werden...

aber genau das macht doch das for-loop. einen kompromiss aus beiden skripts könnte etwa so aussehen:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/bin/sh
INST=false

for PARAM; do
[ "$PARAM" = "install" ] && INST=true
done

if [ "$INST" = "true" ]; then
/usr/bin/apt-get "$@" | tee /var/log/logdir/apt-install.$(date +%Y-%m-%d)
else
/usr/bin/apt-get "$@"
fi

exit $?
</font><hr></pre></blockquote>
oder hab ich nun wieder irgendwas übersehen? <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Jochen

Re: commando mit o. ohne optionen abfangen

#7 Post by Jochen »

> was, um diese zeit schon müde?!

Tja, bin momentan nicht ganz fit, muss mir irgendwo was gefangen haben.

Eigentlich bin ich bei solchen Skripten ein wenig nickelig, denn man stelle sich vor, ein Paket mit Namen "install" soll deinstalliert werden. Dann greift das Skript, obwohl es das in diesem Fall nicht soll. Aber wenn man in diesem Fall damit zufrieden ist, den wichtigsten Teil korrekt abgedeckt zu haben, will ich mal mein Korinthenkackertum hinten an stellen... <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Aber einen echten Kritikpunkt habe ich noch: Meine Datumsangabe sorgt dafür, dass bei mehreren Aufrufen pro Tag jeweils ein eigenes Logfile geschrieben wird. Bei Deiner Variante wird es immer überschrieben, wenn am Tag mehrfach mit "apt-get install" gearbeitet wird. Das wäre am einfachsten mit der Option -a (append) zu tee zu lösen, so dass die Endfassung ungefähr so aussieht:<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">#!/bin/sh
INST=false

for PARAM; do
[ "$PARAM" = "install" ] && INST=true
done

if [ "$INST" = "true" ]; then
/usr/bin/apt-get "$@" | tee -a /var/log/logdir/apt-install.$(date +%Y-%m-%d)
else
/usr/bin/apt-get "$@"
fi

exit $?
</font><hr></pre></blockquote>OK?

Jochen

User avatar
killerhippy
Posts: 529
Joined: 19. May 2000 19:36
Contact:

Re: commando mit o. ohne optionen abfangen

#8 Post by killerhippy »

Hi denker,

vielen dank fuer die gehirnarbeit, von der special variable PARAM hatte ich noch nie was gelesen, damit ist die loesung ja recht elegant.

jochen's loesung fuer das zeitproblem finde ich auch sehr schoen, schliesslich muss ich keine informationen ueber die uhrzeit kriegen, die tagesinfo reicht aus zur orientierung.

erste experimente liefen sehr schoen, dabei ist mir aber aufgefallen, das tee errormessages _nicht_ mitloggt :( also ist ein `1>file 2>&1` als additiv wohl besser, oder?
Es gibt keine dumme Fragen!

Killerhippy

Jochen

Re: commando mit o. ohne optionen abfangen

#9 Post by Jochen »

Na ja, dann eben so:<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">#!/bin/sh
INST=false

for PARAM; do
[ "$PARAM" = "install" ] && INST=true
done

if [ "$INST" = "true" ]; then
/usr/bin/apt-get "$@" 2>&1 | tee -a /var/log/logdir/apt-install.$(date +%Y-%m-%d)
else
/usr/bin/apt-get "$@"
fi

exit $?</font><hr></pre></blockquote>
Ausserdem gibt es keine Spezial-Variable PARAM; das ist einfach eine spezielle Form der for-Schleife. Ohne explizit mittels "in" angegebenen Liste der zu verwendenden Werte geht die for-Schleife immer über alle Parameter des Shell-Skriptes. Analoge Schreibweise wäre

for ARG in "$@"

Jochen

rattengift

Re: commando mit o. ohne optionen abfangen

#10 Post by rattengift »

> Aber einen echten Kritikpunkt habe ich noch: Meine Datumsangabe sorgt dafür, dass bei mehreren Aufrufen pro Tag jeweils ein eigenes Logfile geschrieben wird.
> Bei Deiner Variante wird es immer überschrieben, wenn am Tag mehrfach mit "apt-get install" gearbeitet wird.

richtig. ursprünglich hatte ich ja noch den paketnamen im filenamen, aber auch das ginge natürlich nur dann gut, wenn man nicht das gleiche paket an einem tag mehrfach zu installieren versucht (was ja durchaus vorkommen kann).

User avatar
killerhippy
Posts: 529
Joined: 19. May 2000 19:36
Contact:

Re: commando mit o. ohne optionen abfangen

#11 Post by killerhippy »

jau, *auf die schulter klopf*, das ist useable, transparent und schon wieder was gelernt, wau, cool.

dankeschoen!
Es gibt keine dumme Fragen!

Killerhippy

Post Reply