Bashscript / Wrapperscript

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Nagazi
Beiträge: 112
Registriert: 29.06.2011 18:37:34
Wohnort: Oberhausen

Bashscript / Wrapperscript

Beitrag von Nagazi » 21.07.2011 17:58:19

Moin Deb Com,

hab mittlerweile meinen Server gesichert und mich mal nen bisschen in die Materie eingelesen.

Wollte mal fragen wo/wie man ein script findet/schreibt welches configurationen von z.B. einem Minecraft Server überschreibt. Ich habe ein simples webinterface bekommen inwelchem man die config.cfg datei aufrufen kann, habe 2 Minecraft Server an "freunde" für nen paar euro vermietet. Das problem an der sache ist das sie problemlos die Slotzahl abändern können. Habe mich mal umgehört und mir wurde gesagt das ich ein script schreiben soll oder suchen muss welches sich Wrapperscript nennt, welches dann die config in den punkten überschreibt welche ich einstelle. Sodass sie die slotzahl ändern können aber nach dem speichern button ersteinmal das script drüber läuft und alles was mir nicht passt zurück ändert.

Würde mich freuen wenn ihr mir weiterhelfen könnt.

MFG Phil
Problems on Windows? re-boot
Problems on Linux? be root

Benutzeravatar
MustrumRidcully
Beiträge: 124
Registriert: 16.06.2005 04:11:24
Lizenz eigener Beiträge: GNU General Public License
Wohnort: berlin

Re: Bashscript / Wrapperscript

Beitrag von MustrumRidcully » 21.07.2011 22:01:31

da wirst du jetzt vermutlich antworten von zwei eingeschworenen schulen kriegen, nämlich von der sed- und der bash-fraktion. wie das im einzelnen aussieht, hängt natürlich davon ab, wie die config-datei aussieht: ist es eine xml-datei, eine name=wert liste oder stehen gar nur die werte darin, aber in einer bestimmten reihenfolge?
Volk ist Opium für eine Religion.

Benutzeravatar
Nagazi
Beiträge: 112
Registriert: 29.06.2011 18:37:34
Wohnort: Oberhausen

Re: Bashscript / Wrapperscript

Beitrag von Nagazi » 21.07.2011 22:18:21

die datei heißt an sich "server.properties"

der inhalt sieht wiefolgt aus

Code: Alles auswählen

#Minecraft server properties
#Thu Jul 21 22:17:35 CEST 2011
level-name=world
allow-nether=true
view-distance=10
spawn-monsters=true
online-mode=true
spawn-animals=true
max-players=20
server-ip=
pvp=true
level-seed=
server-port=25565
allow-flight=false
white-list=false
denke eher das das mit awk gehen sollte da ich bei sed nicht weiß ob es Zeilen ersetzen kann wo man nur halbe angaben machen kann, wie zb.

Möchte die Playeranzahl im bash-script definieren und sagen das es 20 player gibt.

demnach müsste ich ja dem script sagen "max-players=" ersetzen zu "max-players=20". Geht das mit sed so einfach?

Wenn ja sende mir mal bitte ein beispielt welches nur die Playerzahl übersetzt.
Problems on Windows? re-boot
Problems on Linux? be root

Benutzeravatar
MustrumRidcully
Beiträge: 124
Registriert: 16.06.2005 04:11:24
Lizenz eigener Beiträge: GNU General Public License
Wohnort: berlin

Re: Bashscript / Wrapperscript

Beitrag von MustrumRidcully » 22.07.2011 00:58:41

hmm... nu haste mich eiskalt erwischt, ich bin nämlich aus der bash-fraktion. :D
aber grundsätzlich ist sed ein hervorragendes tool dafür, wie du an dieser knappen anleitung sehen kannst: http://www.grymoire.com/Unix/Sed.html
aber nun mal im ernst:

Code: Alles auswählen

cp server.properties server.properties.bak
sed s/max-players=.*/max-players=20/ <server.properties >server.properties.new
Volk ist Opium für eine Religion.

Benutzeravatar
Nagazi
Beiträge: 112
Registriert: 29.06.2011 18:37:34
Wohnort: Oberhausen

Re: Bashscript / Wrapperscript

Beitrag von Nagazi » 22.07.2011 02:21:14

Hab das jetzt mal aufn Server geschmissen, nur was muss ich nun ändern damit die ausgegebene datei normal server.properties heißt ?


PS: Wenn ich mir das jetzt angucke das das nur so nen lächerlicher Stern war den ich nicht kannte, könnte ich mir selbst wehtun^^
Problems on Windows? re-boot
Problems on Linux? be root

Benutzeravatar
MustrumRidcully
Beiträge: 124
Registriert: 16.06.2005 04:11:24
Lizenz eigener Beiträge: GNU General Public License
Wohnort: berlin

Re: Bashscript / Wrapperscript

Beitrag von MustrumRidcully » 22.07.2011 04:02:47

einfach umbenennen:

Code: Alles auswählen

mv server.properties.new server.properties
zur sicherheit haste ja noch das alte original in der backup.
Volk ist Opium für eine Religion.

Benutzeravatar
Nagazi
Beiträge: 112
Registriert: 29.06.2011 18:37:34
Wohnort: Oberhausen

Re: Bashscript / Wrapperscript

Beitrag von Nagazi » 22.07.2011 12:28:11

Kann man nicht einfach definieren das er kein backup erstellt, weil ich denke mal das nenn nutzer nicht daran interressiert ist die alten Daten im ordner liegen zu haben

Was muss ans ender der Zeile, da ich ja mehrere Parameter überschreiben möchte aber wenn ich einfach nur Zeile nach Zeile schreiben möchte ändert der nur das letzte Parameter?

Mit einem simplen ; am Ende der Zeile ist es ja nicht getan
Zuletzt geändert von Nagazi am 22.07.2011 12:38:08, insgesamt 1-mal geändert.
Problems on Windows? re-boot
Problems on Linux? be root

Benutzeravatar
MustrumRidcully
Beiträge: 124
Registriert: 16.06.2005 04:11:24
Lizenz eigener Beiträge: GNU General Public License
Wohnort: berlin

Re: Bashscript / Wrapperscript

Beitrag von MustrumRidcully » 22.07.2011 12:30:56

klar, lass einfach die cp... zeile weg.
Volk ist Opium für eine Religion.

Benutzeravatar
Nagazi
Beiträge: 112
Registriert: 29.06.2011 18:37:34
Wohnort: Oberhausen

Re: Bashscript / Wrapperscript

Beitrag von Nagazi » 22.07.2011 13:08:31

Jo, wie ich oben ja grade nochmal nacheditiert hatte die frage,

was mach ich am Zeilenende wenn ich mehrere Parameter überschreiben möchte ?
Problems on Windows? re-boot
Problems on Linux? be root

lemak
Beiträge: 1213
Registriert: 09.11.2007 13:25:57
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Bashscript / Wrapperscript

Beitrag von lemak » 22.07.2011 14:02:31

Hallo,

mehrere Substitutionen in eine Datei packen:

Code: Alles auswählen

# reset.sed-Datei
s/$max-players=.*/max-players=20/
s/$spawn-monsters=.*/spawn-monsters=true/
Dann geht unter Debian auch so etwas:

Code: Alles auswählen

sed -i -f reset.sed server.properties
Mit einem sed als She-Bang sollte es auch funktionieren, aber dann bekomme ich das --in-place nicht hin :-/

MfG i

Benutzeravatar
Nagazi
Beiträge: 112
Registriert: 29.06.2011 18:37:34
Wohnort: Oberhausen

Re: Bashscript / Wrapperscript

Beitrag von Nagazi » 22.07.2011 15:21:46

Okay, hab jetzt diene sed datei genommen und so umgearbeitet das sie auf meine beschreibung passt

Code: Alles auswählen

s/$max-players=.*/max-players=20/
s/$server-ip=.*/server-ip=127.0.0.0/
s/$server-port=.*/server-port=25565/
das führe ich dann mit deinem startparameter

Code: Alles auswählen

sed -i -f reset.sed server.properties
aus und mein shell fenster macht es auch. Nur wenn ich dann die properties manuell öffne, hat sich nichts geändert -.-
Problems on Windows? re-boot
Problems on Linux? be root

Benutzeravatar
MustrumRidcully
Beiträge: 124
Registriert: 16.06.2005 04:11:24
Lizenz eigener Beiträge: GNU General Public License
Wohnort: berlin

Re: Bashscript / Wrapperscript

Beitrag von MustrumRidcully » 22.07.2011 16:30:00

du musst sed sagen, woher er die dinger nehmen und wohin er sie schreiben soll:

Code: Alles auswählen

sed -i -f reset.sed <server.properties >server.properties.new
mv server.properties.new server.properties
mit dem < sagst du sed, dass er aus server.properties lesen soll, mit dem > sagst du ihm, dass er das ergebnis in server.properties.new schreiben soll. anschließend wuppst du mit mv die neue datei zur alten.

< und > werden dir immer wieder begegnen auf der shell. < öffnet ein file zum lesen, > zum schreiben. >> hängt an.
z.b.

Code: Alles auswählen

echo "bla"
# ergebnis:
bla

echo "bla" >bla.txt
# ergebnis: nix. AABER:
cat bla.txt
# ergebnis:
bla

echo "bla" >>bla.txt
cat bla.txt
# ergebnis:
bla
bla
Volk ist Opium für eine Religion.

lemak
Beiträge: 1213
Registriert: 09.11.2007 13:25:57
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Bashscript / Wrapperscript

Beitrag von lemak » 22.07.2011 16:43:10

Das mit der temp. Datei wollte ich durch die Option -i von sed erledigen lassen. Aber warum das bei Nagazi so nicht funktioniert...
`-i[SUFFIX]'
`--in-place[=SUFFIX]'
This option specifies that files are to be edited in-place. GNU
`sed' does this by creating a temporary file and sending output to
this file rather than to the standard output.(1).

This option implies `-s'.

When the end of the file is reached, the temporary file is renamed
to the output file's original name.

Benutzeravatar
Nagazi
Beiträge: 112
Registriert: 29.06.2011 18:37:34
Wohnort: Oberhausen

Re: Bashscript / Wrapperscript

Beitrag von Nagazi » 22.07.2011 17:05:27

Will meine Lösung nun posten da ich mich in die Materie eingelesen habe und das problem selbst gelöst habe.

Zuerst habe ich aber noch eine Frage an den User namens "i":

Was bringt im Startparameter das command -i ?

meine sed datei sieht wiefolgt aus:

Code: Alles auswählen

# reset.sed-Datei
s/max-players=.*/max-players=20/
s/server-ip=.*/server-ip=127.0.0.0/
s/server-port=.*/server-port=25565/
Der fehler von "i" lag darin das er wie man oben sieht, vor der zu änderen Zeile z.B.

Code: Alles auswählen

s/max-players=.*/max-players=20/
ein "$" eingebaut hat, habe bisher nochnicht rausgefunden was dieses Zeichen bewirkt da es in sed keine Variablen gibt.

Habe nun sein script genommen und alle "$" rauseditiert und nun läuft das script problemlos.

Meine "execute" Datei sieht wiefolgt aus;

Code: Alles auswählen

sed -f reset.sed <server.properties >server.properties.new
mv server.properties.new server.properties
Nun ändert sed alle 3 properties Parameter und bennent die Datei wieder richtig um, die Datei server.properties.new ist hinterher logischerweise nichtmehr aufzufinden.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Ich danke euch 2 da ihr mich in die Welt von sed "eingeführt" habt, bzw. mir den Ansporn gegeben habt das ich mich da mal durcharbeite.

Würde mich freuen wenn mir mal irgendwer ein Deutsches und ausführliches Tutorial posten kann, wie man die sogenannten "Bash-scripte" schreibt.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Neues kleines problemchen diesmal,
hab nun eine config datei welche in html geschrieben ist, wie mach ich es das er dieses parameter verändert;

Code: Alles auswählen

<max_players>32</max_players>
So simpel ist das anscheinend nicht, habe jetzt

Code: Alles auswählen

s/<max_players>.*/<max_players>32</max_players>/
Problems on Windows? re-boot
Problems on Linux? be root

Benutzeravatar
Nagazi
Beiträge: 112
Registriert: 29.06.2011 18:37:34
Wohnort: Oberhausen

Re: Bashscript / Wrapperscript

Beitrag von Nagazi » 25.07.2011 20:03:23

Da ja anscheinend keiner ne lösung hat Doppelposte ich mal damit das Thema nochmal gepusht wird und frage nochmal nach,

wie verbaut man einen asci code in dieses sed script wodurch das / ersetzt wird:

Code: Alles auswählen

s/<max_players>.*/<max_players>32</max_players>/
Es geht um das / nach der zahl 32.
Problems on Windows? re-boot
Problems on Linux? be root

lemak
Beiträge: 1213
Registriert: 09.11.2007 13:25:57
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Bashscript / Wrapperscript

Beitrag von lemak » 25.07.2011 21:37:36

Du musst nicht '/' zwingend zum Trennen nehmen.

Code: Alles auswählen

$ echo "<max_players>test" | sed 's#<max_players>.*#<max_players>32</max_players>#'
<max_players>32</max_players>
Sonst ist das Thema Escapen:

Code: Alles auswählen

$ echo "<max_players>test" | sed 's/<max_players>.*/<max_players>32<\/max_players>/'
<max_players>32</max_players>
Noch mal was ganz anderes praktisches: Selektives Ersetzen (Markieren und Einfügen)
Mit sed ist es auch möglich, Teile von Strings heraus zu picken um diese später zu verwenden. Diese Teile werden mit '\(' und '\)' markiert, und man kann auf diese Strings mit '\1', '\2' usw. zugreifen.

Code: Alles auswählen

$ echo "davor <max_players> test </max_players> danach" | sed 's#^\(.*<max_players>\).*\(</max_players>.*\)#\132\2#'
davor <max_players>32</max_players> danach
Quelle: http://www.tty1.net/sed-tutorium/sed-tutorium.html

MfG i

lemak
Beiträge: 1213
Registriert: 09.11.2007 13:25:57
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Bashscript / Wrapperscript

Beitrag von lemak » 25.07.2011 22:01:29

Nagazi hat geschrieben: Der fehler von "i" lag darin das er ...

ein "$" eingebaut hat, habe bisher nochnicht rausgefunden was dieses Zeichen bewirkt da es in sed keine Variablen gibt.
Oh weh... $ ist das Zeilenende, ich wollte eigentlich ^ nehmen, den Zeilenanfang. Lese dazu vllt: https://secure.wikimedia.org/wikipedia/ ... r_Ausdruck
Das reicht mir meist schon (Die Tabellen erklären das ganze Kurz und Gut).
Nagazi hat geschrieben: Meine "execute" Datei sieht wiefolgt aus;

Code: Alles auswählen

sed -f reset.sed <server.properties >server.properties.new
mv server.properties.new server.properties
Dank der Option -i solltest du das mit den Datenströmen (< und >) und mv nicht brauchen.
Nagazi hat geschrieben: Würde mich freuen wenn mir mal irgendwer ein Deutsches und ausführliches Tutorial posten kann, wie man die sogenannten "Bash-scripte" schreibt.
https://secure.wikimedia.org/wikibooks/ ... rammierung

Benutzeravatar
Nagazi
Beiträge: 112
Registriert: 29.06.2011 18:37:34
Wohnort: Oberhausen

Re: Bashscript / Wrapperscript

Beitrag von Nagazi » 25.07.2011 22:18:38

Jo klasse wusste nicht das sed noch andere Trennzeichen beinhaltet.

Was mache ich falsch ?

Code: Alles auswählen

sed -f reset.sed <dedicated_cfg.txt >dedicated_cfg.txt.new
mv dedicated_cfg.txt.new dedicated_cfg.txt
sehll wirft nen fehler aus das er dedicated_cfg.txt.new nicht finden kann. Wenn ich via FTP in dem Ordner nachgucke, ist dort aber die datei dadicated_cfg.txt.new vorhanden aber sie kann nicht geöffnet/gelöscht werden. Weder Putty noch WinSCP kann die datei verändern.

Denke mal sie ist einfach nur Temporär da sie nach einem reboot weg ist.

Wie kann das sein das sed die Datei nicht so abschließt das sie hinterher auch umbennent werden kann ?
Problems on Windows? re-boot
Problems on Linux? be root

Benutzeravatar
Nagazi
Beiträge: 112
Registriert: 29.06.2011 18:37:34
Wohnort: Oberhausen

Re: Bashscript / Wrapperscript

Beitrag von Nagazi » 25.07.2011 22:23:22

Okay hat sich schon erledigt, ich machs jetzt mit -i

Da erspar ich mir und dem server nen bisschen arbeit. (Und mir einige problem)

Danke für die Wiki, ich will mal gucken das ich mich dort nen bisschen durcharbeite
Problems on Windows? re-boot
Problems on Linux? be root

Antworten