HOWTO --> Remote Commands SSH mit PHP ausführen.
Posted: 2005-09-07 19:42
Hi,
Daher ich sowas selber immer gesucht habe und nach langen probieren nun endlich geschafft habe, möchte ich mein Howto für alle hier bereit stellen.
Es gibt sowas schon für Perl, aber perl und php ist nicht wirklich kompatible.
So, dann wollen wir mal anfangen.
Was benötigen wir alles?
- libssh2
--> http://www.php.net/manual/de/ref.ssh2.php
- PECL
--> http://pecl.php.net/package/ssh2
- public key schlüsselpaar
--> http://www.rootforum.org/faq/index.php? ... artlang=de
- Ein geeignetes phpscript zum testen
--> Code wird hier gepostet.
So, dann wollen wir mal anfangen. Als erstes saugt ihr euch Aktuellen die Sourcen von libssh2, die compelieren wir anhand der Readme.
Runterladen des aktuellen PECL und entpacken und dann in das Verzeichnis wechseln und folgendes eingeben:
Das läuft jetzt durch und erstellt die ssh2.so datei, die ihr dann im Ordner modules findet.
So jetzt müsst ihr schauen wo von euch das php extension_dir liegt. Am besten mal die /etc/php.ini öfnnen und nachsehn. Wenn keine vergeben ist, dann ein dir angeben z.b so:
danach binden wir noch die ssh2.so ein, die wir zuvor dann in das extensiondir kopieren mit
Danach schreiben wir noch in die php.ini
Danach startet ihr den Apache neu, um die php.ini neu einzulesen.
Wenn kein Fehler kommt, dann ist es ab jetzt aktiviert. Ihr könnt dazu auch mit einer phpinfo schauen, ob es aktiviert ist und wenn ja, dann müsste sowas drin stehen:
Damit haben wir das libssh2 abgeschlossen und kommen zum nächsten teil und zwar das erstellen eines schlüsselpaars.
am besten als web1 einloggen als nicht root user, oder wie bei euch der shell User heissen mag.
So damit hätten wir jetzt ein schlüsselpaar erstellt und den pubkey in die authorized_keys eingetragen. Damit ist aber noch kein Remotelogin möglich, weil der Remoteserver euch ja noch nicht kennt und das werden wir nun jetzt tun, damit der Remote uns anerkennt.
Also erst einmal mit
auf dem Remote einloggen. Dann fragt er euch ob ihr einverstanden seit ob der Server in die known_hosts eingetragen werden soll. Das beantwortet ihr mit yes. Nun müsste im .ssh Ordner eine Datei namens known_hosts vorhanden sein mit dem Remote Fingerprint bzw. key.
So nun geht es weiter...
Ihr müsst euch per SSH auf eurem Remote Rechner einloggen, wie auch beim localen am besten mit nem usershell und nicht root.
Wenn dort kein .ssh Verzeichnis existiert legen wir es wieder nach dem selben Schema an.
So nun müssen wir noch in unserem pubkey vom localen Server dort eintragen. Dazu wechseln wir auf den Localen Server und machen ein
und makiert alles und kopiert ihn, danach wechselt ihr den kopierten key auf den Remote rechner in die Datei authorized_keys.
So nachdem der Key nun drin steht, währe alles vorbereitet, um nun alles einmal zu testen, dazu nehmen wir mal folgenden phpcode.
der PHP Code ist fast selbsterklärend und sollte verstanden werden.
Wenn alles erfolgreich war, dann sollte sowas kommen beim aufruf:
Falls es bei einem absolut nicht zu gehen scheint, habe ich hier noch eine stützhilfe:
--> http://www.php-resource.de/forum/showth ... 24428.html
Ab dort wo reaVen sein prinzip beschreibt (mit dem key). und dieses Prinzip funktioniert auch zu 100% weil selber getestet.
Ich hoffe dies hilft euch ein wenig und wenn ihr da ergänzungen habt, dann könnt ihr sie ja posten. in HOWTOS posten bin ich nicht so der Burner :D
Aber ich hoffe, dass dies man gut verstehn kann und wenn doch mal was nicht verstanden werden sollte, dann einfach hier posten.
@admins evtl. kann man den Thread ja pinnen oder so, weil für den einen oder anderen ist es sicherlich nützlich und eine alternative zu dem perl was hier angeboten wird.
Daher ich sowas selber immer gesucht habe und nach langen probieren nun endlich geschafft habe, möchte ich mein Howto für alle hier bereit stellen.
Es gibt sowas schon für Perl, aber perl und php ist nicht wirklich kompatible.
So, dann wollen wir mal anfangen.
Was benötigen wir alles?
- libssh2
--> http://www.php.net/manual/de/ref.ssh2.php
- PECL
--> http://pecl.php.net/package/ssh2
- public key schlüsselpaar
--> http://www.rootforum.org/faq/index.php? ... artlang=de
- Ein geeignetes phpscript zum testen
--> Code wird hier gepostet.
So, dann wollen wir mal anfangen. Als erstes saugt ihr euch Aktuellen die Sourcen von libssh2, die compelieren wir anhand der Readme.
Code: Select all
./configure --prefix=/usr --with-openssl=/usr
make && make install
--> sollte kein Fehler erscheinen geht es weiter
Code: Select all
phpize && ./configure --with-ssh2 && make
So jetzt müsst ihr schauen wo von euch das php extension_dir liegt. Am besten mal die /etc/php.ini öfnnen und nachsehn. Wenn keine vergeben ist, dann ein dir angeben z.b so:
Code: Select all
extension_dir = /usr/lib/php
Code: Select all
cp ssh2.so /usr/lib/php
Code: Select all
extension = ssh2.so
Wenn kein Fehler kommt, dann ist es ab jetzt aktiviert. Ihr könnt dazu auch mit einer phpinfo schauen, ob es aktiviert ist und wenn ja, dann müsste sowas drin stehen:
Code: Select all
ssh2 support enabled
am besten als web1 einloggen als nicht root user, oder wie bei euch der shell User heissen mag.
Code: Select all
<-- Falls noch nicht vorhanden -->
mkdir .ssh
chown web1:web1 .ssh
chmod -R 0700 .ssh
<-------------------------------->
ssh-keygen -b 4096 -t rsa
--> Könnt entscheiden ob mit oder ohne passphrase haben wollt oder nicht.
cd .ssh
cat id_rsa.pub >> authorized_keys
Also erst einmal mit
Code: Select all
ssh user@ip
So nun geht es weiter...
Ihr müsst euch per SSH auf eurem Remote Rechner einloggen, wie auch beim localen am besten mit nem usershell und nicht root.
Wenn dort kein .ssh Verzeichnis existiert legen wir es wieder nach dem selben Schema an.
Code: Select all
mkdir .ssh
chown -R web1:web1
chmod 0700 .ssh
cd .ssh
touch authorized_keys
chown web1:web1 authorized_keys
chmod 0644 authorized_keys
Code: Select all
cat id_rsa.pub
Code: Select all
joe authorized_keys
--> könnt auch anderen editor nehmen, aber ich bevorzuge den joe :-)
--> Code reinkopieren und aufpassen, das alles in einer Zeile steht und die userinfo die am ende des keys ein space hat zwischen key und userinfo.
Das kann so aussehn:
3DFGRT web1@blnsnoopy26
der PHP Code ist fast selbsterklärend und sollte verstanden werden.
Code: Select all
<?php
function my_ssh_disconnect($reason, $message, $language) {
printf("Server disconnected with reason code [%d] and message: %sn",
$reason, $message);
}
$methods = array(
'kex' => 'diffie-hellman-group1-sha1',
'client_to_server' => array(
'crypt' => 'aes256-cbc',
'comp' => 'none',
'mac' => 'hmac-sha1'),
'server_to_client' => array(
'crypt' => 'aes256-cbc',
'comp' => 'none',
'mac' => 'hmac-sha1'));
$callbacks = array('disconnect' => 'my_ssh_disconnect');
$ssh_host = "DEINE IP";
$connection = ssh2_connect($ssh_host, 22, $methods, $callbacks);
if (!$connection) die('Connection failed');
echo "Connected with $ssh_host<br>n";
$fingerprint = ssh2_fingerprint($connection, SSH2_FINGERPRINT_MD5 | SSH2_FINGERPRINT_HEX);
echo "This host's Fingerprint is: $fingerprintn<br>";
$user_name = "DEIN LOGIN USERNAME";
if (ssh2_auth_pubkey_file($connection, $user_name,'/home/htdocs/web1/.ssh/id_rsa.pub', '/home/htdocs/web1/.ssh/id_rsa', 'DEINE PASSPHRASE FALLS GEWÃ?HLT SONST LEER LASSEN')) {
echo "Public Key Authentication Successful as user: $user_name<br>n";
} else {
die('Public Key Authentication Failed');
}
$ssh_command = "/usr/bin/php -i"; // HIER KANNST DEIN COMMAND EINTRAGEN
echo "Executing Command: $ssh_command<br>n";
echo "<pre>";
$stream = ssh2_exec($connection, $ssh_command);
stream_set_blocking( $stream, true );
while ( $inhalt = fread( $stream, 4096 )) {
echo "$inhalt";
}
echo "</pre>";
?>
--> desweiteren noch den pfad zur id_rsa.pub und id_rsa anpassen vom localen rechner.
Code: Select all
Connected with 217.160.xxx.x
This host's Fingerprint is: B47CA4B6F1B4C48C71D5C051942C8GTZ
Public Key Authentication Successful as user: web1
Executing Command: /usr/bin/php -i
Content-type: text/html
X-Powered-By: PHP/5.0.4
--> Weil hab hier einfach mal /usr/bin/php -i als command gewählt.
--> http://www.php-resource.de/forum/showth ... 24428.html
Ab dort wo reaVen sein prinzip beschreibt (mit dem key). und dieses Prinzip funktioniert auch zu 100% weil selber getestet.
Ich hoffe dies hilft euch ein wenig und wenn ihr da ergänzungen habt, dann könnt ihr sie ja posten. in HOWTOS posten bin ich nicht so der Burner :D
Aber ich hoffe, dass dies man gut verstehn kann und wenn doch mal was nicht verstanden werden sollte, dann einfach hier posten.
@admins evtl. kann man den Thread ja pinnen oder so, weil für den einen oder anderen ist es sicherlich nützlich und eine alternative zu dem perl was hier angeboten wird.