2012-10-04 4 views
1

phpseclib를 사용하여 cisco SF308 스위치에 연결하려고합니다. 일부 HP 스위치에 성공적으로 연결하기 위해이 라이브러리를 사용하고 있지만, 어떤 이유로 든 내 cisco에서는 작동하지 않습니다. 코드는 다음과 같습니다.phpseclib - cisco 스위치에 연결할 수 없습니다.

set_include_path(get_include_path() . PATH_SEPARATOR . '/var/www/phpseclib'); 
include('/var/www/phpseclib/Net/SSH2.php'); 
define('NET_SSH2_LOGGING', NET_SSH2_LOG_COMPLEX); //add near include lines 
$cisco = new Net_SSH2('10.10.10.10'); 

if (!$cisco->login('username', 'password')) { 
    exit('Login Failed'); 
} 

echo $cisco->write('\n'); 

echo $cisco->write('help'); 
echo $cisco->read('/([0-9A-Z\-])*(#)(\s*)/i', NET_SSH2_READ_REGEX); 
echo $cisco->data; 
echo $cisco->getLog(); 
echo $cisco->disconnect(); 

로그인 실패 오류 메시지는 항상 사라집니다.

NET_SSH2 라이브러리 자체에 디버그 문을 추가하고 'NET_SSH2_MSG_USERAUTH_FAILURE'로 정의 된 오류 번호 51로 인해 그 코드가 죽어 가려고했습니다.

HP 스위치와이 cisco간에 다른 점 중 하나는 수동으로 연결할 때 hp가 초기 ssh 명령에서 사용자 이름을 선택하기에 충분히 "똑똑"하다는 것입니다. 명령 프롬프트에서이 작업을 수행하는 경우 예를 들어, :

ssh [email protected] 

를 한 후 Enter 키를 누르십시오, 그것은 사용자 이름으로 "이름"을 선택할 것, 그리고 그것은 단지 암호를 입력하라는 메시지가 표시됩니다. cisco 스위치 (SF302-08 모델)는 사용자 이름과 암호를 입력하라는 메시지를 표시합니다. 두 번째 사용자 이름과 암호를 입력하면 스위치에 연결할 수 있습니다.

이것이 문제의 원인인지 확실하지 않지만 두 스위치간에 분명히 다른 것이 있습니다. 나는이 문서를 변경하는 방법이 있는지/초기 연결 요청에서 사용자 이름을 선택하도록 cisco의 설명서를 찾으려고합니다. 하지만 다른 제안이 있으시면 알려주세요. 나는 모든 귀이다.

감사합니다.

EDIT 1

내가 복잡한 로깅을 설정하고 실패 어디에의 전체 세부 사항을 가지고, 경우에이 도움이됩니다./그래서

Login FailedError message is: 
<- 
-> 
<- NET_SSH2_MSG_KEXINIT (0.0118s) 
-> NET_SSH2_MSG_KEXINIT (0s) 
-> NET_SSH2_MSG_KEXDH_INIT (0s) 
<- NET_SSH2_MSG_KEXDH_REPLY (0.7912s) 
-> NET_SSH2_MSG_NEWKEYS (0s) 
<- NET_SSH2_MSG_NEWKEYS (0s) 
-> NET_SSH2_MSG_SERVICE_REQUEST (0s) 
<- NET_SSH2_MSG_SERVICE_ACCEPT (0.4927s) 
-> NET_SSH2_MSG_USERAUTH_REQUEST (0s) 
<- NET_SSH2_MSG_USERAUTH_FAILURE (0.0059s) 

이 스위치를 접촉되지만 사용자 이름을 인증하는 동안 내 최초 게시물에 언급, 그것은 실패 것 :

set_include_path(get_include_path() . PATH_SEPARATOR . '/var/www/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('username', 'password')) { //if you can't log on... 
    echo('Login Failed'); 
    echo 'Error message is: <br>'; 
    $log = $ssh->getLog(NET_SSH2_LOG_COMPLEX); 
    foreach ($log as $logitem) { 
      echo $logitem.'<br>'; 
    } 

이 다음과 같은 출력이 반환 여기 내 최신 코드입니다 암호.

답변

1

몇 가지 조사를 한 후 여기에 우리의 문제에 대한 해결책이 있습니다. 다른 것들은 다른 방식으로 해결되었을 수도 있지만 이것은 우리에게 효과가있는 것처럼 보입니다.phpseclib 같은

  1. 인기 SSH 라이브러리 때문에 제한된 SSH 구현이 스위치에 실패했다 : 우리가 발견 무엇

    다음이다.

  2. php의 ssh2_auth_none 함수는이 스위치에서 TRUE를 반환합니다.

이것은 무엇을 의미합니까?

ssh 프로토콜에는 "none"이라는 인증 방법이있는 것으로 보입니다. 이는 안전하지 않으며 일반적으로 대부분의 스위치에서 비활성화됩니다. ssh2_auth_none() 함수는 인증없이 연결을 시도하고 실패 할 경우 서버가 승인하는 인증 메소드의 목록을 리턴합니다. SF300의 경우에는 인증 방법에 대해 아무것도 전달하지 않고 반환합니다.

  1. 알려진 CLI 및 SSH 제한

그들이 우리에게 솔루션, 시스코 기술 지원이 명시 적으로 작은 비즈니스 클래스 스위치는 제한된 CLI와 아래로 깎았 버전인지 상태 않았다을 줄 수 없습니다했지만 SSH도 마찬가지입니다. 따라서 여러분은 완전한 수준의 ssh 구현을 갖춘 엔터프라이즈 급 스위치로 취급 할 수 없습니다. 이 프로그램 이러한 유형의 장치에 연결을 시도하는 사람이라면 도움이

<?php 

     $username = 'myusername'; 

     $password = 'mypassword'; 

     $connection = ssh2_connect('123.123.123.123', 22); 

     //$authentication_methods = ssh2_auth_none($connection, 'user'); 

     $stdio_stream = ssh2_shell($connection); 

     fwrite($stdio_stream,$username."\n"); 

     sleep(1); 

     fwrite($stdio_stream,$password."\n"); 

     sleep(1); 

     echo "Results: " . stream_get_contents($stdio_stream); 
     echo 'sending show bonjour command:<br>'; 
    fwrite($stdio_stream, "show bonjour".PHP_EOL); //you can use \n instead of PHP_EOL but PHP_EOL is recommended. 

    sleep(1); 

    echo "<br>Results: " . stream_get_contents($stdio_stream); 

    ?> 

희망 :이 도움이 경우

, 여기에 이러한 유형의 장치에 연결하는 방법을 보여줍니다 코드의 작은 조각이다.

0

난 당신이 사용하는 IP 주소가 올바른지 확인하고 사용자 이름과 암호는 당신이 사용하는 라이브러리에 익숙하지 않은 오전

+0

응답 해 주셔서 감사합니다. 나는 수동으로 할 때 모든 것이 작동한다는 것을 내 포스트에 암시하려고했다. 내 게시물을 더 명확하게 편집 할 것입니다. 하지만 그렇습니다. 올바른 IP 주소와 자격 증명을 가지고 있습니다. – dot

1

를 연결할 수있는 권한이 확인하지만 몇 가지와 스크립트했을 것이다 Perl을 사용하는 시스코 라우터. 이를 위해 필자는 Cisco :: Telnet :: Cisco 모듈을 사용하여 Cisco 장치와 상호 작용하는 특이성을 다루었습니다. Cisco Nexus 장치에 연결했을 때 일반적인 IOS 장치가 아닌이 장치가 고장났습니다. 텔넷 세션이 사용자 입력을 기다리고 있음을 나타내는 문자열을 인식하는 데 사용 된 정규 표현식을 변경하여이 문제를 해결해야했습니다. Wireshark를 사용하여 IOS 기기와 Nexus 기기에서 보낸 정확한 문자열을 볼 수있었습니다. 나는 당신이 비슷한 것을 필요로한다고 생각합니다.

관련 문제