2012-08-24 6 views
0

phpseclib의 NET_SSH2 라이브러리를 사용하여 HP 스위치에 연결하려고합니다. 테스트를 시작하기 만하면 로그온을 시도하고 스위치에서 show interfaces brief 명령을 실행합니다. 그러나 그것은 나를 로그온 후, 나는 오류 메시지가 얻을 :phpseclib - HP procurve 스위치에 연결하려고하면 오류가 반환됩니다. SSH 명령 실행이 지원되지 않습니다.

<?php 
set_include_path(get_include_path() . PATH_SEPARATOR . '../phpseclib'); 
include('Net/SSH2.php'); 
define('NET_SSH2_LOGGING', true); //turn on logging. 

$ssh = new Net_SSH2('10.10.10.10'); //starting the ssh connection to localhost 
if (!$ssh->login('', 'password')) { //if you can't log on... 
    exit('Login Failed'); 
} 
else { 
echo 'logged in<br>'; 
} 
echo 'Attempting command: <br>'; 
$output = $ssh->exec('show interfaces brief');  
echo $output.'<br>'; 
echo 'Error message is: <br>'; 
$log = $ssh->getLog(NET_SSH2_LOG_COMPLEX); 
foreach ($log as $logitem) { 
echo $logitem.'<br>'; 
} 
?> 

이 반환하는 출력은 다음과 같습니다 : SSH2의

logged in 
Attempting command: 

Notice: Connection closed prematurely in /var/www/phpseclib/Net/SSH2.php on line 1941 
SSH command execution is not supported. 
Error message is: 
<- 
-> 
<- NET_SSH2_MSG_KEXINIT (0.0015s) 
-> NET_SSH2_MSG_KEXINIT (0s) 
-> NET_SSH2_MSG_KEXDH_INIT (0s) 
<- NET_SSH2_MSG_KEXDH_REPLY (0.5123s) 
-> NET_SSH2_MSG_NEWKEYS (0s) 
<- NET_SSH2_MSG_NEWKEYS (0s) 
-> NET_SSH2_MSG_SERVICE_REQUEST (0s) 
<- NET_SSH2_MSG_SERVICE_ACCEPT (0.1962s) 
-> NET_SSH2_MSG_USERAUTH_REQUEST (0.0001s) 
<- NET_SSH2_MSG_USERAUTH_BANNER (0.0014s) 
<- NET_SSH2_MSG_USERAUTH_SUCCESS (0.0392s) 
-> NET_SSH2_MSG_CHANNEL_OPEN (0s) 
<- NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION (0.0204s) 
-> NET_SSH2_MSG_CHANNEL_REQUEST (0s) 
<- NET_SSH2_MSG_CHANNEL_SUCCESS (0.1011s) 
<- NET_SSH2_MSG_CHANNEL_DATA (0s) 
-> NET_SSH2_MSG_CHANNEL_DATA (0s) 
<- NET_SSH2_MSG_CHANNEL_EOF (0s) 
<- NET_SSH2_MSG_CHANNEL_REQUEST (0s) 
<- NET_SSH2_MSG_CHANNEL_CLOSE (0s) 

Notice: Connection closed prematurely in /var/www/phpseclib/Net/SSH2.php on line 1941 

라인 1941 여기

SSH command execution is not supported. 

코드입니다 .php는 아래 보이는 "user_error"라인입니다.

function _send_binary_packet($data) 
{ 
    if (feof($this->fsock)) { 
     user_error('Connection closed prematurely', E_USER_NOTICE); 
     return false; 
    } 
내가 지금까지했던 어떤

:

  1. 내가 ssh를 통해 수동으로 로그인하고 내가 같은 명령을 실행할 수 있는지 확인했습니다.
  2. 나는 스위치의 웹 설정 페이지를 통해 ssh를 켜기 위해 필요한 사항이 없는지 확인했다.
  3. 나는 비슷한 문제가 있는지 phpseclib의 포럼을 점검 해왔다.

phpseclib의 버전 1.53 2010/10/24 01:24:30을 사용하고 있습니다.

도움을 주시면 감사하겠습니다. 감사.

답변

2

HP Procurve 스위치에서 exec 명령을 사용할 수 없습니다. 대화식 쉘을 에뮬레이트해야합니다 (불행히도).

기본적으로 배치 콘솔을 사용하여 한 번에 두 개 이상의 스위치를 구성하기 위해 만든 것입니다. 나는 switches.txt라는 파일에 IP 주소 목록을 넣었으며, 각 주소를 새 줄로 구분했습니다. 파일 끝 부분에 새 줄을 두십시오. 그것은 매우 혼란스럽고 한 번만 사용했고 많은 생각을하지는 않았지만 수백 개가 넘는 스위치에 수동으로 로그인하는 대신 많은 시간을 절약 할 수있었습니다. Procurve Manager를 얻을 때까지 기다릴 수 없습니다 ...

또한 제대로 구현하고 STDOUT을 읽는 데 시간이 걸리지 않으므로 스위치에 제공된 출력을 볼 수 없지만 확실합니다. 그렇게 어렵지는 않을 것이다.

<?php 

require ('Net/SSH2.php'); 
$cnt = 0; 
$ssh = array(); 
$ips = array(); 
echo "\n"; 

$handle = fopen('switches.txt', 'r'); 
while (!feof($handle)) { 
    $ip = trim(fgets($handle)); 
    $ips[$cnt] = $ip; 

    //SSH Setup 

    $ssh[$cnt] = new Net_SSH2($ip); 
    echo "Logging into device: ".$ip."\n"; 
    if (!$ssh[$cnt]->login('USERNAMEHERE', 'PASSWORDHERE')) { 
     exit ('Login Failed'); 
    } 
    $cnt++; 

} 
fclose($handle); 

//Initial Post Login Setup 
sleep(1); 
for ($i=0; $i<sizeof($ssh); $i++) { 
echo "Performing Post Login Setup (1/2) on device: ".$ips[$i]."\n"; 
$ssh[$i]->write("\n"); 
} 
sleep(1); 
for ($i=0; $i<sizeof($ssh); $i++) { 
echo "Performing Post Login Setup (2/2) on device: ".$ips[$i]."\n"; 
$ssh[$i]->write("conf\n"); 
} 
sleep(1); 


//Command Loop 
while (true) { 
    //Device Loop 
    echo "\nBatch Input# "; 
    $in = fopen('php://stdin', 'r'); 
    $buffer = fgets($in); 
    for ($i=0; $i<sizeof($ssh); $i++) { 
     $ssh[$i]->write($buffer); 
     //echo "Wrinting command: $buffer ; To Device: ".$ips[$i].";\n"; 
    } 
} 
fclose($handle); 
?>