PHP Script soll sich auf einen Server einloggen und einen Befehl ausführen

3df

Registered User
Lösungswege sind ja bereits aufgezeigt worden. Wieso musst du denn den Dienst immer wieder neu starten? Lässt sich das nicht verhindern?

Ja es muss sein. Der Dienst muss bei einer bestimmten Bedingung in der Hausautomatisierung neu gestartet werden.

Code:
<?php
$connection = ssh2_connect('192.168.178.22', 22);
ssh2_auth_password($connection, 'username', 'password');

$stream = ssh2_exec($connection, 'reboot');
?>
So funktioniert es, und der Pi wird neu gestartet. Aber wenn ich statt "reboot" dann "sudo /etc/init.d/hmvi restart" eingebe, klappt es nicht. Der Dienst wird nicht neu gestartet.
 
Last edited by a moderator:

rolapp

Fan vom SSF
Android und Hausautomatisierung? Ist dann wohl Tag der offenen Tür, na dann Gute Nacht
Er hat doch geschrieben es wird nur local im eigenen Netz verwendet.
Genauso könnte ich sagen Windows und Server????

Was soll es war ja nur ein Vorschlag um TE eventuell Arbeit zu ersparen.
 

3df

Registered User
Danke rolapp für deinen Tipp. Aber ignoriere diesen Shrink bitte. Es ist ein Freund von mir, mit dem ich zur gleichen Zeit telefoniert habe, und sich hier einen spaß erlaubt hat. Totaler Kindergarten und sinnlos was er hier geschrieben hat.

Ich benutze kein Android daher ist das für mich auch nicht machbar. Windows nutze ich auch nicht.
 

marce

Well-Known Member
So funktioniert es, und der Pi wird neu gestartet. Aber wenn ich statt "reboot" dann "sudo /etc/init.d/hmvi restart" eingebe, klappt es nicht. Der Dienst wird nicht neu gestartet.
dann würde ich mal im Log des PI nachschauen - vermutlich ist sudo für den entsprechenden User nicht passend konfiguriert.
 

rolapp

Fan vom SSF
Ok, kein Thema mal zurück zum Thema.

du hast sudo in deinem Befehl stehen wie übergibst du das Passwort für sudo?
Ich würde das auch nicht mit root machen. Du kannst einen normalen Benutzer in der /etc/sudoers Datei eingeben, der braucht dan für bestimmte Befehle kein sudo passwort.
Ein Beispieleintrag für /etc/sudoers sieht so aus:

root ALL = (ALL) ALL

Das heißt root darf alle Befehle mit sudo ausführen.

%administrator ALL = (ALL) ALL

Die Gruppe administrator darf alle Befehle mittels sudo als root ausführen.

admin ALL = NOPASSWD: ALL
%users ALL = NOPASSWD: /usr/sbin/IRGENDEINSKRIPT

Der Benutzer admin darf ohne Passwortabfrage alle Programme ausführen. Die Gruppe users darf ohne Passwortabfrage den Befehl /usr/sbin/IRGENDEINSKRIPT ausführen.

Statt der Gruppe %users gib deinen Benutzernamen ein, der hat dann quasi root nur für dein script. Das macht dir das etwas einfacher und du hast kein root zugriff von PHP aus.
 

rolapp

Fan vom SSF
Welches Betriebssystem verwendest Du local und auf dem pi. Dann bauen wir hier mal eine Anleitung zusammen. Wir fangen erst einmal mit der ssh Verbindung und dem ausführen des Skriptes an . Zweiter schritt ist dann Ausführung über php (habe ich auch noch nicht gemacht, kann aber kein Hexenwerk sein).
 

3df

Registered User
Auf dem Pi ist Raspbain installiert und local wo die PHP Datei liegt und ausgeführt wird ist ein Synology auf dem die Web Station installiert ist mit Apache 2.2 und PHP 5.6.
 

rolapp

Fan vom SSF
Ok fangen wir an:

1. du meldest dich über ssh auf dem pi an
2. Benutzer anlegen: adduser automat (den namen wie du willst)
3. Wir legen ein Testscript an.
Code:
mkdir /opt/test
echo '#!/bin/bash' > /opt/test/test.sh
echo 'echo "dast ist ein Test" > /opt/test/test.txt' >> /opt/test/test.sh
chmod u+x /opt/test/test.sh
Das legt jetzt ein Verzeichnis /opt/test an mit dem Script test.sh diese legt beim Ausführen eine Textdatei test.txt an. Hier bitte auf die Qutes achten
ls -la /opt/test sollte jetzt so aus sehen
Code:
total 4
-rwxr--r-- 1 root root 57 Jan 25 11:25 test.sh
Die Datei ist nur von root ausführbar

4. Bearbeiten der sudoers gib in der Konsole visudo ein hier öffnet sich jetzt dein Standard Editor
Code:
automat ALL = NOPASSWD: /opt/test/test.sh
Das gibst du am ende der Datei ein. Wichtig die letzte Zeile muss eine Leerzeile sein.
abspeichern Visudo speichert es erst einmal in ein tmp Datei überprüft die Syntax und fertig.

5 Wir testen das ganze einmal.
Abmelden vom pi
Code:
ssh automat@<ipvomPi> [-p Port] sudo /opt/test/test.sh
<ipvomPI> ist die IP-Adresse vom Pi das in den eckicken Klammen wir nur gebraucht wenn du den ssh port verlegt hast. Jetzt wird das Passwort vom Benutzer automat abgefragt das Script ausgeführt und abgemeldet. Wenn alles geklappt hat sollte im /opt/test Verzeichnis die Datei test.txt sein.

Das ganze probierst du erst einmal und meldest Dich wenn es funktioniert. Als nächstes richten wir dann den SSH Key ein
 

3df

Registered User
Vielen Dank für die tolle Anleitung. Ich habe jetzt alle schritte ausgeführt und es gab keine Fehler.

Wollte mich dann per "ssh automat@192.168.178.22 sudo /opt/test/test.sh" anmelden, und wir Du schon sagtest, wird nach dem Passwort gefragt. Aber wie ist das Passwort?

Und "ls -la /opt/test" gibt bei mir dies an:

Code:
insgesamt 12
drwxr-xr-x 2 root root 4096 Jan 25 17:51 .
drwxr-xr-x 5 root root 4096 Jan 25 17:51 ..
-rwxr--r-- 1 root root   58 Jan 25 17:51 test.sh

Und was genau meinst Du mit: "Wichtig die letzte Zeile muss eine Leerzeile sein." ?
 
Last edited by a moderator:

rolapp

Fan vom SSF
Das Passwort was du beim Anlegen des Benutzers fest gelegt hast.

Leerzeile einfach noch mal enter drücken.
 

3df

Registered User
Mir wurde nichts gesagt das ich ein Passwort vergeben soll.

Ich habe "adduser automat" angegeben, und dann ist weiter nichts passiert. So wie es aussieht, wurde der Benutzer "automat" auch nicht angelegt. Kann ich das irgendwo nachsehen? Mit "cat /etc/passwd | cut -d: -f1" sollte doch der Benutzer mit aufgelistet werden, oder? Falls ja, dann steht er in der Liste nicht mit drin.
 
Last edited by a moderator:

3df

Registered User
So, ich habe jetzt "adduser automat" noch mal aufgeführt, und nun hat es geklappt.

Ich habe mich mit "ssh automat@192.168.178.22 sudo /opt/test/test.sh" angemeldet, die Datei "test.txt" mit dem Inhalt "dast ist ein Test" wurde angelegt und dann wurde die SSH Verbindung getrennt.

Es klappt also alles.
 

rolapp

Fan vom SSF
Prima

Dann legen wir jetzt den SSH-Key an

1 key generieren
Code:
ssh-keygen -t rsa -b 4096
jetzt kommt die Frage nach der Schlüsseldatei
Code:
Enter file in which to save the key (<Pfad>/.ssh/id_rsa):
Hier gibst du folgendes ein; <Pfad>/.ssh/automat_rsa
<Pfad> ist der Pfad zum Home-Verzeichnis einfach den angezeigten übernehmen, den Dateinamen kannst du frei wählen der wichtig zur Unterscheidung der Schlüssel.
Ganz wichtig die folgende Frage nach der Passphrase leer lassen, wir wollen ja Anmeldung ohne Passwort.
2. Den Schlüssel auf den Pi kopieren
Code:
ssh-copy-id [-p Port] -i ~/.ssh/automat_rsa automat@<IPvomPi>

3. Jetzt noch Testen ob das ganze funktioniert.
Code:
ssh automat@<IPvomPi> [-p Port] -i ~/.ssh/automat_rsa
wenn alles geklappt hat solltest du jetzt auf dem Pi angemeldet sein.

Um das gelernte noch mal zu vertiefen mal zwei Links zum Ubuntu Wiki
SSH
Sudo
 

3df

Registered User
Hallo, habe gerade alles ausgeführt und es scheint zu klappen.

Auf meinem Mac liegen die beiden Dateien "automat_rsa" und "automat_rsa.pub" in "/Users/Name/.ssh/"

Auf dem Pi liegt die Datei "authorized_keys" in "/home/automat/.ssh"

Wenn ich mich jetzt mit "ssh automat@192.168.178.22 -i ~/.ssh/automat_rsa" einlogge, dann bin ich sofort als "automat@raspberrypi" angemeldet.
 

rolapp

Fan vom SSF
Dann kümmern wir uns mal um das PHP-Script.

Frage welche PHP Version läuft bei Dir. (php -v)
Ist PHP ssh2 extension aktiviert?
 

3df

Registered User
Auf dem Webserver (Synology WebStation) ist PHP 5.6 installiert und SSH2 ist aktiviert.
 

rolapp

Fan vom SSF
Sehr gut dann ist das schon mal erledigt.

Der Rest ist jetzt ein Witz.
Kopiere die Dateien automat_rsa und automat_rsa.pub auf die Synology sagen wir mal /root/.ssh/ (ich gehe jetzt mal davon aus das Verzeichnis das existiert)
PHP Script auf der Synolgy anlegen, sagen wir ssh.php das Verzeichnis musst du jetzt wissen.
PHP:
<?php
$connection = ssh2_connect('IPvomPI', 22, array('hostkey'=>'ssh-rsa'));

if (ssh2_auth_pubkey_file($connection, 'automat',
                                       '/root/.ssh/automat_rsa.pub',
                                       '/root/.ssh/automat_rsa')) {
  echo "Public Key Authentication Successful\n";
} else {
  die('Public Key Authentication Failed');
}
$stream = ssh2_exec($connection, 'sudo /opt/test/test.sh');
?>

Die 22 ist der ssh Port gegebenenfalls anpassen.
Die Datei /opt/test/test.txt auf dem pi löschen.

im Webrowser IPvonSynolgy/ssh.php
Wenn alles richtig ist sollte die Meldung 'Public Key Authentication Successful' kommen
Auf dem Pi sollte jetzt die Datei text.txt wieder da sein.
 

3df

Registered User
Hallo, ich habe auf der Synology "nur" den Ordner "/var/services/homes/admin"
 
Last edited by a moderator:
Top