"git pull" über PHP shell_exec() ausführen?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Dasselbe habe ich vor kurzem tatsächlich auch versucht. Bin auf ähnliche Probleme gestoßen, à la Berechtigungen. Es sollte reichen, wenn du dem Nutzer, unter dem der PHP-Server läuft, Schreibzugriff auf Ordner des lokalen Repos gibst.

Wenn du nicht weißt, unter welchem Nutzer der PHP-Server läuft:

<?php
passthru("whoami");

Dann mit dem Nutzernamen im Terminal:

$ chown -R nutzername /path/to/repo/

Vorsicht!

$ chmod 777 /path/to/repo/

wird nicht reichen, da neu-erstellte Dateien unter Umständen einen anderen Owner haben. Lieber Owner komplett wechseln, am besten sogar in das entsprechende /home/ Verzeichnes schieben.

Woher ich das weiß:eigene Erfahrung

gehm1 
Fragesteller
 14.04.2022, 16:13

Also über deinen PHP-Code kommt gar kein Output und gleich über ssh liefert es

whoami: cannot find name for user ID ***4778

Ansonsten schonmal vielen Dank!

0
Jawesome99  14.04.2022, 16:32
@gehm1

Kurios, das sollte nicht auftauchen.

cat /etc/passwd

Schau mal was hier bei rauskommt und suche nach der Nummer 4778 in der Liste. Damit solltest du den Nutzernamen auch finden können. Alles vor dem ersten Doppelpunkt ist der Nutzername, z.B.:

root:x:0:0:root:/root:/bin/bash

Hier wäre der Nutzername "root". Die Nutzer ID ist hier die erste 0 (an dritter Stelle, also nach dem zweiten Doppelpunkt). Dort solltest du nach deiner 4778 suchen.

1
gehm1 
Fragesteller
 14.04.2022, 16:59
@Jawesome99

Du sagst es, kurios auf jeden Fall....

sendmail:x:100:100:Mailer Daemon:/var/spool/mqueue:/bin/false
httpd:x:1000:1100:Web Server:/tmp:/bin/false
webcockpit:x:32541:1101:#32541:/home/strato/www/we/www.webcockpit.de:/bin/false
mysql:x:1104:1104:MySQL:/home/strato/mysql:/bin/tcsh

Also meine ID ist hier tatsächlich nicht vorhanden....

0
Jawesome99  14.04.2022, 17:08
@gehm1

Ich bin da überfragt. Ich könnte mir allerhöchstens vorstellen, dass Stratos Shared-Hosting dazwischenfunkt. Bin naiverweise von einem dedizierten Server ausgegangen.

Eine Möglichkeit wüsste ich noch:

$ chown 777 /some/folder/

Setze mal einen Ordner deiner Wahl auf Read/Write/Execute für alle, dann

<?php
file_put_contents("/some/folder/file.txt", "Test");

um eine Datei mit PHP zu erstellen, dann lass dir den Besitzer der Datei anzeigen:

ls -l /some/folder/
0
gehm1 
Fragesteller
 14.04.2022, 17:10
@gehm1

Habe jetzt was rausgefunden. Strato hat einen Blogpost veröffentlicht (https://www.strato-hosting.co.uk/faq/hosting/how-to-use-ssh-sftp/), in dem der Befehl "id" genannt wird.

Output von "id":

uid=****778 gid=1101(customer) groups=1101(customer)

Habe jetz nochmal

chown -R ****778 .

ausgeführt und laut "ls -l" bin ich auch Owner des gesamten Ordners mit meinem Repository.

0
Jawesome99  14.04.2022, 17:13
@gehm1

Das Problem ist, dass unter deinem User nicht unbedingt auch das PHP-Skript läuft, oft ist das nicht der Fall, daher ja die Zugriffsprobleme.

Bei mir z.B. läuft mein Apache-Server mit PHP auf einem anderen Nutzer als mein persönlicher.

Da du hier wohl keinen direkten Zugriff auf alles hast, ist dies sogar noch wahrscheinlicher.

1
gehm1 
Fragesteller
 14.04.2022, 17:22
@Jawesome99
chown 777 .

liefert hier

chown: changing ownership of '.': Operation not permitted

Heißt quasi, ich kann Ordnern nicht diese Einstellungen geben....

Interessant ist das mit der Textdatei (file.txt). Denn am Anfang (keine Ahnung, was genau welche r und w bedeuten...) ist bei allen Dateien das gleiche zu sehen (siehe das "rw-r--r--" bei log.php), außer bei der neu erstellten Datei.

-rw-r----- 1 1494778 customer  4 Apr 14 17:19 file.txt
-rw-r--r-- 1 1494778 customer 994 Apr 14 17:19 log.php
0
Jawesome99  14.04.2022, 17:25
@gehm1

Das am Anfang sind die Berechtigungen:

- --- --- ---
d rwx rwx rwx

Das erste d steht für "Directory", es handelt sich um einen Ordner.

Die Erste Gruppe von rwx steht für den Benutzer, genauer, für den Besitzer der Datei (hier "customer").

Die Zweite Gruppe steht für die Gruppe (mit wahrscheinlichkeit hier auch "customer")

Die Dritte Gruppe steht für alle anderen.

R = Read (Lesen)
W = Write (Schreiben)
X = Execute (Ausführen)

Steht statt einem Buchstaben ein "-", trifft diese Berechtigung nicht zu:

-rw-r-----
  • Es handelt sich um eine Datei (Kein d)
  • Der Besitzer kann die Datei lesen und be-/überschreiben
  • Die Besitzergruppe kann die Datei nur lesen
  • Alle anderen haben keinen Zugriff auf die Datei
1
gehm1 
Fragesteller
 14.04.2022, 17:35
@Jawesome99

Daraus kann man aber schließen, dass PHP den gleichen Benutzer verwendet, oder? Oder zumindest die gleiche Gruppe. Ansonsten hätte PHP die Datei ja gar nicht erstellen können. Was aber wieder die Frage auswirft, warum PHP dann bei git pull nicht mitmachen will...

0
Jawesome99  14.04.2022, 17:36
@gehm1

Hast du die Datei durch Aufruf über Browser erstellen lassen oder hast du die Datei selbst per "php" Befehl ausgeführt? Das ist beides unterschiedlich!

1
gehm1 
Fragesteller
 14.04.2022, 17:46
@Jawesome99

Ich habe sie ganz normal im Browser geöffnet. Also sowohl das Script zum Erstellend der Textdatei, als auch das Updater-Script für git pull.

0
Jawesome99  14.04.2022, 17:53
@gehm1

Eventuell ist PHP hier nicht das richtige Tool für das Problem. Was genau versuchst du zu machen? Willst du bei einem neuen Commit die Kopie auf dem Server automatisch aktualisieren lassen o.ä.?

1
gehm1 
Fragesteller
 14.04.2022, 19:16
@Jawesome99

Ich habe vor, dass das Script die Website aktualisiert, wenn man die Seite per Link aufruft. Dieser Link befindet sich im Developer-Bereich meiner Website.

0

Du musst gucken welcher User PHP/den Webserver ausführt.

ps aux

Sollte Alle Prozesse ausgeben.


gehm1 
Fragesteller
 14.04.2022, 16:06

Das liefert bei mir

sh: ps: command not found

Woran könnte das liegen?

0
jort93  14.04.2022, 21:08
@gehm1

Ist ps in /bin zu finden? Dann ist dein path kaputt.

0
gehm1 
Fragesteller
 14.04.2022, 21:54
@jort93

nein, es sind zwar viele Befehle vorhanden, aber nicht ps

0
jort93  14.04.2022, 22:13
@gehm1

Was hast du für eine distro? kenne keine die ps nicht installiert hat.

1
gehm1 
Fragesteller
 14.04.2022, 22:19
@jort93

Das wüsste ich selbst gerne. Habe nur einen Shared Server von Strato gemietet. welchen Befehl brauche ich, um das herauszufinden?

Ach ja, ich habe nicht mal sudo und apt-get...

0
jort93  14.04.2022, 22:36
@gehm1

Ahh, ja da hast du keine rechte. Da kannst du nicht einfach shell_exec benutzen.

1
gehm1 
Fragesteller
 15.04.2022, 15:19
@jort93

Ach so, aber ich meine, shell_exec funktioniert ja meistens. Nur eben bei git pull haut es nicht hin...

0
jort93  15.04.2022, 22:38
@gehm1

Vermutlich weil du halt keine schreibrechte hast.

1