PDA

Bekijk Volledige Versie : Via php ssh verbinding maken naar andere server



TiMMiEJ
19/04/06, 18:23
Ik wil vanuit de server waar mijn webserver draait een ssh verbinding maken naar een andere machine. Nu maakt het even helemaal niet of het veilig is of niet want het is puur om even te testen.

Ik doe nu dit:


<?php
$test = shell_exec("ssh ip -p port -l username;password;ps -A -f");
print $test;
?>


Ik krijg gewoon een output, maar ik krijg de info te zien van de server waar de webserver op draait.

//edit: ik zie net dat ik mijn bericht in het foute gedeelte heb gepost

frvge
19/04/06, 19:00
fsockopen?

TiMMiEJ
19/04/06, 19:06
fsockopen?

Dat gaan niet werken, want ik wil nadat ik ben ingelogd op de andere machine commands uitvoeren.

_arno_
19/04/06, 20:05
is misschien de libssh2 library een optie?
http://nl2.php.net/manual/en/ref.ssh2.php

TiMMiEJ
19/04/06, 20:10
is misschien de libssh2 library een optie?
http://nl2.php.net/manual/en/ref.ssh2.php

Jop die heb ik gevonden, nu zit ik met deze error :S :



[root@server9 ~]# pear install ssh2-beta
downloading ssh2-0.10.tgz ...
Starting to download ssh2-0.10.tgz (22,187 bytes)
........done: 22,187 bytes
5 source files, building
running: phpize
sh: phpize: command not found
`phpize' failed


Als ik "whereis phpize" tik dan krijg ik geen message, phpize is volgens mij niet geinstalleerd?

Ik draai versie: 4.3.9-3.9

//edit:
[root@server9 ~]# rpm -q php-devel
package php-devel is not installed

Na het installeren van deze package werkt het naar behoren!

[root@server9 ~]# rpm -ql php-devel | grep phpize
/usr/bin/phpize
/usr/lib/php/build/phpize.m4

blaaat
19/04/06, 22:13
Je moet pipen naar SSH.. (dus programma 'ssh').

http://nl2.php.net/popen
http://nl2.php.net/manual/nl/function.proc-open.php *deze heb je nodig denk ik*

Laatste werkt geloof ik niet lekker onder windows, volgens mij kan windows namelijk maar 1 programma tegelijk pipen. *not sure modus*

ju5t
20/04/06, 15:10
Dit ooit geschreven, ongetest. Maakt wel gebruik van de ssh2 library.


<?php
/**
*@ Unix monitoring
**/

function ssh_disconnect($reason, $message, $language)
{
printf("Server disconnected with reason code [%d] and message [%s]\n", $reason, $message);
}

$methods = array(
'kex' => 'diffie-hellman-group1-sha1',
'client_to_server' => array(
'crypt' => '3desc-cbc',
'comp' => 'none'),
'server_to_client' => array(
'crypt' => 'aes256-cbc,aes192-cbc,aes128-cbc',
'comp' => 'none'));

$callback = array('disconnect' => 'ssh_disconnect');

$host = "hostname"; // note that remote connections are blocked in the firewall
$port = 22;
$timeout = 5;
$username = "root";
$password = "foobar";

$fp = @fsockopen($host, $port, $errno, $errstr, $timeout);
if($fp)
{
$connection = ssh2_connect($host, $port, array(), $callback);
if(!$connection)
{ // connection failed
die('Connection failed');
}
else
{ // connection successfull, execute command
ssh2_auth_password($connection, $username, $password);

// find disk usage binary
$stream = ssh2_exec($connection, '/usr/sbin/df -h');

// check for stream
if($stream)
{
$i = 1;
while($line = fgets($stream))
{
echo "{$line}\r\n";
$i++;
}
}
else
{
echo "Failed to execute command";
}
}
}
else
{
echo "The hostname '{$host}' failed to respond within {$timeout} seconds<br /><br />";
echo "$errstr ($errno)<br />\n";
}

TiMMiEJ
20/04/06, 16:54
Thnx voor je reactie, maar ik heb mijn script al klaar ;)

rayden
20/04/06, 20:13
Ik heb dat script vrijwel letterlijk gecopypasted, maar kan eigenlijk geen output krijgen.. ook met de andere methodes volgens die manual krijg ik geen output (krijg gewoon nix te zien) iemand suggesties?

SebastiaanStok
20/04/06, 20:14
Even ter informatie.
Op php-classes is een Class die verbinding kan maken met SSH, een SSH client in php dus hij onderstound echter alleen v1 van SSH.


Maar een ding weet ik wel: wAT PEST POKE werk is dat om het enigsinds werkend te krijgen :r :eek: Je krijg alles terug dus ook je camando wat je zelf verstuurde... Mijn tip is maak zelf iets in php met de socket extensie ;)
Dus een server en client.:cool:

ju5t
20/04/06, 23:14
Je eigen commando filteren is niet zo moeilijk hoor.

Nog over het bovenstaande stukje code, nogmaals, het is niet getest. Geen tijd voor gehad.

SebastiaanStok
21/04/06, 09:55
Niet zo moelijk zecht hij :D
Het heeft bij mekaar een week geduurt het helemaal bugs vrij te krijgen.

Hier een voorbeeld voor het aanmaken van users met adduser.


static function Adduser(&$aParams, &$ssh)
{
$ssh->write('adduser -s /sbin/nologin -d '.escapeshellarg($aParams['home_dir']).' -p '.escapeshellarg(crypt($aParams['password'])).' '.escapeshellarg($aParams['username'])."\n");
$cycle = true;
while($cycle)
{
$data = $ssh->read();
if (ereg('\[root@', $data))
{
$cycle = false;
$data = preg_replace('/\[root@(.*) (.*)]\#/is', '', $data);
}
}

// If we got somthing back we got an problem.
if(strlen(trim($data)) > 1)
{
return 'The adduser returnd the folowing content: '.trim($data);
}

$ssh->write('chmod 755 '.escapeshellarg($aParams['home_dir']).';mkdir '.escapeshellarg($aParams['home_dir']).'/public_html; chown '.escapeshellarg($aParams['username']).':www '.escapeshellarg($aParams['home_dir']).'/public_html'."\n");
$cycle = true;
while($cycle)
{
$data = $ssh->read();
if (ereg('\[root@', $data))
{
$cycle = false;
$data = preg_replace('/\[root@(.*) (.*)]\#/is', '', $data);
}
}

// If we got somthing back we got an problem.
if(strlen(trim($data)) > 1)
{
return 'Returnd the folowing content: '.trim($data);
}

return true;
}

TiMMiEJ
21/04/06, 14:57
Ik heb dat script vrijwel letterlijk gecopypasted, maar kan eigenlijk geen output krijgen.. ook met de andere methodes volgens die manual krijg ik geen output (krijg gewoon nix te zien) iemand suggesties?

Je hebt ook libssh2 geinstalleerd? Zoja, met dit stukje code krijg ik de output terug:



$stream = ssh2_exec($connection, 'ps -A -f');
stream_set_blocking($stream, true);
$cmd=fread($stream,8192);
fclose($stream);
echo $cmd;