2012-06-17 2 views
1

phpseclib (apt-get 사용)을 사용하여 응용 프로그램을 설치하려고 시도 할 때받을 수있는 다양한 출력 결과를 처리하려고합니다 ... 그러나 작동 시키십시오. 저는 현재 다음과 같습니다

$first = $ssh->read('[email protected]:~#'); 
$ssh->write("sudo apt-get install emacs\n"); 
echo "<br />"; 
echo "sudo apt-get install emacs"; 
echo str_repeat(' ',1024*64); 
if ($unexpected_output = $ssh->read('[email protected]:~#')){ 
    echo "<pre>$unexpected_output</pre>"; 
    echo str_repeat(' ',1024*64); 
} elseif ($continue = $ssh->read('Do you want to continue [Y/n]?')){ 
    echo "<pre>$continue</pre>"; 
    echo str_repeat(' ',1024*64); 
    $ssh->write("Y\n"); 
    $continue_end = $ssh->read('[email protected]:~#'); 
    echo "<pre>$continue_end</pre>"; 
    echo str_repeat(' ',1024*64); 
} 

이 루프는 함께 작동하는 경우 첫 번째 ... 예상치 못한 출력 (당신은 질문을받지 않고 다시 쉘에 이동이있는 경우 즉 "당신은 계속 하시겠습니까"만일 " ", 이는 이미 설치 등을 의미합니다)이 스크립트는 정상적으로 작동합니다.

그러나 응용 프로그램이 설치되어 있지 않으면 절대로 elseif 루프로 이동하지 않습니다. 그 이유는 PHP가 타임 아웃 할 때까지 첫 번째 SSH-> 읽기가 계속 될 것이기 때문입니다. 그 결과를 기다리는 중 ... 두 옵션을 동시에보고 올바른 것을 선택하도록 어떻게 써야합니까?

나는 이것에 대한 CASE를 사용하는 방법에 대한 생각,하지만를 작성하는 방법을 모르겠습니다 ...

또한

가이 사용 phpseclib을 할 수있는 더 좋은 방법이 될 수도 ...하지만 그렇게하는 방법을 잘하고있다 .

감사합니다.

답변

1

대신 apt-get을 apt-get install -y emacs으로 변경하는 방법을 바꾸지 않으시겠습니까? 또한 -q를 사용하여 진행 상황을 인쇄하지 않을 수도 있습니다.

apt-get(8)

를 참조 솔루션의 문제는 지정된 패턴이 발견 될 때까지 기다려야 읽기 $하고 ssh>이다.

+0

오, 그래, 나는 그 옵션에 대해 몰랐다는 것을 인정해야한다. 나는 이것을 사용할 것이다. CASE 문을 사용하는 방법이 있었으면 좋겠다. 그래서 "emacs는 이미 최신 버전이다. "또는"패키지를 찾을 수 없습니다 ", 등 사용자가 정확한 오류 메시지를 얻을 수 있지만 내 즉각적인 문제를 해결, 덕분에. – deranjer

+1

내 방법을 사용하면 $ ssh-> exec와 grep을 사용하여 최신 버전으로 출력 할 수 있습니다. – jpiasetz

+0

오 대단합니다! 그게 도움이되었다, 그냥 stristr $ ssh -> 간부 인 출력을 검색하는 데 사용하고있어 ... 잘 작동합니다, 고마워요. – deranjer

0

또한 $ ssh-> setTimeout (10) 또는 그 밖의 모든 작업을 수행 한 다음 연결 시간 초과시 $ ssh-> getLog()를 사용하여 실제로 전송 된 것을 확인할 수 있습니다.

관련 문제