2009-09-22 7 views
0

Je construis un contrôle web qui permettra à notre personnel informatique junior de gérer le firmware de nos téléphones LifeSize. À l'heure actuelle, nous faisons cela en téléchargeant le nouveau firmware sur un serveur central, puis en exécutant cette commande pour chaque téléphone, nous voulons améliorerComment remplacer un outil SSH en ligne de commande par un appel Web PHP?

cat new_firmware.cramfs | ssh -T [email protected] "upgrade all" 

Cela me demande le mot de passe, puis télécharge le firmware. Fonctionne comme un champion, mais il prend quelqu'un à l'aise avec les outils CLI, l'accès SSH à ce serveur, et la patience de rechercher toutes les adresses IP de tous les téléphones. Il semble que nous soyons bloqués par une connexion par mot de passe, le test avec des certificats a été désastreux. L'appareil utilisé n'est pas un ordinateur à part entière, c'est un téléphone qui exécute un minuscule système d'exploitation intégré.

Je travaille sur un script PHP qui peut itérer sur tous les téléphones, mais fondamentalement dupliquer cette fonction. Voilà ce que j'ai jusqu'à présent:

<?php 
$firmware_filename = "new_firmware.cramfs"; 
$firmware_stream = fopen($firmware_filename,"rb"); 

$ssh_connection = ssh2_connect("1.1.1.1", 22); 
ssh2_auth_password($ssh_connection, "cli", "password"); 
$ssh_stream = ssh2_exec($ssh_connection,'upgrade all'); 
$written = stream_copy_to_stream($firmware_stream,$ssh_stream,-1); 

if($written != filesize($full_filename)){ 
echo "The file is " . filesize($firmware_filename) . " bytes, I only wrote $written" . PHP_EOL; 
}else{ 
echo "All Good" . PHP_EOL; 
} 
?> 

Mais revient toujours

The file is 26988590 bytes, I only wrote 8192 

Et la mise à jour ne se déroule pas correctement.

+0

Pourquoi ne pas utiliser Lifesize UVC Manager ou Lifesize Control dans ce but? – biplav

Répondre

1

Eh bien, vous pouvez simplement appeler

system('cat new_firmware.cramfs | ssh -T [email protected] "upgrade all"'); 

puis remplacer en utilisant votre vars:

system('cat ' . $firmware . ' | ssh -T ' . $username . '@' . $host . ' "upgrade all"'); 

est-ce une solution pour vous?

Vous pouvez automatiser l'accès ssh en plaçant le fichier de certificat dans le répertoire .ssh. Lisez à propos de SSH login without password.

concernant

+1

Faites très attention à ce type de stratégie du point de vue de la sécurité. Vous devez utiliser escapeshellcmd()/escapeshellarg() sur toutes les variables que vous concaténéz dans une chaîne qui sera finalement transmise à system(). Sinon, vous risquez de vous exposer à des vulnérabilités d'injection de commandes shell. – Asaph

+0

@Asaph: bien sûr, vous avez absolument raison. Mais je pense que cette question concerne l'automatisation facile d'un travail. En effet, ce ne serait pas quelque chose que j'inclurais dans une solution prête pour la production qui est déployée sur un serveur public. – Atmocreations

0

Il y a plusieurs choses que vous pouvez essayer:

  1. Copiez d'abord le fichier, puis exécutez la commande sur le fichier maintenant local.
  2. En supposant que vous remplissez une mémoire tampon de 8 Ko, essayez d'écrire en boucle jusqu'à ce que vous ayez écrit le fichier entier.
  3. Facilitez la sortie et configurez simplement les clés ssh pour ne pas avoir à entrer un mot de passe, et des commandes shell directement à partir de votre script
Questions connexes