2009-09-22 47 views
0

我正在構建一個Web控件,讓我們的初級IT人員能夠管理我們的LifeSize手機上的固件。目前,我們通過上載新固件到一箇中央服務器,然後我們要升級如何用PHP Web電話替換命令行SSH工具?

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

這問我要密碼每部手機上運行這個命令做到這一點,然後上傳固件。像冠軍一樣工作,但需要一些人熟悉CLI工具,通過SSH訪問該服務器,以及耐心地查找所有電話的所有IP。

它看起來像我們堅持使用密碼登錄,使用證書測試已經災難性的。這個設備並不是一臺功能完備的計算機,它是一臺運行微型私有嵌入式操作系統的電話。

我工作的一個PHP腳本,可以遍歷所有的手機,但基本上覆制該功能。這是我到目前爲止有:

<?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; 
} 
?> 

但這總是返回

The file is 26988590 bytes, I only wrote 8192 

,並在升級不正確地進行。

+0

命令爲什麼不將LifeSize UVC Manager或LifeSize Control會的目的是什麼? – biplav 2014-04-15 09:53:31

回答

1

那麼你可以簡單地調用

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

,然後替換使用您的增值經銷商:

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

這是你的解決方案?

您可以通過將證書文件到的.ssh目錄自動化SSH訪問。閱讀關於SSH login without password

問候

+1

從安全的角度來看,要非常小心這種策略。您必須對所有要連接成最終將傳遞給system()的字符串的變量使用escapeshellcmd()/ escapeshellarg()。否則,你可能會打開自己的shell命令注入漏洞。 – Asaph 2009-09-22 22:49:33

+0

@Asaph:當然,你是絕對正確的。但我認爲這個問題是關於工作的簡單自動化。事實上,這不會包含在部署在公共服務器上的生產就緒解決方案中。 – Atmocreations 2009-09-23 11:16:25

0

有幾件事情,你可以嘗試:

  1. 將文件複製第一,然後在現在本地文件運行 命令。
  2. 假設您填寫的8K緩衝,儘量在一個循環寫,直到你成功寫入整個文件
  3. 採取討巧,和剛剛成立的SSH密鑰,這樣你就不需要輸入密碼,和exec外殼,直接從您的腳本