2016-08-18 17 views
0

私はlibsshを使用して、リモートサーバー上でコマンドを実行しています。 は、ここに私のコードです(リターンコードは簡略化のためにここでチェックされていないが、それらのすべてがOKです):ptyモードでlibsshを使用したstderr

stdout: foo 
stderr: command not found: whoam 

を今、私はへの呼び出しを追加した場合:

#include <stdio.h> 
#include <stdlib.h> 
#include <libssh/libssh.h> 

int main() { 

    /* opening session and channel */ 
    ssh_session session = ssh_new(); 
    ssh_options_set(session, SSH_OPTIONS_HOST, "localhost"); 
    ssh_options_set(session, SSH_OPTIONS_PORT_STR, "22"); 
    ssh_options_set(session, SSH_OPTIONS_USER, "julien"); 
    ssh_connect(session); 
    ssh_userauth_autopubkey(session, NULL); 
    ssh_channel channel = ssh_channel_new(session); 
    ssh_channel_open_session(channel); 

    /* command execution */ 
    ssh_channel_request_exec(channel, "echo 'foo' && whoam"); 

    char *buffer_stdin = calloc(1024, sizeof(char)); 
    ssh_channel_read(channel, buffer_stdin, 1024, 0); 
    printf("stdout: %s\n", buffer_stdin); 
    free(buffer_stdin); 

    char *buffer_stderr = calloc(1024, sizeof(char)); 
    ssh_channel_read(channel, buffer_stderr, 1024, 1); 
    printf("stderr: %s", buffer_stderr); 
    free(buffer_stderr); 

    ssh_channel_free(channel); 
    ssh_free(session); 
    return EXIT_SUCCESS; 
} 

出力がaxpectedようですssh_channel_request_ptyだけssh_channel_open_session後:

0:

... 
    ssh_channel channel = ssh_channel_new(session); 
    ssh_channel_open_session(channel); 
    ssh_channel_request_pty(channel); 
    ssh_channel_request_exec(channel, "echo 'foo' && whoam"); 
    ... 

が、それ以上何も標準エラー出力はありません

stdout: foo 
stderr: 

そして、私はしてコマンドを変更した場合:

ssh_channel_request_exec(channel, "whoam"); 

今すぐエラー出力を標準出力に読まれます!

stdout: command not found: whoam 
stderr: 

ssh_channel_request_ptyで何かが不足していますか?私は理由sudoでコマンドを実行しているとき、私は次のエラーを取得するいくつかのサーバー上でそれを使用していた情報については

、:

sudoを:申し訳ありませんが、あなたはsudoを

を実行するための端末を持っている必要があります

答えて

2

概念的には、ptyは端末(またはさらに低いレベルではシリアルポート)を表します。各方向には1つのチャネルしかありません。 ptyで実行されているプロセスの標準出力と標準エラーは、どちらもデフォルトで同じ場所に移動します。

(例えば、あなたはターミナルでコマンドを実行するときに何が起こるか考えてみましょう - 。あなたが何かをリダイレクトしていない場合、stdoutとstderrの両方が画面に表示され、それらを離れて指示する方法はありません)

一般に、rootとしてリモートでコマンドを実行する必要がある場合は、rootとしてSSHを入力するか、ユーザーにNOPASSWDオプションでsudoアクセスを許可する必要があります。パスワードの入力を自動化しないでください。

+0

あなたの説明をありがとう。残念ながら、私はrootとしてsshすることはできませんし、それらのサーバ上のsudoersの設定を変更することも許されません...私は回避策を見つけなければならないでしょう! – julienc

関連する問題