SSH kann Daten durch die Technologie der Verschlüsselung von Online-Paketen übertragen; mit SSH können alle übertragenen Daten verschlüsselt werden. Selbst wenn jemand die Daten abfängt, können keine nützlichen Informationen erhalten werden. Gleichzeitig werden die Daten komprimiert, was die Übertragungsgeschwindigkeit deutlich beschleunigt. Kurz gesagt: Durch den Einsatz von SSH kann eine relativ sichere und effiziente Datenübertragung gewährleistet werden.
Allerdings weiß nicht jeder, dass PHP eine Verbindung zu SSH herstellen und Remote-Befehle ausführen kann, aber es ist sehr nützlich. Da wir PHP auf so viele verschiedene Arten nutzen können, verfügt es über viele Einstellungsmöglichkeiten, um sein Verhalten zu steuern. Ein großer Satz optionaler Parameter ermöglicht Ihnen die Verwendung von PHP für viele verschiedene Zwecke. Dies bedeutet jedoch auch, dass die Kombination dieser Parameter und der serverseitigen Konfiguration einige Sicherheitsprobleme mit sich bringen kann. Der Autor hat SSH in einer PHP-CLI-Anwendung verwendet, aber am Anfang war es nicht sehr einfach. Man kann sagen, dass es ziemlich schwierig war. Das Handbuch zur sicheren Verwendung von Shell2-Funktionen ist nicht sehr praktisch. Der Autor hat viele Experimente durchgeführt, bevor er heute diesen kleinen Artikel verfasst hat. Ich hoffe, dass er Ihnen nach dem Lesen etwas Zeit bei der Konfiguration von PHP ersparen kann.
In diesem Artikel muss ich davon ausgehen, dass
das von Ihnen verwendete Betriebssystem Debian/Ubuntu ist. Wenn Sie Debian/Ubuntu nicht verwenden, müssen Sie möglicherweise den entsprechenden Inhalt dieses Artikels durch den Paketmanager ersetzen, der von Ihrer Linux-Distribution bereitgestellt wird.
Sie verwenden PHP5. Wenn Sie nicht PHP5 verwenden, können Sie stattdessen PHP4 verwenden.
Du verfügst über grundlegende Kenntnisse in PHP und Serveradministration.
Sie haben PHP bereits installiert.
Voraussetzungen
Installationspakete
Zuerst installieren wir die folgenden Pakete:
sudo aptitude update
sudo aptitude install php5-dev php5-cli php-pear buid-essential
openssl-dev zlib1g-dev
Die Installation ist abgeschlossen und fahren mit dem nächsten Schritt fort.
Kompilieren Sie libssh2
Nachdem wir Libssh2 von der SourceForge-Website heruntergeladen haben, müssen wir es kompilieren, aber keine Sorge, Sie müssen nur Folgendes tun:
cd /usr/src
wget
// Melden Sie sich bei server1.example.com an Port 22 an,
wenn ( !($con = ssh2_connect("server1.example.com", 22))){
echo "fail: Verbindung konnte nicht hergestellt werdenn"
} else {
// Versuchen Sie, sich mit Benutzername root und Passwort zu authentifizieren,
wenn(! ssh2_auth_password ($con, "root", "secretpassword")) {
echo "fail: authentifizierung nicht möglichn";
sonst {
// Alles klar, wir sind dabei!
echo "okay: angemeldet...n" ;
// einen Befehl ausführen
if(!($stream = ssh2_exec($con, "ls -al")) ){
echo "fail: unfähig, Befehl auszuführenn";
sonst{
// Rückgabedaten vom Befehl sammeln
stream_set_blocking ( $stream, true );
$data = "";
while( $buf = fread($stream
,4096) ){
$
data .= $buf
}
}
Zweite Methode: Shell
Auf die gleiche Weise können Sie auch eine Funktion oder eine Klasse für den folgenden Code schreiben. Dieser Artikel stellt jedoch nur die grundlegenden Konzepte bereit:
if (!function_exists("ssh2_connect")) die("function ssh2_connect does't exist")
// Melden Sie sich bei server1.example.com an Port 22 an
if(!($con = ssh2_connect ("server1.example.com", 22))){
echo "fail: Verbindung konnte nicht hergestellt werdenn"
} else {
// Versuchen Sie, sich mit Benutzername root und Passwort zu authentifizieren
if(!ssh2_auth_password($con, "root", "secretpassword")) {
echo "fail: authentifizierung nicht möglichn";
//
Alles
klar, wir sind dabei!
echo "okay: angemeldet...n";
Shell
if (!($shell = ssh2_shell($con, 'vt102', null, 80, 40, SSH2_TERM_UNIT_CHARS))){
echo "fail: Shell konnte nicht eingerichtet werdenn"
} else{
stream_set_blocking( $shell, true ) ;
/ / sende einen Befehl
fwrite($shell,"ls -aln");
//
& sammle zurückgegebene Daten
$
data = "";
){
$data .= $buf;
}
fclose($shell);
}
}
}
Tipp:
Manchmal ist der Server ausgelastet oder es tritt ein Verbindungsfehler auf und es befinden sich keine Daten im Puffer, und das PHP-Skript stoppt die Ausgabe ein Befehl (auch wenn der Befehl nicht abgeschlossen wird!), um Daten zu sammeln. Dazu können Sie Folgendes tun:
ssh2_exec($con, 'ls -al; echo "__COMMAND_FINISHED__"' );
Schauen Sie sich in Ihrer Schleife, die ständig den Puffer überprüft, einfach COMMAND_FINISHED an. Denn dann wissen Sie, dass Sie über alle Daten verfügen. Um Endlosschleifen (Endlosschleifen) zu vermeiden, können Sie eine Zeitüberschreitung von 10 Sekunden verwenden:
$time_start = time();
while( true ){
$
data .= fread($stream, 4096) ;
if( strpos($data,"__COMMAND_FINISHED__") !== false){
echo "okay: Befehl beendetn";
break;
if
( (time()-$time_start) > 10 ){
echo "fail: timeout von 10 Sekunden wurde erreichtn";
break;
}
}
Im obigen Beispiel sollten Sie stream_set_blocking besser auf false setzen.
Senden Sie Dateien über SSH
ssh2_scp_send($con, "/tmp/source.dat", "/tmp/dest.dat", 0644);
Wenn es nicht ordnungsgemäß funktioniert,
überprüfen Sie bitte die folgenden Aspekte:
Befolgen Sie diesen Artikel, um jeden Schritt zu überprüfen Ihres Betriebs
Auf der Serverseite muss „PasswordAuthentication ja“ in sshd_config aktiviert sein. Der Standardwert auf den meisten Servern ist „Ja“, aber in einigen Fällen müssen Sie möglicherweise die folgende Zeile zur Datei hinzufügen, um diese Funktion selbst zu aktivieren:
/etc/ssh/sshd_config:
# Auf „Ja“ ändern, um getunnelte Klartextkennwörter zu aktivieren.
PasswordAuthentication „Ja“.
Wenn Sie Änderungen vornehmen, müssen Sie SSH neu starten:
/etc/init.d/ssh restart