SSH peut transférer des données grâce à la technologie de cryptage des paquets en ligne ; en utilisant SSH, toutes les données transmises peuvent être cryptées. Même si quelqu'un intercepte les données, aucune information utile ne peut être obtenue. Dans le même temps, les données sont compressées, ce qui accélère considérablement la vitesse de transmission. En bref, grâce à l’utilisation de SSH, la transmission de données peut être assurée comme étant relativement sécurisée et efficace.
Cependant, tout le monde ne sait pas que PHP peut se connecter à SSH et exécuter des commandes à distance, mais c'est très utile. Étant donné que nous pouvons exploiter PHP de nombreuses manières différentes, il dispose de nombreuses options de configuration pour contrôler son comportement. Un large ensemble de paramètres facultatifs vous permet d'utiliser PHP à de nombreuses fins différentes, mais cela signifie également que la combinaison de ces paramètres et de la configuration côté serveur peut introduire certains problèmes de sécurité. L'auteur a utilisé SSH dans une application PHP CLI. Je l'ai utilisé depuis des cronjobs, mais ce n'était pas très simple au début. On peut dire que c'était assez difficile. Le manuel sur l'utilisation sécurisée des fonctions Shell2 n'est pas très pratique. L'auteur a mené de nombreuses expériences avant de proposer ce petit article aujourd'hui. J'espère qu'après l'avoir lu, cela pourra vous faire gagner du temps dans la configuration de PHP.
Dans cet article, je dois supposer que
le système d'exploitation que vous utilisez est Debian/Ubuntu. Si vous n'exécutez pas Debian/Ubuntu, vous devrez peut-être remplacer le contenu correspondant de cet article par le gestionnaire de paquets fourni par votre distribution Linux.
Vous utilisez PHP5. Si vous n'utilisez pas PHP5, vous pouvez utiliser PHP4 à la place.
Vous avez une compréhension de base de PHP et de l'administration de serveur.
Vous avez déjà installé PHP.
Prérequis
Packages d'installation
Tout d'abord, installons les packages suivants :
sudo aptitude update
sudo aptitude install php5-dev php5-cli php-pear buid-essential
openssl-dev zlib1g-dev
L'installation est terminée et passez à l'étape suivante.
Compiler libssh2
Après avoir téléchargé Libssh2 depuis le site Web sourceforge, nous devons le compiler, mais ne vous inquiétez pas, il vous suffit de procéder comme suit :
cd /usr/src
wget
// connectez-vous à server1.example.com sur le port 22
si ( !($con = ssh2_connect("server1.example.com", 22))){
echo "fail : impossible d'établir la connexionn";
} else {
// essayez de vous authentifier avec le nom d'utilisateur root, le mot de passe secretpassword
if(! ssh2_auth_password ($con, "root", "secretpassword")) {
echo "échec : impossible de s'authentifiern" ;
} else {
// très bien, nous y sommes !
echo "ok : connecté...n" ;
// exécute une commande
if(!($stream = ssh2_exec($con, "ls -al" )) ){
echo "fail : impossible d'exécuter la commanden"
} else{
// collecte les données renvoyées par la commande
stream_set_blocking
( $stream,
true );
$data = "";
while( $buf=
fread($stream,4096) ){
$data .= $
buf
;
Deuxième méthode : Shell
De la même manière, vous pouvez également écrire une fonction ou une classe pour le code suivant. Cependant, cet article ne fournit que les concepts de base :
if (!function_exists("ssh2_connect")) die("function ssh2_connect makes not exist")
// connectez-vous à server1.example.com sur le port 22
if(!($con = ssh2_connect ("server1.example.com", 22))){
echo "fail : impossible d'établir la connexionn";
} else {
// essayez de vous authentifier avec le nom d'utilisateur root, le mot de passe secretpassword
if(!ssh2_auth_password($con, "root", "secretpassword")) {
echo "échec : impossible de s'authentifiern";
} else {
// très bien, nous y sommes !
echo "ok : connecté...n"
; shell
if (!($shell = ssh2_shell($con, 'vt102', null, 80, 40, SSH2_TERM_UNIT_CHARS))){
echo "échec : impossible d'établir le shelln"
} else{
stream_set_blocking( $shell, true ) ;
/ / envoyer une commande
fwrite($shell,"ls -aln")
;
// & collecter les données renvoyées
$data = ""
while( $buf = fread($shell,,4096) ){
$data .= $buf;
}
fclose($shell);
}
}
}
Astuce :
Parfois, le serveur est occupé ou une erreur de connexion se produit et il n'y a aucune donnée dans le tampon, et le script PHP cesse de produire une commande (même si la commande ne se termine pas ! ) pour collecter des données. Pour cela, vous pouvez effectuer les opérations suivantes :
ssh2_exec($con, 'ls -al; echo "__COMMAND_FINISHED__"' );
Maintenant, dans votre boucle qui vérifie constamment le tampon, regardez simplement COMMAND_FINISHED. Parce qu’alors vous savez que vous disposez de toutes les données. Afin d'éviter les boucles infinies (boucles infinies), vous pouvez utiliser un délai d'attente de 10 secondes :
$time_start = time();
$data = ""
while( true ){
$data .= fread($stream, 4096) ;
if( strpos($data,"__COMMAND_FINISHED__") !== false){
echo "ok : commande terminéen";
break;
if
( (time()-$time_start) > 10 ){
echo "fail : timeout de 10 secondes a été atteinten";
break;
}
}
Dans l'exemple ci-dessus, vous feriez mieux de définir stream_set_blocking sur false.
Envoyer des fichiers via SSH
ssh2_scp_send($con, "/tmp/source.dat", "/tmp/dest.dat", 0644);
Si cela ne fonctionne pas correctement,
veuillez vérifier les aspects suivants :
Suivez cet article pour vérifier chaque étape. de votre opération
Côté serveur, "PasswordAuthentication yes" doit être activé dans sshd_config. La valeur par défaut sur la plupart des serveurs est oui, mais dans certains cas, vous devrez peut-être ajouter la ligne suivante au fichier pour activer cette fonctionnalité sur vous-même :
/etc/ssh/sshd_config :
# Remplacez par oui pour activer les mots de passe en texte clair tunnelisés.
PasswordAuthentication yes
Si vous apportez des modifications, vous devez redémarrer SSH :
/etc/init.d/ssh restart