Hallo leute,
ich bin dabei ein webinterface für meinen minecraft server zu schreiben, dazu brauche ich shell_exec um ein Shell script auszuführen was mir den server startet(alles andere lauft dann mit socket verbindungen). nur das problem ist nun das shell_exec mit root rechten arbeitet der minecraft server aber mit dem username "admin" ausgeführt werden soll, wie mache ich das am besten?
Shell befehle als admin mit shell_exec ausführen
- gerredtor
- Erledigt
-
-
Wenn shell_exec wirklich mit root Rechten arbeitet, hast Du ein echtes Problem. Das würde bedeutet das PHP als root läuft und das solltest Du so schnell wie möglich abstellen!
Mach mal folgendes:
Was kommt da raus?//edit
Oder führst Du das Script als root in der Shell aus, und nicht via Webserver? -
string(54) "uid=33(www-data) gid=33(www-data) groups=33(www-data)
"
jop also die www-data wo der root drinnen ist,
wo ändere ich das ? hab ich in keine anleitung im internet gefunden oder wo ich mich mal drum gekümmert hab den server abzusichern -
Der einfachste und sicherste weg wäre hier, mit SSH zu arbeiten. Sprich Du erstellst eine SSH Verbindung auf localhost, nutzt zur Anmeldung einen private Key und führst das Shellscript dann aus.
Also irgendwas wie
PHP<?php shell_exec('ssh minecraft@localhost -i private.key "/home/minecraft/start-minecraft.sh"');
Natürlich vorher den SSH Befehl einmal manuell ausführen oder den Schalter setzen, dass der Host Fingerprint nicht gepfüft werden soll. Ansonsten bleibt der Befehl halt beim "Wirklich Verbindung herstellen?" hängen.Irgendwas mit sudo oder su zu machen ist immer schwer. Da gerade beim Start von minecraft mit screen immer Probleme auftreten. Zum Beispiel kann man ab und zu die screen Session bei einem su'ten Zugriff nicht starten.
-
Okay danke, werde ich gleich einmal versuchen
//Edit
wenn ich nen anderen als 22 port habe muss ich noch -p port anhängen oder ? -
//Edit
wenn ich nen anderen als 22 port habe muss ich noch -p port anhängen oder ? -
so hab ich das jetzt "port" ist nur ein platzhalter bei mir steht natürlich mein port,
er macht das aber nicht hab auch schon screen -S test versucht geht aber nicht,
hab das ganze mal in putty getestet da musste ich noch eben Yes bestätigen wegen dem fingeprint und dann gings -
geht es nicht einfacher apache2 nicht unter root sonder z.b. admin zu starten ?
dann arbeitet shell_exec ja auch nicht mehr als root oder?.
wenn ja wo kann ich das umstellen? -
Apache muss weiter als root laufen, da man sonst keine Ports <=1024 öffnen kann. Sprich Port 80 wäre nicht nutzbar.
Aber Du könntest Deine Website mit suExcec und FastCGI auf einen anderen Benutzer schieben.
-
gut muss mal gleich ne anleitung suchen, ist das sicher ? bzw. was macht das alles
-
Das ermöglicht dir einzelne vHosts auf verschiedene Linux Benutzer aufzuteilen und somit diese Sicherheitstechnisch zu trennen. Also ja, man könnte sagen dass das sicher ist.
-
ok, jetzt hab ich noch ne frage.
ich habs jetzt so getestet, das ich mit php ne sh datei ausführe die geht mit ssh auf den admin user und erstellt den screen mit dem server aber an dem teil wo der den screen machen soll kommt einfach nur Must be connected to a terminal.
wie kann ich das richtig machen ? -
-
? was macht das und im ssh teil ist das ja garnicht mehr das schaut so bei mir aus:
$output = shell_exec('sh /servers/shells/m.sh');
var_dump($output);dann in der m.sh:
#!/bin/sh
ssh admin@localhost -i /home/admin/.ssh/id_rsa -p meinPort
sh /servers/Minecraft/minigameserver/start.shdann in der start.sh:
#!/bin/sh
screen -S "m" bash -c "sh server.sh"die ausgabe kannste sehen: https://www.tropicaldreams.cc/ erste zeile
-
-
da kommt NULL raus mehr passiert aber auch nicht
-
Ich empfehle phpseclib: pure PHP implementations of SSH, SFTP, RSA and X.509 wenn man SSH Verbindungen mit PHP sinnvoll aufbauen & nutzen möchte.
Ist wirklich sehr einfach - und an bekommt mit screen auch neue screens hin (die benötigen eine valide tty):
PHP
Alles anzeigen<?php include('Net/SSH2.php'); $ssh = new Net_SSH2('www.domain.tld'); if (!$ssh->login('username', 'password')) { exit('Login Failed'); } echo $ssh->exec('cd mc-server/'); echo $ssh->exec('screen -S "m" bash -c "sh server.sh"'); ?>
Alternativ kann man auch dem www-data user in die sudoers schreiben (mit NOPASSWD) und dort die befehle angeben die benötigt werden. (Nur sinnvoll wenn dies kein sicherheitsrisiko mit sich bringt): -
ist diese methode auch mit einem public key möglich?
der dann z.b. von /home/user/.ssh usw.. abgerufen wird ?
möchte ungern passörter in mein script legen -
Die von gab3 vorgeschlagene Bibliothek unterstützt auch RSA Keys: SSH2 Authentication Examples and Notes | phpseclib