2014-06-23 5 views
0

phpseclib 0.3.6을 사용하여 Windows Server 2003 Standard 32 비트에서 PHP vc9 NTS 5.3.28을 실행 중입니다. Palo Alto Networks 방화벽에 연결하고 암호 해시 명령을 실행하는 스크립트를 작성하려고합니다. 내가 다음 코드는 결코 다음 $하고 ssh> 읽기 존재하지 않는에서는 setTimeout (10)를 생략하는 경우PHP에서 SSH2 결과 구문 분석

  1. :

    <?php 
    include 'Net/SSH2.php'; 
    
    define('NET_SSH2_LOGGING', NET_SSH2_LOG_COMPLEX); 
    
    $ssh = new Net_SSH2('hostname'); 
    echo ">Logging in...\n"; 
    if (!$ssh->login('user', 'password')) { 
        exit('Login Failed'); 
    } 
    echo ">Reading login results...\n"; 
    /*echo $ssh->exec('request password-hash password test123');*/ 
    $output = $ssh->read('[email protected]>'); 
    echo $output . "\n"; 
    echo ">Writing request...\n"; 
    $ssh->write("request password-hash password test123\n"); 
    $ssh->setTimeout(10); 
    echo ">Reading result...\n"; 
    $output = $ssh->read('/^\$1\$.*$/', NET_SSH2_READ_REGEX); 
    echo $output . "\n"; 
    echo ">Done.\n"; 
    file_put_contents ('E:\PHP53\ssh2.log', $ssh->getLog()); 
    ?> 
    

    나는 위의 코드에 두 가지 문제가 있습니다 : 나는 다음과 같은 코드가 있습니다. 내가 가지고있는 경우, 코드는 타임 아웃 후에 만 ​​존재하지만 결과를 반환합니다. 그것은 반환이 안 잔뜩 포함되어

  2. 결과 :?????

    [Kuser @ PA-3020> 요청 암호 해시 암호 test123 [1 시간 = 24; 1H [K는 $ 1 $ dgkhwrxe $ kddYFmKCq9.zfiBKPAyN61는

    는 [24;?????? 1H는 [K는 [1리터는> 사용자 @의 PA-3020>

가 난 단지 라인을 원하는 그 시작 $ 1 $ (위 3 번 줄). 나는 그것이 정규식과 관련이 있다고 생각하지만, 나는 무엇을 알아낼 수 없다. 아래 neubert의 제안으로 당

읽어 $ 출력 = $하고 ssh>로 라인을 교체 :

[email protected]> request password-hash password test123 

$1$pxqhdlco$MRsVusWtItC3QiMm4W.xZ1 

[email protected]> 

업데이트 : 퍼티와 대화식으로 명령을 실행하면

나는 다음과 같은 얻을. ... 다음 코드로 작동합니다

$output = $ssh->read('/\$1\$.*/', NET_SSH2_READ_REGEX); 
$output = preg_replace('/.*\$1\$/s','\$1\$', $output); 

답변

1

결과가 반환 잔뜩 포함되는 012,351 안 거기???????

[Kuser @ PA-3020> 요청 암호 해시 암호 test123 [1H = 24, 1H [K $ 1 $ dgkhwrxe $ kddYFmKCq9.zfiBKPAyN61

[ 24; 1H; [K? [? 1] user @ PA-3020>

이들은 ANSI 이스케이프 코드이다. File_ANSI를 사용하여 제거 할 수 있습니다. 더 많은 정보는 :

http://phpseclib.sourceforge.net/ssh/examples.html#top

어쨌든, 내 생각 엔 당신이 당신의 정규식을 다시 할 필요가있을 것이다. 예.

그 대신이 할 일을
$output = $ssh->read('/^\$1\$.*$/', NET_SSH2_READ_REGEX); 

:

$output = $ssh->read('/\$1\$/', NET_SSH2_READ_REGEX); 

건은 ...^라인의 시작과 일치하고, $는 마지막에 일치합니다. 일반적으로 $ ssh-> write (...)를 실행하면 명령이 에코 백되고 새로운 라인이 생기면 출력을 되 찾을 수 있습니다. 그럼 그 일을 막을 수있을거야. 끝 부분에있는 $와 마찬가지로, 자신의 예제에 따라 $ 1 $은 줄 끝 부분에 나타나지 않습니다. 그래서 코드가 작동하지 않습니다.

+0

File_ANSI 모듈이 필요하지 않다고 생각하여 실제로 이스케이프 시퀀스를 처리 할 필요가 없습니다. ← [Kchris @ PA-3020> 요청 암호 해시 암호 test123 ← [? 1h ← = ← [24; 1H ← [K $ 1 $ – Caynadian

+0

당신이 제공 한 정규 표현식을 사용하면 다음과 같은 메시지가 나타납니다. 네가 원했던 $ 1 달러를 받고있다. 또는 $ 1 $이 (가) 온 라인 전체를 원하십니까? 그렇다면'\ $ 1 \ $. * $'이 (가) 작동 할 수도 있습니다. 당신의 코드를 다시 보면 나는 두 개의 $ 사이에 있다고 생각합니다. 그래서 줄 끝의 $가 작동하지 않는다고 말하면서 misspoke를했을 것입니다. – neubert

+0

나는 그 전체 라인과 아무것도 필요로하지 않습니다. $ 1 $. 위의 예에서 "$ 1 $ dgkhwrxe $ kddYFmKCq9.zfiBKPAyN61"문자열을 얻으려고합니다. – Caynadian