2010-08-04 10 views
9

Ich versuche, ein PHP-Skript, das auf dem Terminal ausgeführt wird, die eine Verbindung zu einem Remote-Server durch SSH herstellen und eine Datei abrufen würde. so weit dies ist mein CodeVerbindung versuchen mit ssh2_auth_pubkey_file()

#!/usr/bin/php -q 
<?php 
$cwd = dirname(__FILE__).'/'; 
$filename = 'retrive-this.file'; 
$host = 'hostip'; 

$connection = ssh2_connect($host, 22, array('hostkey'=>'ssh-rsa')); 
$methods = ssh2_auth_pubkey_file($connection, 'remoteuser', 
           $cwd.'ssh/id_rsa.pub', 
           $cwd.'ssh/id_rsa', "it's an inception"); 
var_dump($methods); 

//ssh2_scp_recv($connection, "/remote/server/path/to/$filename", $cwd.$filename); 
?> 

für jetzt habe ich Probleme habe mit der ssh2_auth_pubkey_file() Funktion, wenn ich das Skript ausführen es diese gibt:

PHP Warning: ssh2_auth_pubkey_file(): Authentication failed for remoteuser using public key in /home/tonyl/Projects/get-file-ssh.php on line 10 
bool(false) 

Die Schlüsseldateien haben die Erlaubnis -rw-r--r-- (644). Auch der öffentliche Schlüssel ist bereits den autorisierten Schlüsseln des Remote-Benutzers hinzugefügt. Ich bin in der Lage, ssh mit dem Befehl ssh als normal, so dass ich glaube nicht, es ist ein SSH-Autorisierung Problem, aber wer weiß. Ich bin neu in ssh und der ssh2 php Bibliothek.

Ich kann verbinden mit ssh2_auth_password(), wenn ich es in der Remote-sshd_config-Datei aktivieren, aber ich möchte das nicht tun, da es Sicherheitsübertragung verringert.

Irgendwelche Ideen, was ich tun kann.

+1

Standard-Dir wäre '.ssh', nicht' ssh', könnte das das Problem sein? Und id_rsa sollte wirklich 0600 sein, im Besitz des Benutzers, der verbindet. – Wrikken

+0

Wenn dies mit ssh von der Kommandozeile aus funktioniert, ist es fast unmöglich zu debuggen, ohne libssh2 mit einem Debugger zu betreten. Sie könnten auch versuchen, zuerst PHP mit strace auszuführen, um zu sehen, ob Sie etwas faul finden können. – Artefacto

+0

Ich kann zumindest bestätigen, dass dies die _exact_ Fehlermeldung ist, die man erhält, wenn die öffentlichen/privaten Schlüsseldateien nicht existieren. – Wrikken

Antwort

9

Dies ist ein bekannter Fehler in PHP: passwortgeschützter privater Schlüssel kann nicht auf bestimmten Kombinationen verwendet werden.

See: https://bugs.php.net/bug.php?id=58573

ssh2_auth_pubkey_file() gebrochen wird, wenn der öffentliche Schlüssel-Datei mit einem Passwort geschützt ist und libssh2 mit libgcrypt zusammengestellt, die, was Debian ist/ubuntu und wahrscheinlich andere tun. Ich arbeite an einer Lösung für diesen Fehler, aber wenn Sie diese Funktion benötigen, bauen Sie libssh2 selbst mit OpenSSL neu auf.

Eine Problemumgehung kann sein, den privaten Schlüssel unverschlüsselt zu speichern. den Schlüssel zu entschlüsseln:

openssl rsa -in id_rsa -out id_rsaNOPASSWORD 

und dann die Datei id_rsaNOPASSWORD verwenden, ohne den fünften Parameter ‚Passwort‘ zu liefern. Es funktioniert, aber Sie müssen vorsichtig mit Ihrer entschlüsselten Schlüsseldatei sein. Wie auch immer, die Sicherheitsstufe ist nicht wirklich betroffen, denn selbst mit einem verschlüsselten Schlüssel müssten Sie die Passphrase unverschlüsselt an die Funktion ssh2_auth_pubkey_file übergeben ...

Ich hoffe, es hilft.

+0

Sie könnten einfach http://phpseclib.sourceforge.net/ verwenden. Es hat nicht nur dieses Problem - es unterstützt mehr Schlüsselformate als die SSH-Erweiterung von PHP - PuTTY, PKCS8, PKCS1, XML, Passwörter, keine Passwörter usw. – neubert

0

das sieht hier wie der Fehler aus. FILE ist ein Dateipfad, nicht wahr? es sieht also ungefähr wie /somedir/somefile.php aus und alles, was du getan hast, ist ein/am Ende von .php hinzuzufügen, also glaube ich nicht, dass das wirklich gültig ist. siehe http://www.php.net/manual/en/language.constants.predefined.php

$cwd = dirname(__FILE__).'/'; 

auch, haben andere Menschen mit ssh2_auth_pubkey_file Probleme wurden Rückkehr falsch unter allen Bedingungen. Vielleicht möchten Sie einen Fehlerbericht senden. Ich hatte gehofft, diese Funktion zu nutzen. Ich weiß nicht, wie ich es benutzen soll, weil ich keine Ahnung habe, wie man einen privaten Schlüssel liefert.

Ich denke, der Code, den Sie wollen, ist

if (!defined('__DIR__')) { 
    $iPos = strrpos(__FILE__, "/"); 
    define("__DIR__", substr(__FILE__, 0, $iPos) . "/"); 
} 
$cwd=__DIR__ . '/'; 

und denken Sie daran, dass, wenn es um das Remote-Verzeichnis kommt, sollten Sie ssh2_sftp_realpath werden().

dirname() wurde als unzuverlässig gemeldet.

+0

Der Code '$ cwd = Verzeichnisname (__ FILE __). '/';' Gibt das richtige Verzeichnis zurück: '/ home/tonyl/Projects /' Ich glaube nicht, dass das das Problem ist und auch 'dirname()' seit ich nicht verwende es für den lokalen Ordner, nicht für den Remote-Ordner. Danke für die Hilfe, ich denke, ich werde sehen, ob es einen Fehlerbericht über die C-Bibliothek oder PHP –

+0

gibt Im Zweifelsfall verwenden Sie einfach Ihren Pfad so ->/home/user/dir/', denn das Problem ist nicht Dein Pfad ist die PHP-Funktion ssh2_auth_pubkey_file. Ich bin hier mit dem gleichen f **** Problem gestapelt – B4NZ41

+0

Haben Sie es geschafft, eine Lösung zu finden? Ich stehe hier mit dem gleichen Problem fest. Verwenden Sie einen geheimen Schlüssel? Wenn ja, ist ein wahrscheinlicher Kandidat, der das verursacht, ein Fehler https://bugs.php.net/bug.php?id=58573 – MicE