commando mit o. ohne optionen abfangen
- killerhippy
- Posts: 529
- Joined: 19. May 2000 19:36
- Contact:
commando mit o. ohne optionen abfangen
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?
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
Killerhippy
Re: commando mit o. ohne optionen abfangen
mv apt-get apt-get-bin
vi apt-get
chmod a+x apt-get
vi apt-get
chmod a+x apt-get
- killerhippy
- Posts: 529
- Joined: 19. May 2000 19:36
- Contact:
Re: commando mit o. ohne optionen abfangen
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!
note: code bitte mit ub-code, siehe hilfe, escapen!
Es gibt keine dumme Fragen!
Killerhippy
Killerhippy
Re: commando mit o. ohne optionen abfangen
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.
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.
Re: commando mit o. ohne optionen abfangen
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
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
Re: commando mit o. ohne optionen abfangen
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">
> 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">
Re: commando mit o. ohne optionen abfangen
> 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
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
- killerhippy
- Posts: 529
- Joined: 19. May 2000 19:36
- Contact:
Re: commando mit o. ohne optionen abfangen
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?
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
Killerhippy
Re: commando mit o. ohne optionen abfangen
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
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
Re: commando mit o. ohne optionen abfangen
> 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).
> 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).
- killerhippy
- Posts: 529
- Joined: 19. May 2000 19:36
- Contact:
Re: commando mit o. ohne optionen abfangen
jau, *auf die schulter klopf*, das ist useable, transparent und schon wieder was gelernt, wau, cool.
dankeschoen!
dankeschoen!
Es gibt keine dumme Fragen!
Killerhippy
Killerhippy