2016-08-18 3 views
0

Ich verwende libssh, um Befehle auf einem Remote-Server auszuführen. Hier ist mein Code (Rückgabecodes werden hier nicht zur Vereinfachung geprüft, aber alle von ihnen sind OK):stderr mit libssh im pty-Modus

stdout: foo 
stderr: command not found: whoam 

Nun, wenn ich einen Anruf hinzuzufügen:

#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; 
} 

Der Ausgang als axpected ist ssh_channel_request_pty kurz nach ssh_channel_open_session:

... 
    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"); 
    ... 

Es gibt keine stderr Ausgabe mehr:

stdout: foo 
stderr: 

Und wenn ich den Befehl ändern:

ssh_channel_request_exec(channel, "whoam"); 

Nun wird der Fehlerausgang wird auf stdout lesen!

stdout: command not found: whoam 
stderr: 

Ich vermisse etwas mit ssh_channel_request_pty?

Informationen verwende ich es, weil auf einigen Servern ich folgende Fehlermeldung erhalten, wenn Sie einen Befehl mit sudo ausgeführt wird:

sudo: sorry, müssen Sie einen tty sudo zu laufen haben

Antwort

2

Konzeptionell stellt ein Pty ein Terminal dar (oder auf einer noch niedrigeren Ebene eine serielle Schnittstelle) - es gibt nur einen Kanal in jeder Richtung. Die Standardausgabe und der Standardfehler eines Prozesses, der in einem Pty ausgeführt wird, werden beide standardmäßig an dieselbe Stelle gesetzt.

(überlegen Sie, was passiert, wenn Sie einen Befehl in einem Terminal ausgeführt werden, zum Beispiel -. Wenn Sie nichts umgeleitet haben, sowohl stdout und stderr auf dem Bildschirm angezeigt werden, und es gibt keine Möglichkeit, sie auseinander zu halten)

Wenn Sie die Ausführung von Befehlen remote als root automatisieren müssen, sollten Sie entweder SSH als root verwenden oder dem Benutzer sudo den Zugriff mit der Option NOPASSWD gewähren. Automatisieren Sie nicht die Eingabe des Passworts.

+0

Danke für Ihre Erklärung. Leider ist es mir nicht erlaubt, ssh als root zu benutzen oder die sudoers-Konfiguration auf diesen Servern zu ändern ... Ich denke, dann muss ich einen Workaround finden! – julienc