execution Script shell via ssh2

Eléphanteau du PHP | 12 Messages

29 mars 2011, 07:46

Bonjour, bon je présente un peu déjà la page sa sera peut être plus simple comme sa. Donc je voudrais créer un panel pour administrer des serveurs, pour les reboot, les arrêter, les démarrer. Donc j'ai fais mon panel et je pense que je suis obligé de demande a php d'exécuter mon script shell pour que sa fonctionne en tout cas je vois pas d'autre moyen.

La premiere des choses que j'ai faite c'est de regarde si ssh était bien activé dans php.. J'ai retrouve les lignes suivantes donc je pense que c'est bon.

Code : Tout sélectionner

Registered PHP Streams https, ftps, compress.zlib, compress.bzip2, php, file, glob, data, http, ftp, phar, zip, ssh2.shell, ssh2.exec, ssh2.tunnel, ssh2.scp, ssh2.sftp
Ensuite mon script

Code : Tout sélectionner

#!/bin/sh screen -l -AmdS serv1 taskset -c 1 /opt/server_cs/hlds_run -game cstrike +ip 88.190.19.180 -port 27015 +maxplayers 12 -pingboost 3 +map de_dust2 +sys_ticrate 1020
Ce code je l'ai teste, je me suis log en root via le ssh de mon dédié. je l'ai lance donc avec "/opt/server_cs/up.sh". Il marche bien ya pas de soucis.

Voila ma page

Code : Tout sélectionner

<?php require_once('connexion.php'); session_start(); if (isset($_SESSION['authentification']) && isset($_SESSION['privilege']) == "user"){ } else { header("Location:index.php?erreur=intru"); // redirection en cas d'echec exit; } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" > <head> <title>Panel M's server</title> <link rel="stylesheet" media="screen" type="text/css" title="Design" href="design.css" /> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> </head> <body> <p> Utilisateur <?php echo $_SESSION['login']; ?> </p> <?php $connection = ssh2_connect('************, 22); ssh2_auth_password($connection, '*****', '******'); if ($_SESSION['login'] == "serv1") { $stream = ssh2_exec($connection, "/bin/sh /opt/server_cs/up.sh"); echo 'test'; } else { header("Location:index.php?erreur=intru"); } ?> </body> </html>
Donc bien sur j'ai remplace les *** par ce qui faut xD. Sinon bein je me log en root également même si c'est forcement très bien mais bon c'est un peu la phase de test quoi... Mon site est héberge sur le dédié ou j'ai mon install de mon serveur de jeux (/opt/server_cs/) donc j'ai essaye de mettre l'ip du serveur ou "localhost" mais sa change rien. Et je vois le bien sur ma page le echo test. Voila voila désole si c'est bourré de faute de code j'ai commencé il y a deux jours...

Eléphant du PHP | 92 Messages

29 mars 2011, 10:09

Hello,

Alors j'ai jamais fait ce que tu veux faire mais quand je lis la doc de PHP à propos de ssh2_exec() ils disents que ça retourne soit un flux soit un booleen
Donc il faut que tu teste ton retour de cette manière :
if($stream !== false){//Attention une erreur classique de débutant est de croire que !== est la même chose que !=
//connexion OK
} else {
//connexion NOK
}
Ensuite je ne sais pas quelle version tu utilises mais il semble qu'il y ai des utilisateurs qui se plaignent que si le code n'est pas comme suit, la commande ne s'exécute pas:
$stream = ssh2_exec($connection, "touch ~/some_fake_file", 'xterm'); 
stream_get_contents($stream);//Je pense que c'est le stream_get_contents() qu'il te manque
Pour terminer il faut que tu regardes comment récupérer tes flux stdout et stderr qui pourront te donner plus d'information sur le résultat de ta commande.
Mais pour ça je te renvois à la doc PHP où y a pas mal de personnes qui ont postées des commentaires sur la fonction:
http://php.net/manual/fr/function.ssh2-exec.php
Programmer c'est 20% de syntaxe pour 80% de réflexion et dans les 20% de syntaxe il faut encore compter une bonne dose de réflexion...
Je vous donne des conseils, pas des solutions toutes faites...

Eléphanteau du PHP | 12 Messages

29 mars 2011, 12:18

Re, alors je viens de changer un peu mon code et donc si je me trompe pas sa devrait ressembler a sa.. chui pas trop sur.

Code : Tout sélectionner

<?php $connection = ssh2_connect('************', 22); ssh2_auth_password($connection, '******', '*********'); if($stream !== false) { echo "connexion ok"; } else { echo "connexion nok"; } if ($_SESSION['login'] == "serv1") { $stream = ssh2_exec($connection, "/opt/server_cs/up.sh", 'xterm'); stream_get_contents($stream); } else { header("Location:index.php?erreur=intru"); } ?>
Donc je vois pas trop sur php france, pourquoi tu met xterm mais bon je l'ai installe sur mon serveur. Sur mon site quand je l'ouvre j'ai "connexion ok " mais le script ne s'execute pas encore

Eléphanteau du PHP | 12 Messages

29 mars 2011, 12:42

Je viens de regarder, sur le site du zero et deux toris autres sites. Si je ne me trompe pas il faut plutot un if($stream != false) plutot que if($stream !== false)? enfin en tout cas a chaque fois je ne vois qu'un seul = pour dire différent.

ViPHP
xTG
ViPHP | 7331 Messages

29 mars 2011, 12:53

Voici ce qui devrait te renseigner sur le != et !==
faq-tutoriels/validation-isset-null-aut ... 55737.html

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

29 mars 2011, 12:55

=== ou !== permettent de tester le type et éviter que zéro, null, une chaine vide etc soit considéré comme faux.

Par exemple
0 == false mais 0 !== false

cela évite que la fonction retourne un zéro que l'on affiche un message d'erreur (par exemple mysql_num_rows peut retourner false ou zéro avec le double égale on ne fait pas la différence ;) )


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 12 Messages

29 mars 2011, 13:12

Ok, merci pour toutes ces informations. Donc normalement il est bien connecte via ssh2 mais le script s'exécute pas.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

29 mars 2011, 13:27

dans ton dernier code
<?php    
$connection = ssh2_connect('************', 22);
ssh2_auth_password($connection, '******', '*********');
if($stream !== false)
            {            
            echo "connexion ok";
            }
            else
            {
            echo "connexion nok";            
            }
         if ($_SESSION['login'] == "serv1")
         {    
         $stream = ssh2_exec($connection, "/opt/server_cs/up.sh", 'xterm');
         stream_get_contents($stream);         
         }
         else
         {
            header("Location:index.php?erreur=intru");
         }
?>
tu test, au début, si $stream !== false mais à ce moment la $stream n'existe pas.

a cet endroit tu peut tester si $connection et le retourn de ssh2_auth_password ne sont pas false ce test sur stream ne peut être fait qu'après le ssh2_exec ;)

je ferais ainsi
<?php    
$connection = ssh2_connect('************', 22);
if ($connection !== false) {
	$pwd = ssh2_auth_password($connection, '******', '*********');
	if ($pwd !== false ) {
		if ($_SESSION['login'] == "serv1")
		{    
			$stream = ssh2_exec($connection, "/opt/server_cs/up.sh", 'xterm');
			if ($stream !== false) {
				stream_get_contents($stream);
				//etc
			}
			else {
				echo 'erreur lors de l\'exec ssh2 ...';
			}
		}
		else
		{
			// a éviter pour les tests histoire de debug facilement
			header("Location:index.php?erreur=intru");
		}
	}
	else {
		echo 'erreur de mot de passe ';
	}
}
else {
	echo 'erreur connection ssh2';
}
?>

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 12 Messages

29 mars 2011, 15:21

Mon script ne s'exécute pas plus avec ce code :/

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

29 mars 2011, 17:05

y a un message d'erreur ?

que retourne ssh2_exec ? (un var_dump($stream); pourrait t'être utile.

est ce que l'utilisation qui "fait tourner" php à la droit d'utiliser ton script dans /opt/server_cs/ (vérifie les droits).

a tu essayé avec le même code d'utiliser un script dans le répertoire du site web ?


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 12 Messages

29 mars 2011, 17:38

Donc après un "var_dump($stream);" j'obtiens "resource(5) of type (stream)" et quand je tape sa sur google bein je vois rien. Ensuite je vois pas trop ou tu vois les droit qu'apache (enfin si c'est bien lui qui fais tourne php) a sur le fichier? ou definit on un utilisateur pour sa? J'ai regarde dans apache.conf et je vois pas grand chose la dedans en rapport avec sa. Apres en changeant le code j'ai essaye de faire un mkdir, et le dossier ne s'est pas crée.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

29 mars 2011, 17:47

les droits, tu les vois avec ton client ftp ou avec une console ssh ;)

si tu obtient ""resource(5) of type (stream)" c'est cela se déroule correctement (du moins pour php sinon tu aurais false).
Ensuite il faut exploiter cette ressource (limite comme tu le ferais avec mysql). c'est ce que tu veut faire avec stream_get_contents par contre, comme l'indique la doc, il faut bien mettre quelque part le retour de cette fonction donc après ou a la place de mon // etc

$retourssh = stream_get_contents($stream);
var_dump($retourssh);

et tu devrais avoir ce que le shell te crash en retour ;)

a tu essayé ton script avec une console ssh (si installé depuis une console bash utilise directement ssh, sous windows dl putty et essai d'utiliser le script ;) ).

s'il s'agit d'un serveur dédié tu doit pouvoir régler le problème "facilement" (en fonction de ce que tu veut avec ton script ;))


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 12 Messages

29 mars 2011, 18:06

Donc je commance avec les droit

Code : Tout sélectionner

ls -l -rwxrwxrwx 1 root root 176 2011-03-28 06:23 up.sh
Mais bon étant donne que j'essaye de connecte php avec mon compte root, je pense que il n'y a pas de soucis.
Et donc oui j'ai pu utilise mon script sans soucis en me log de mon windows avec putty

Code : Tout sélectionner

if ($_SESSION['login'] == "serv1") { $stream = ssh2_exec($connection, "nano /opt/test.txt", 'xterm'); if ($stream !== false) { stream_get_contents($stream); var_dump($stream); }
J'ai laisse sa comme sa par ce que sa parrait logique, et donc sa me laisse l'erreur "resource(5) of type (stream) "

Code : Tout sélectionner

if ($_SESSION['login'] == "serv1") { $stream = ssh2_exec($connection, "nano /opt/test.txt", 'xterm'); if ($stream !== false) { stream_get_contents($stream); $retourssh = stream_get_contents($stream); var_dump($retourssh); }
La j'ai une ligne "string(0) "" " qui apparait.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

29 mars 2011, 18:12

heu t'a deux fois la récup du stream ....

if ($stream !== false)
{
stream_get_contents($stream); <= c'est de trop à virer car tu récupère déja le flux
$retourssh = stream_get_contents($stream);
var_dump($retourssh);

essai ainsi
<?php
if ($_SESSION['login'] == "serv1")
                {   
                        $stream = ssh2_exec($connection, "nano /opt/test.txt", 'xterm');
                  if ($stream !== false)
                  {
                                $retourssh = stream_get_contents($stream);
                        var_dump($retourssh);

                        }
?>
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 12 Messages

29 mars 2011, 18:20

Sa me remet string(0) avec var_dump($retourssh);, avec l'ancienne commande var_dump($stream); j'ai l'erreur resource(5) of type (stream) alors que ya pas de différence entre les deux code non?