if test ergibt immer true

*cerox*

Lt. Commander
Registriert
Feb. 2005
Beiträge
1.357
Hallo zusammen,

ich habe eine kleine Anfängerfrage zu einem Shellscript; mir ist kein besserer Titel eingefallen...

Ich habe folgendes Script geschrieben:

Code:
#!/bin/bash

for var in $(less /www/apache/htdocs/t123/control.txt);
do
if test $var==1; then
    /bin/su jk3 -c "/home/jk3/server start";
fi
if test $var==2; then
    /bin/su jk3 -c "/home/jk3/server stop";
fi
done

Zuerst soll mit der for-Schleife die Datei control.txt ausgelesen werden und der Inhalt in "var" gespeichert werden - wenn ich danach ein echo $var einfüge, gibt es mir auch den richtigen Wert aus. In der Datei steht immer nur eine Zahl - nichts anderes.

Das Problem ist nun, dass er alle Anweisungen ausführt; sowohl $var==1 als auch $var==2; das ist natürlich etwas unpraktisch^^

Was mache ich falsch? Ich denke mal es liegt an der Art, wie ich den Inhalt der Datei in die Variable schreibe...
 
Vielleicht wäre etwas einarbeiten in eine Skriptsprache nicht schlecht.

== ist eine boolsche Abfrage und in diesem Fall unpassend (hast ja selbst gemerkt).
und mit $var = 1 vergleichst du eine Zahl mit einem String, das ist ein Unterschied wie Himmel und Erde. Sowas wie $var = "1" oder ähnlich dürfte funktionieren.
 
Hi,

ich habe es nun mit $var = '1' sowie $var = "1" ausprobiert, was beides mit dem schon beschriebenen Resultat endet.

Das ich mich mit der bash etwas beschäftigten muss, ist mir klar, jedoch ist dieses winzig kleine Script und dessen Funktion erstmal wichtiger.

edit: ok sry - es funktioniert jetzt. Ich hatte noch "test" davorstehen.
 
Zuletzt bearbeitet:
Schreib doch das "start", "stop" gleich ins control.txt-file. Wenn die Datei
eine sichere Quelle ist (also niemand Ungebetenes Schreibzugriff hat),
sparst du dir Rechenleistung - gut nicht viel, ich gebs zu...aber warum
kompliziert, wenns auch einfach geht.

Code:
#!/bin/bash

/bin/su jk3 -c "/home/jk3/server `cat /www/apache/htdocs/t123/control.txt`"
 
Ich soll also per PHP die Shell-Befehle dareinschreiben und das Script dann als Root mit einem Hintergrundscript ständig ausführen? Wobei es immer geleert wird, nachdem sowas ausgeführt wurde... Klingt gut - ich werde das mal ausprobieren - danke für den Tipp.

edit: Quak, hab gerade nicht nachgedacht.

Genau das wollte ich ja nicht. Damit würde ich nur zig Sicherheitslücken öffnen - stell dir vor jemand bekommt durch welche Umstände auch immer Zugriff auf die Dateien und schreibt ein rm /* -Rf darein - wie auch immer. Durch diese Zahlencodes sind nur drei Befehle möglich - schlimmstenfalls kann so eben jemand einen Services beenden^^
 
Zuletzt bearbeitet:
1) Von PHP hast du anfangs nichts geschrieben
2) Ich hab nicht davon geredet, das komplette Shellscript fuer PHP schreibbar/erreichbar zu machen;
das Script liegt -nur fuer root schreib-/lesbar auf dem Server und wertet den Inhalt der control.txt aus,
bzw. bindet den Wert "start" oder "stop" in den Befehl ein.
3) wg 1)....Eingaben aus dem Internet wuerde ich natuerlich nie vertrauen und damit meinen Server
steuern....aber wenn du glaubst, sicher zu sein, weil du nur eine 1 oder eine 2 in das control.txt-File
schreibst, dann irrst du dich. Ein einfacher Befehl wie `rm` vor die 1 oder 2 gestellt wird von "test"
ausgewertet und ausgefuehrt, bevor die 1 oder 2 als Wert verglichen wird.

Ich weiss aber auch nicht, was du vor hast. Ueber den Browser eine 1 oder 2 in das control.txt eintragen? Falls ja....das wuerde ich nicht machen oder sehr, sehr gut pruefen.
 
Ein einfacher Befehl wie `rm` vor die 1 oder 2 gestellt wird von "test"
ausgewertet und ausgefuehrt, bevor die 1 oder 2 als Wert verglichen wird.

Ich weiss aber auch nicht, was du vor hast. Ueber den Browser eine 1 oder 2 in das control.txt eintragen? Falls ja....das wuerde ich nicht machen oder sehr, sehr gut pruefen.

Hi,

Überprüfungen haben ich derzeit noch keine drin, da ich das Interface zur Zeit nur selbst bediene.

Wozu ich das gemacht habe?
Einfach nur zum Spaß - ich steuer zum Test damit einen Gameserver, auf dem ich nie spiele^^ - es wird, wie oben schon zu sehen, ein Script mit dem Parameter start oder stop aufgerufen.

Jedoch musst du mir genauer erklären, was daran unsicher sein kann. Ok, es wird nicht validiert aber:

- Wie soll es ein Angreifer schaffen in die Datei beliebigen Inhalt zu schreiben?
- Was soll er damit erreichen außer das schlimmstenfalls der Gameserver gestoppt wird? Im Shellscript steht nicht mehr "test" sondern nur noch if [ $var = "1" ].

Wenn da also keine 1, 2 oder 3 drinsteht, macht das Shellscript sowieso nichts und im schlimmsten Fall stoppt es eben den Gameserver.
 
Ich ging davon aus - bevor du die Sache mit PHP+Browser geschrieben hast -
dass nur _du_ Zugriff auf das control.txt-Script hast. Wenn das ganze aber ueber
PHP laeuft, ist natuerlich eine Absicherung seitens des Formulars wichtig. Ansonsten
haettest du dir die Pruefung sparen koennen und das "start" "stop" aus der control.txt
direkt im Bash-Script einbinden koennen....siehe unten

Wie soll es ein Angreifer schaffen in die Datei beliebigen Inhalt zu schreiben?
Abhaengig vom Formular. Siehe oben. Ich ging von falschen Tatsachen aus. PHP hast du
ja erst spaeter ins Spiel gebracht

Was soll er damit erreichen außer das schlimmstenfalls der Gameserver gestoppt wird? Im
Shellscript steht nicht mehr "test" sondern nur noch if [ $var = "1" ].
...und jetzt rate mal fuer was die Klammer [ steht? ( man [ )
 
Jap, das Shellscript im Hintergrund reagiert trotzdem nur auf die Zahlen 1 bis 3.

Was passiert dann? Der Gameserver wird gestartet, gestopp oder restartet. Also - keine Gefahr und somit habe ich erreicht was ich wollte. Ich wollte das nämlich nicht mit system, exec oder ähnlichen PHP-Funktionen realisieren, da mir das zu unsicher ist, falls jemand doch mal Zugriff auf die PHP-Dateien bekommt bzw. Dinge auf den Webserver hochladen kann.
 
Zurück
Oben