SSH möglich.

Hallo Michael und Stele99,

ich musste eben mit erschrecken feststellen dass ich mich noch nicht zu dem Beitrag geäußert habe - insbesondere zu dem von Michael - ich bitte um Entschuldigung…
Vielen Dank erst einmal für die Antworten.

@Michael: Muss ich in Deinem Skript „IPS“ durch meine Server-IP ersetzen und die „1“ durch die Prozess-ID von Siri auf dem Raspberry Pi??
(Ich bin wirklich Linux-Neuling…:o)

Joachim

ips ersetzt du durch den rechnername auf dem ipsymcom laeuft, oder dessen IP
siri ersetzt du durch den namen des ‚siri‘ daemons. Keine Ahnung wie der heisst…

Gruss, Michael

Hallo Leute,

um den Anmeleprozess zu beschleunigen habe ich ein RSA-Key-Paar über Putty erzeugt. Auf dem Raspberry Pi eingerichtet und über Putty selbst läuft die Anmeldung mit der Verifizierung über den Key.

Im IPS bekomme ich es leider nicht hin, hat jemand einen Tipp für mich?

//*************************************************************************************************************
// Senden den Befehl an den Raspberry Pi
function Philips_Send_RSA($ipRPi, $command)
{
   set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
	include('Crypt/RSA.php');
	include('Net/SFTP.php');
	include "Konstanten.ips.php";

   $key = new Crypt_RSA();
    //$key->setPassword('paeper@horburg.de');
	 $key->setEncryptionMode(CRYPT_RSA_PRIVATE_FORMAT_PUTTY);
	 $key->loadKey(file_get_contents("D:\IP-Symcon\scripts\phpseclib\RPiTV.ppk"));
    
   $ssh = new Net_SSH2('192.168.178.35');
     if (!$ssh->login('root', $key)) {
        exit('Login Failed');
    }

     echo $ssh->read('root@192.168.178.35:~$');
     $ssh->write("ls -la
");
     echo $ssh->read('root@192.168.178.35:~$');

	$result = $ssh->exec($command);

return $result;
}

Joachim

Der Putty-Key (*.ppk) muss erst noch ins openssh Format exportiert werden. Dann das erzeugte File als Key nehmen.

Tommi

Hallo Tommi,

vielen Dank für Deine Antwort.
Ich habe jetzt mit Putty diese Änderung der Datei vorgenommen, leider läuft es immer noch nicht. Ist mein Skript vielleicht noch falsch?

Joachim

Vergiss das Umwandeln, die aktuelle phpseclib 0.30 kann auch mit Putty Keys umgehen.
Das funktioniert bei mir:

<?php

 //Fügen Sie hier Ihren Skriptquellcode ein
//set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
//unnötig, liegt bei mir in $IPS/scripts
$wd=dirname(__FILE__);
set_include_path($wd);
include('Net/SSH2.php');
include('Crypt/RSA.php');

$ssh = new Net_SSH2('rasbpi2');
$key = new Crypt_RSA();
$key->loadKey(file_get_contents('root.ppk'));
if (!$ssh->login('root', $key)) {
    exit('Login Failed');
}

echo $ssh->exec('pwd');
echo $ssh->exec('ls -la');

?>


/root
insgesamt 1776
drwx------  2 root root    4096 Feb  4 22:25 .aptitude
-rw-------  1 root root    9788 Feb 11 11:04 .bash_history
-rw-r--r--  1 root root     570 Jan 31  2010 .bashrc
...

Tommi

Hallo Tommi,

abermals Dank für Deine Antwort.

Leider bringt es mich nicht wirklich weiter, es kommt der Fehler „Fatal error: Maximum execution time of 30 seconds exceeded in D:\IP-Symcon\scripts\Net\SSH2.php on line 2699“. Wenn ich dort schaue ist das im Bereich der Funktion „function _get_binary_packet()“ - noch irgendeine Idee warum es hier nicht funktioniert?

Joachim

was hast Du für eine Keylänge eingestellt? Der Test war ein 2048bit ssh2-rsa Key. Sonst fällt mir langsam nichts mehr ein außer die aktuelle Version von phpseclib: pure PHP implementations of SSH, SFTP, RSA and X.509 downloaden…

Tommi

…ich habe auch den 2048bit ssh2-rsa Key, ist so ja auch voreingestellt…
Die Neuste Version habe ich auch schon bereits bei meinen stundenlangen Versuchen heruntergeladen…
Über Putty funktioniert es tadellos mit dem Key, vom IPS auch über phpseclib und User/Passwort.
Muss bei der „Installation“ der phpceclib noch irgendetwas beachtet werden??

Joachim

Muss bei der „Installation“ der phpceclib noch irgendetwas beachtet werden??

eigentlich überhaupt nicht. Ich habe das Zip auch nur in den Scripts-Ordner entpackt, die paar Zeilen dazu geschrieben und fertig.

Gibt es einen Fehler beim Laden des keys? Ist auf dem Key ein Password drauf? Das muss man vorher setzen(siehe Doku).Kopiere das ppk File mal testweise in den scripts ordner und lasse beim loadkey den Path und den encryptionmode mal weg sowie die read/write commands.

Tommi

Hallo Tommi,

vielen Dank, es funktioniert jetzt!:smiley:

Nicht der Login war das Problem, sondern das was danach kam!
Hier jetzt mein Skript:

//*************************************************************************************************************
// Senden den Befehl an den Raspberry Pi
function Philips_Send_RSA($ipRPi, $command)
{
   set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');

	include('Crypt/RSA.php');
	include('Net/SFTP.php');
	include "Konstanten.ips.php";

	$ssh = new Net_SSH2('raspberrypi');
	$key = new Crypt_RSA();
	$key->loadKey(file_get_contents("D:\IP-Symcon\scripts\phpseclib\RPiTV.ppk"));
	
     if (!$ssh->login('root', $key)) {
		  exit('Login Failed');
    }

	$result = $ssh->exec($command);

return $result;
}


…ist ungefähr 1/3 schneller als über User/Passwort (0,75 zu 0,52 Sekunden). Weniger Gewinn als erwartet, aber immerhin!:wink:

Joachim

Hallo Tommi,

wenn ich zwei „Befehle“ direkt hintereinander senden möchte, führt das zu einem Fehler da der erste noch nicht komplett abgearbeitet ist (die Verbindung also noch offen). Hast Du diese Herausforderung auch bei Dir? Wie hast Du sie gelöst?

Joachim

Den Fall hatte ich selber nicht, aber evtl. muss man den Timeout mit setTimeout höher setzen Mit isTimeout soll man abfragen können, ob es einen Timeout gab oder die Funktion normal beendet wurde.

Tommi

Hallo Tommi,

ich hatte eine ganze Weile experimentiert, z.B. mit Semaphore enter bzw. leave, funktionierte aber irgendwie nicht.
Jetzt habe ich gerade die Funktion in ein eigenes Skript ausgelagert und starte dieses dann mit RunscriptWait - warum auch immer, jetzt scheint es zu funktionieren…

Wo hast Du dieses Wissen her? Gibt es da noch weitere Dinge von Nutzen zu entdecken?

Joachim

Hallo Tommi,

ich glaube das Problem besteht im Kern darin, dass man im IPS keine „Globalen Variablen“ definieren kann für

	$ssh = new Net_SSH2($_IPS['ipRPi']);
	$key = new Crypt_RSA();

Sobald das Skript verlassen wird, sind diese Zuweisungen unbekannt. Wenn dieses möglich wäre, könnte man die Verbindung wahrscheinlich bei IPS-Start zuweisen und die ganze Zeit benutzten (Vermutung!).

Ich habe noch ein bißchen experimentiert und es nun so gelöst:
Aufruf:

//*************************************************************************************************************
// Senden den Befehl an den Raspberry Pi
function Philips_Send_RSA($ipRPi, $command)
{
	$result = IPS_RunScriptWaitEx(27236 , Array("ipRPi" => $ipRPi, "command" => $command));

	return $result;
}

Das Skript 27236:


   set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');

	include('Crypt/RSA.php');
	include('Net/SFTP.php');
	include "Konstanten.ips.php";

	$ssh = new Net_SSH2($_IPS['ipRPi']);
	$key = new Crypt_RSA();
	$key->loadKey(file_get_contents("D:\IP-Symcon\scripts\phpseclib\RPiTV.ppk"));

     if (!$ssh->login('root', $key)) {
		  exit('Login Failed');
    }

	$result = $ssh->exec($_IPS['command']);
	$ssh->disconnect();

So kann ich auch eine Anzahl von Befehlen kurz hintereinander senden und diese werden sukzessive abgearbeitet - aber eben jedensmal mit der kompletten An- und Abmeldung am Rasberry Pi…

Joachim

Es gibt doch globals (siehe PHP: Geltungsbereich von Variablen - Manual)


$sensorname='Sensor';

....

function delete_sensor($addr) {
	$sensorname=$GLOBALS['sensorname'];

Tommi

…ja, für PHP selbst gilt das wohl - sofern ich es aber verstanden habe gilt dieses nicht für IPS im „Ganzen“…
Oder habe ich etwas übersehen?

Joachim

das ist korrekt.