2012-05-07 8 views
5

ठीक है, इसलिए pecl ssh2 libssh2 के लिए माना जाता है। libssh2 में libssh2_channel_get_exit_status है। क्या इस जानकारी को पाने का कोई तरीका है?PHP ssh2_exec चैनल निकास स्थिति?

मैं जरूरत:
-STDOUT
-STDERR
-EXIT स्थिति

मैं सभी लेकिन बाहर निकलने का दर्जा मिलता है। जब एसएसएच लाया जाता है तो बहुत से लोग phplibsec के आसपास फेंकते हैं, लेकिन मुझे उसमें से stderr या चैनल निकास की स्थिति प्राप्त करने का कोई तरीका नहीं दिखता है:/क्या कोई भी तीनों को प्राप्त करने में सक्षम है?

उत्तर

6

तो, पहली बात सबसे पहले है:
नहीं, उन्होंने libssh2_channel_get_exit_status को लागू नहीं किया है। क्यूं कर? मेरे पार।

$command .= ';echo -e "\n$?"' 

मैं एक नई पंक्ति और $ की गूंज रटना:

यहाँ आईडी किया है? मैं आदेश के हर आदेश के अंत में। आवारा? हाँ। लेकिन ऐसा लगता है कि यह अच्छी तरह से काम किया है। मैं फिर इसे $ वापसी में खींचता हूं और स्टडआउट के अंत से सभी न्यूलाइन को पट्टी करता हूं। हो सकता है कि किसी दिन चैनल की निकास स्थिति प्राप्त हो रही हो, और कुछ साल बाद यह डिस्ट्रो रिपोज़ में होगा। अभी के लिए, यह काफी अच्छा रहा है। जब जटिल रिमोट संसाधनों को पॉप्युलेट करने के लिए आपके 30+ रिमोट कमांड चलते हैं, तो यह प्रत्येक कमांड के लिए एसएसएच सत्र को सेट करने और फाड़ने से कहीं ज्यादा बेहतर होता है।

+1

यदि आदेश 'निकास 1' है, तो गूंज नहीं चलती है। '$ कमांड = '(' $ कमांड। '); echo -e" \ n $? "' 'बेहतर हो सकता है। – Jesse

5

मैंने रैपिज़िड के उत्तर पर थोड़ा और सुधार करने की कोशिश की। मेरे इरादे के लिए मैंने एक php ऑब्जेक्ट में ssh2 लपेट लिया और इन दो कार्यों को लागू किया। यह मुझे सैने अपवाद पकड़ने का उपयोग कर एसएसएच त्रुटियों को संभालने की अनुमति देता है।

function exec($command) 
{ 
    $result = $this->rawExec($command.';echo -en "\n$?"'); 
    if(! preg_match("/^(.*)\n(0|-?[1-9][0-9]*)$/s", $result[0], $matches)) { 
     throw new RuntimeException("output didn't contain return status"); 
    } 
    if($matches[2] !== "0") { 
     throw new RuntimeException($result[1], (int)$matches[2]); 
    } 
    return $matches[1]; 
} 

function rawExec($command) 
{ 
    $stream = ssh2_exec($this->_ssh2, $command); 
    $error_stream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR); 
    stream_set_blocking($stream, TRUE); 
    stream_set_blocking($error_stream, TRUE); 
    $output = stream_get_contents($stream); 
    $error_output = stream_get_contents($error_stream); 
    fclose($stream); 
    fclose($error_stream); 
    return array($output, $error_output); 
} 
संबंधित मुद्दे