normads
Anmeldungsdatum: 27. Mai 2014
Beiträge: Zähle...
|
Heyo, Ich will ein kleines Shell script schreiben um mein Nas zu mounten. Es soll nur gemountet werden wenn es in meinem Heimnetzwerk ist. Meine Idee war: if [ iwgetid -r == "AP21107" ]; Um zu überprüfen ob ich im richtigen Netzwerk bin. Die zweite Frage ist wie stelle ich den fest ob das Nas bereits gemountet worden ist, denn ich habe vor mit sleep alle 5 min zu überprüfen ob ich im richtigen Netzwerk bin. mfg David und vielen Dank schonmal
|
Benno-007
Anmeldungsdatum: 28. August 2007
Beiträge: 29240
Wohnort: Germany
|
Hallo. normads schrieb: Ich will ein kleines Shell script schreiben um mein Nas zu mounten.
▶ Shell/Bash-Skripting-Guide für Anfänger
Es soll nur gemountet werden wenn es in meinem Heimnetzwerk ist. Meine Idee war: if [ iwgetid -r == "AP21107" ]; Um zu überprüfen ob ich im richtigen Netzwerk bin.
So ähnlich vielleicht, lies obigen Link.
Die zweite Frage ist wie stelle ich den fest ob das Nas bereits gemountet worden ist, denn ich habe vor mit sleep alle 5 min zu überprüfen ob ich im richtigen Netzwerk bin.
Geht mit mount:
mount
mit grep. Und nun lies besser erst mal und dann leg einen kleinen Entwurf vor, dann kann man sehn, was man draus machen kann. Grüße, Benno
|
normads
(Themenstarter)
Anmeldungsdatum: 27. Mai 2014
Beiträge: 9
|
Hey, also das Script sieht momentan so aus #!/bin/bash
while true; do # endlosschleife
if [ iwgetid -r == "AP21107" ] # überprüfen ob richtiges Netzwerk
then
if [ mount -l | grep -ci //192.168.0.50/Public != 1 ] # überprüfen ob bereits gemountet
then
mount -t cifs -o username=david,password=passwort,uid=1000,gid=1000,file_mode=0660,dir_mode=0770 //192.168.0.50/Public /media/david/Data
notify-send "Mit Nas Verbunden"
fi
fi
sleep 300; done # 5 min warten Der Fehler lautet Zeile 3: [: Zu viele Argumente. Das wird wohl daran liegen das er mit iwgetid -r vergleicht und nicht mit der Ausgabe von iwgetid -r die nämlich Richtig wäre. mfg David und vielen Dank schonmal
|
Benno-007
Anmeldungsdatum: 28. August 2007
Beiträge: 29240
Wohnort: Germany
|
Du bist ja schon weit. ☺ Probier es mal so:
if [ "$(iwgetid -r)" == "AP21107" ]
Du kannst da nur Variablen vergleichen und so machst du kurzerhand eine draus. ☺ Details findest du in diesem Abschnitt von Shell/Bash-Skripting-Guide für Anfänger (Abschnitt „Variablen-Teil-2“). Grüße, Benno
|
hugin_grimnirson
Anmeldungsdatum: 6. November 2010
Beiträge: 55
Wohnort: Wien
|
Ich schätze mal, dass die Zeile wohl
if [ $(iwgetid -r) == "AP21107" ]
heissen müsste, alternativ eventuell auch noch
if [ `iwgetid -r` == "AP21107" ] normads schrieb: Das wird wohl daran liegen das er mit iwgetid -r vergleicht und nicht mit der Ausgabe von iwgetid -r die nämlich Richtig wäre.
Stimmt genau. In deinem Fall vergleicht er nicht das Ergebnis des Befehles mit dem folgenden String, sondern den String "iwgetid" und den String "-r" mit dem Namen des AP. Und nachdem das drei Strings sind ⇒ "Zu viele Argumente". Such mal nach dem Stichwort "Kommandosubstitution shell script". EDIT: OK, zu spät, wohl zeit zum schlafen gehen 😉
|
g00d.morning
Anmeldungsdatum: 20. Februar 2013
Beiträge: 330
|
Hallo normads, ...das gilt auch für Deine nächste Abfrage: if [ $(mount -l | grep -ci //192.168.0.50/Public) != 1 ] So kann die Ausgabe von grep -c verglichen werden. Einfacher ist aber direkt den Exit-Status von grep zu prüfen: if ! mount -l | grep 192.168.0.50/Public > /dev/null (Und da Du ja höchstwahrscheinlich über die Groß- und Kleinschreibung Deiner Mountpunkte bescheid weißt, kannst Du Dir den --ignore-case (-i ) auch noch sparen.) Grüße Benno-007 schrieb: Du kannst da nur Variablen vergleichen und so machst du kurzerhand eine draus.
Du vergleichst hier aber überhaupt keine Variablen sondern zwei Strings 😉
|
g00d.morning
Anmeldungsdatum: 20. Februar 2013
Beiträge: 330
|
hugin grimnirson schrieb: [...] alternativ eventuell auch noch
if [ `iwgetid -r` == "AP21107" ]
Das ist eine veraltete Alternative 😉
|
Benno-007
Anmeldungsdatum: 28. August 2007
Beiträge: 29240
Wohnort: Germany
|
g00d.morning schrieb: Hallo normads,
Benno-007 schrieb: Du kannst da nur Variablen vergleichen und so machst du kurzerhand eine draus.
Du vergleichst hier aber überhaupt keine Variablen sondern zwei Strings 😉
...wovon einer in einer Variable steckt, sonst braucht man keinen Vergleich von Konstanten. 😉
|
g00d.morning
Anmeldungsdatum: 20. Februar 2013
Beiträge: 330
|
...wovon einer in einer Command substitution "steckt". Ist allerdings falsch formuliert: der Befehl gibt etwas aus, dass von test als String verabeitet wird. In der Programmierung ist eine Variable ein abstrakter Behälter für eine Größe. - oder: ohne Behälter keine Variable. Gute Nacht.
|
normads
(Themenstarter)
Anmeldungsdatum: 27. Mai 2014
Beiträge: 9
|
Alles klar das Script funktioniert jetzt | #!/bin/bash
while true; do # endlosschleife
if [ "$(iwgetid -r)" == "AP21107" ] # überprüfen ob richtiges Netzwerk
then
if [ $(mount -l | grep -c //192.168.0.50/Public) != 1 ] # überprüfen ob bereits gemountet
then
mount -t cifs -o username=david,password=passwort,uid=1000,gid=1000,file_mode=0660,dir_mode=0770 //192.168.0.50/Public /media/david/Data
notify-send "Mit Nas Verbunden"
fi
fi
sleep 300; done # 5 min warten
|
mfg David und vielen Dank für die Zahlreiche Hilfe Bearbeitet von rklm: Passendes Syntaxhighlighting genutzt. Bitte nutze doch die Möglichkeiten. Das macht es den Lesern leichter.
|
Benno-007
Anmeldungsdatum: 28. August 2007
Beiträge: 29240
Wohnort: Germany
|
Du solltest meiner Meinung nach die Variable
$(mount -l | grep -c //192.168.0.50/Public)
auch noch mit Anführungszeichen umklammern, damit es keine unnötigen bösen Überraschungen von Fehlern bis Hacks geben kann. Auch wenn es hier recht unwahrscheinlich ist (Vergleich mit einem Zählwert). Wobei die Zählung hier auch ungünstig ist, da der Eintrag durchaus mehrfach in mount vorkommen kann. Also ist die Alternative von g00d.morning robuster. Oder du prüfst auf < 1 per:
GANZZAHL1 -lt GANZZAHL2
GANZZAHL1 ist kleiner als GANZZAHL2
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Benno-007 schrieb: Du solltest meiner Meinung nach die Variable
$(mount -l | grep -c //192.168.0.50/Public)
auch noch mit Anführungszeichen umklammern, damit es keine unnötigen bösen Überraschungen von Fehlern bis Hacks geben kann. Auch wenn es hier recht unwahrscheinlich ist (Vergleich mit einem Zählwert).
Die kann es ja nicht geben, weil grep -c auf jeden Fall nur eine Zahl ausgibt. Viel besser ist aber, den Rückgabewert direkt auszuwerten. Außerdem sollte man hier fgrep nehmen oder die Metazeichen (die Punkte) escapen: | if ! mount -l | fgrep -q //192.168.0.50/Public # überprüfen ob bereits gemountet
then
mount -t cifs -o username=david,password=passwort,uid=1000,gid=1000,file_mode=0660,dir_mode=0770 //192.168.0.50/Public /media/david/Data
notify-send "Mit Nas Verbunden"
fi
|
Man kann das Passwort auch aus dem Skript heraushalten. Schau mal in unserem Wiki. Du könntest sogar einen Eintrag in der /etc/fstab machen mit Option "noauto" - dann brauchst Du im Skript nur noch mount /media/david/Data anzugeben. Vorteil wäre, dass Du alle Mount-Konfigurationen an einem Platz hast.
Wobei die Zählung hier auch ungünstig ist, da der Eintrag durchaus mehrfach in mount vorkommen kann.
Wichtiger Punkt! 👍
|
Benno-007
Anmeldungsdatum: 28. August 2007
Beiträge: 29240
Wohnort: Germany
|
Benno-007 schrieb: Also ist die Alternative von g00d.morning robuster.
Das ist die mit dem Rückgabewert. Aber insbesondere, falls er doch normales grep beim Umbau nutzt, kann das Quoten ja nicht schaden, es funktioniert jedenfalls. Ich glaube aber, damit ist das Thema für ihn eh erledigt. 😉
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Benno-007 schrieb: Benno-007 schrieb: Also ist die Alternative von g00d.morning robuster.
Das ist die mit dem Rückgabewert.
Ja, nur dass die nicht die Regex-Metazeichen escaped und anstatt "-q" die Umleitung nach /dev/null nutzt.
Aber insbesondere, falls er doch normales grep beim Umbau nutzt, kann das Quoten ja nicht schaden, es funktioniert jedenfalls.
Das Quoten hat hier nichts mit dem Escapen der Metazeichen zu tun. Das Escapen macht man, damit grep nicht Dinge findet, die es nicht finden soll. Quoten stellt nur sicher, dass die Shell Parameter nicht interpretiert (z.B. durch Filename Expansion). $ echo '//192.168.0.50/Public' | grep //192.168.0.50/Public
//192.168.0.50/Public
$ echo '//192.168x0.50/Public' | grep //192.168.0.50/Public
//192.168x0.50/Public
$ echo '//192.168x0.50/Public' | fgrep //192.168.0.50/Public
$
Ich glaube aber, damit ist das Thema für ihn eh erledigt. 😉
Jo.
|
g00d.morning
Anmeldungsdatum: 20. Februar 2013
Beiträge: 330
|
Ja, Roberts Lösung ist noch eine Prise eleganter. ☺ Obwohl es trotz der Metazeichen extrem unwahrscheinlich ist im Heimbereich einen Fehltreffer zu landen. Dennoch: konsequent ist konsequent.
|