Programmparameter, um aus Datei auszulesen statt prompt

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
pangu
Beiträge: 1400
Registriert: 15.11.2011 20:50:52
Lizenz eigener Beiträge: GNU General Public License
Wohnort: /proc/1

Programmparameter, um aus Datei auszulesen statt prompt

Beitrag von pangu » 25.09.2013 18:20:28

Hi Leute,

ich hab ein Skript namens "remote_aufgabe.sh", das momentan wie folgt aussieht:

Code: Alles auswählen

if [[ ! "$(whoami)" = "johndoe" || $# -eq 0 || $# -gt 1 ]];then
cat <<EOF
 Das Skript muss als User "johndoe" ausgeführt werden und als Parameter muss
 ein Hostname oder eine IP-Adresse angegeben werden. Mehrere Parameter sind nicht zulässig, es muss also immer ganz genau EIN Parameter eingegeben werden!
EOF
exit 1
fi

lcldir=/workdir
host2process=$1

# Überprüfen, ob der gewünschte Remotehost per ping erreichbar ist
ping -c 1 -W 2 $host2process > /dev/null
if [ $? -ne 0 ]; then
 echo "Keine Verbindung zum angegebenen Host $host2process. Bitte überprüfen. ABBRUCH!"
 echo
exit 2
fi

meine_funktion() {
irgendwelche Befehle
meiner Funktion
bla bla
}

# jetzt benötige ich diese Funktion, da ich sie auf den remote host anwenden muss
meine_funktion $host2process
remotehostname=$(ssh root@$host2process hostname)

if [[ irgendwas ]]; then
 irgendwelche Kommandos
fi
Wenn ich dieses Skript nun auf 40 verschiedenen remote-Hosts anwenden wollen würde, dann müsste ich jedes Mal einzeln das Skript aufrufen, und zwar mit

Code: Alles auswählen

su -c './remote_aufgabe.sh host1' johndoe
su -c './remote_aufgabe.sh host2' johndoe
su -c './remote_aufgabe.sh host3' johndoe
...usw...
Das will ich mir jedoch ersparen, deswegen habe ich eine Datei names ./host.list die so aussieht:
# Kommentarzeile
# Bla bla
host1
amelie
host3
obelix
asterix
# usw....
host40
Ich will mein Skript nun mit einer Funktion erweitern, damit ich es aufrufen kann, und statt einem einzelnen Host diese host.list abgearbeitet wird (nacheinenader, sequentiell eben). Also habe ich nach dem ersten Abschnitt zu Beginn des Skriptes ...

Code: Alles auswählen

if [[ ! "$(whoami)" = "johndoe" || $# -eq 0 || $# -gt 1 ]];then
cat <<EOF
 Das Skript muss als User "johndoe" ausgeführt werden und als Parameter muss
 ein Hostname oder eine IP-Adresse angegeben werden. Mehrere Parameter sind nicht zulässig, es muss also immer ganz genau EIN Parameter eingegeben werden!
EOF
exit 1
fi

<an dieser Stelle>
folgendes angefangen und versucht:

Code: Alles auswählen

# Wenn als Startparameter -hostlist angegeben wird, arbeitet das Skript alle dort
# enthaltenen Maschinen nacheinander ab.
if [ "$1" = "-hostlist" ];then
 if [ ! -f $lcldir/host.list ];then
  echo
  echo Es wurde als Parameter -hostlist eingegeben, jedoch ist die benötigte Datei
  echo $lcldir/host.list nicht vorhanden. Programm wird beendet, ABBRUCH !
  echo
  exit 3
fi

while read -r host2process; do
[[ ! ${host2process// } || $host2process = \#* ]] && continue;
<hiermuss jetzt der ganze Skriptablauf irgendwie aufgerufen werden> $host2process;
<hier folgt jetzt der restliche Teil des Skriptes von ganz oben>
wenn ich aber nun meinen soeben angefangenen Block ordnunsgemäß dadurch beende, dass ich ganz am Ende des Skriptes noch

Code: Alles auswählen

[...]
done < "$lcldir/host.list"
if
setze, dann würde das ja für das gesamte Skript gelten, somit könnte ich die normale Einzelne Host-Abarbeitung gar nicht korrekt ausführen, weil ja alles in meiner if-Schleife sitzen würde.

Kann mir da jemand raushelfen und mir erklären, wie man so etwas richtigerweise und korrekt skriptet? Bin für jede Hilfestellung sehr dankbar.
Man gibt Geld aus, das man nicht hat, um damit Dinge zu kaufen, die man nicht braucht, um damit Leute zu beeindrucken, die man nicht mag.

syssi
Beiträge: 2951
Registriert: 24.12.2010 16:50:59
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rheinland

Re: Programmparameter, um aus Datei auszulesen statt prompt

Beitrag von syssi » 25.09.2013 18:32:32

Der Oberlehrer sagt: Es gibt nur if-Bedingungen und while/for-Schleifen. ;-) Was spricht gegen eine if-Bedigung, welche prueft, ob der Parameter "hostlist" verwendet wird? Wenn ja, dann wird die Methode mehrmals in einer while-Schleife ausgefuehrt, wenn nicht, dann nur ein einzelnes Mal.

Benutzeravatar
pangu
Beiträge: 1400
Registriert: 15.11.2011 20:50:52
Lizenz eigener Beiträge: GNU General Public License
Wohnort: /proc/1

Re: Programmparameter, um aus Datei auszulesen statt prompt

Beitrag von pangu » 25.09.2013 19:13:31

syssi hat geschrieben:Der Oberlehrer sagt: Es gibt nur if-Bedingungen und while/for-Schleifen.
das habe ich schonmal gehört, und in Erinnerung habe ich noch man sollte niemals for verwenden, um Zeilen einzulesen. Stattdessen glob, while/read -r oder arrays verwenden. Zumindest irgendwie so habe ich es noch in Erinnerung. :-)
syssi hat geschrieben:Was spricht gegen eine if-Bedigung, welche prueft, ob der Parameter "hostlist" verwendet wird? Wenn ja, dann wird die Methode mehrmals in einer while-Schleife ausgefuehrt, wenn nicht, dann nur ein einzelnes Mal.
wie würde das Grundgerüst hierzu aussehen?

Ich habe mir grad auch folgendes überlegt: ich frage als erstes ab, ob der Parameter -hostlist verwendet wurde und die geforderte host.list existiert. Falls ja, dann lese ich zeilenweise diese host.list ein und

Code: Alles auswählen

while read -r host2process; do
[[ ! ${host2process// } || $host2process = \#* ]] && continue;
 <hier muss der gesuchte Code rein>
 done;
übergebe diese Werte "irgendwie" als Parameter meinem weiteren Befehl. Also quasi so dass ich mehrere Parameter dann habe wie
"remote_aufgabe.sh host1 amelie host3 asterix obelix ... host40" Ich denke das müßte dann mit arrays funktionieren, kenne mich aber damit gar nicht aus. Bevor ich mich da einlese würde ich natürlich gerne wissen, ob ich auf dem richtigen Weg (oder auf dem Holzweg) bin :roll:

dann könnte ich doch in einer weiteren Schleife jeden einzelnen Host irgendwie abarbeiten, á-la:

Code: Alles auswählen

while [ $# -gt 0 ]
do                   
  <mein gesamter Skriptinhalt Code> $1
  shift
done
oder ist das Blödsinn und ich bin auf der falschen Fährte? ich brauch da etwas Unterstützung biddöö :-)
Man gibt Geld aus, das man nicht hat, um damit Dinge zu kaufen, die man nicht braucht, um damit Leute zu beeindrucken, die man nicht mag.

syssi
Beiträge: 2951
Registriert: 24.12.2010 16:50:59
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rheinland

Re: Programmparameter, um aus Datei auszulesen statt prompt

Beitrag von syssi » 25.09.2013 19:19:04

Ich glaube du stellst es dir komplizierter vor als es ist:

Code: Alles auswählen

#!/bin/bash

function deineFunktion() {
  echo "Parameter1: $1"
}

if [[ ! "$(whoami)" = "johndoe" || $# -ne 1 ]];then
 echo "Deine Fehlermeldung"
 exit 1
fi

if [ "$1" = "-hostlist" ];
then
  while read -r line
  do
    deineFunktion $line
  done < "$lcldir/host.list"
else
  deineFunktion $1
fi
Beispiel ausgefuehrt:

Code: Alles auswählen

$ cat test.txt       
foo
bar
$ ./test.sh -hostlist
Parameter1: foo
Parameter1: bar
$ ./test.sh foobar   
Parameter1: foobar

Benutzeravatar
pangu
Beiträge: 1400
Registriert: 15.11.2011 20:50:52
Lizenz eigener Beiträge: GNU General Public License
Wohnort: /proc/1

Re: Programmparameter, um aus Datei auszulesen statt prompt

Beitrag von pangu » 25.09.2013 21:49:50

Ok, vielen Dank. Hab den Fehler gefunden und meinen Code umgebastelt. Danke!
Man gibt Geld aus, das man nicht hat, um damit Dinge zu kaufen, die man nicht braucht, um damit Leute zu beeindrucken, die man nicht mag.

Antworten