Script um Befehl in jails auszuführen - Parameterübergabe

Dr.Sweety

Fnord!
Hoi zämme,

wie ihr dem (zugegebenermassen etwas länglichen Titel) entnehmen könnt, möchte ich gerne ein Script programmieren, welches einen übergeben Befehl in allen Jails ausführt. So könnte man z.B. das Script dazu einsetzen, "ruby" in allen Jails zu aktualisieren:
Code:
./jail_exec.sh portupgrade -rR ruby
sollte also in allen Jails ein "portupgrade -rR ruby" ausführen. Folgenden Ansatz habe ich mal programmiert:
Code:
less jail_exec.sh 
#!/bin/sh
. /etc/rc.conf
for jail in $jail_list
 do
  eval jail_rootdir=\"\$jail_${jail}_rootdir\"
  eval jail_ip=\"\$jail_${jail}_ip\"
  eval jail_hostname=\"\$jail_${jail}_hostname\"
  #echo $jail_rootdir $jail_ip $jail_hostname
  jail $jail_rootdir $jail_hostname $jail_ip /bin/sh -c "$@"
 done
Dummerweise führt dieser Code aber nur "portupgrade" ohne " -rR ruby" aus obwohl ich doch alle Parameter übergebe ("$@") und diese auch in Anführungszeichen setze. Hat jemand eine Lösung? Ich denke, ein solches Script wäre sehr praktisch für die Serverwartung (könnte man eventuell auch zu einem umfangreicheren Jail-Management Script ausbauen inkl. make buildworld für alle Jails etc.)

P.S:
ein
Code:
less jail_exec.sh 
#!/bin/sh
. /etc/rc.conf
for jail in $jail_list
 do
  eval jail_rootdir=\"\$jail_${jail}_rootdir\"
  eval jail_ip=\"\$jail_${jail}_ip\"
  eval jail_hostname=\"\$jail_${jail}_hostname\"
  #echo $jail_rootdir $jail_ip $jail_hostname
  jail $jail_rootdir $jail_hostname $jail_ip /bin/sh -c "portupgrade -rR ruby"
 done
funktioniert problemlos und updatet ruby in allen Jails.
 
Mit jexec kann man doch Programme innerhalb einer jail ausführen. Ein JID nach der anderen angeben sollte auch ein portupgrade in jeder angegeben jail machen.
 
ich hab keine ahnung von sh programmierung, aber jedes wort nach dem befehl (hier "./jail_exec") sollte ein argument sein, das heisst das du so:
Code:
less jail_exec.sh 
#!/bin/sh
. /etc/rc.conf
for jail in $jail_list
 do
  eval jail_rootdir=\"\$jail_${jail}_rootdir\"
  eval jail_ip=\"\$jail_${jail}_ip\"
  eval jail_hostname=\"\$jail_${jail}_hostname\"
  #echo $jail_rootdir $jail_ip $jail_hostname
  jail $jail_rootdir $jail_hostname $jail_ip /bin/sh -c "$@"
 done
nur das erste argument von:
Code:
./jail_exec.sh portupgrade -rR ruby
sprich "portupgrade" ausführst, das heisst das "$@" anscheinen das erste argument ist, du müsstest wohl alle argumente in zwischen die 'anführungszeichen schreiben, weis aber nicht wie die bei sh heissen!
-EDIT-
oh man, sry hatte oben nicht alles gelsen, sry, das hatteste ja schon selber festgestellt ;)
-/EDIT-

mfg, Flas!!
 
Zuletzt bearbeitet:
asg schrieb:
Mit jexec kann man doch Programme innerhalb einer jail ausführen. Ein JID nach der anderen angeben sollte auch ein portupgrade in jeder angegeben jail machen.
hmmm, das verlagert das Problem aber nur, wenn ich jexec $jaild_id "$@" in einer Schleife ausführen will habe ich dann ja wieder das gleiche Problem.

@Flas: nicht ganz :-) $@ enthält eben alle mitgegebenen Argumente, wenn ich also sage
Code:
./my_script.sh Argument1 Argument2 Argument3
so hat $@ den Wert "Argument1 Argument2 Argument3". Was du meinst ist sehr wahrscheinlich $1...$20... etc. $1 hat den Wert "Argument1", $2 = "Argument2" etc. Aber du hast recht, eventuell sollte ich es mal auf diese Weise versuchen.
 
Zurück
Oben