2016-08-18 4 views
0

Я использую команду libssh для выполнения команд на удаленном сервере. Вот мой код (коды возврата не проверяются здесь для упрощения, но все они в порядке):stderr с libssh в режиме pty

#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:

stdout: foo 
stderr: command not found: whoam 

Теперь, если я добавить вызов ssh_channel_request_pty только после того, как 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"); 
    ... 

Там нет выхода STDERR больше:

stdout: foo 
stderr: 

И если я сменю команду на:

ssh_channel_request_exec(channel, "whoam"); 

Теперь вывод ошибок чтения на стандартный вывод!

stdout: command not found: whoam 
stderr: 

У меня пропало что-то с ssh_channel_request_pty?

Для получения дополнительной информации, я использую его, потому что на некоторых серверах, которые я получаю следующее сообщение об ошибке при выполнении команды с sudo:

Sudo: извините, вы должны TTY для запуска SUDO

ответ

2

Понятно, что pty представляет собой терминал (или на еще более низком уровне - последовательный порт) - в каждом направлении есть только один канал. Стандартный вывод и стандартная ошибка процесса, выполняющегося в pty, по умолчанию идут в одно и то же место.

(Рассмотрим, что происходит, когда вы запускаете команду в терминале, например -. Если вы ничего не перенаправляются, как стандартный вывод и стандартный поток ошибок будут появляться на экране, и нет никакого способа, чтобы отличить их)

Вообще говоря, если вам необходимо автоматизировать выполнение команд удаленно с правами администратора, вы должны либо SSH в качестве пользователя root, либо предоставить доступ пользователю sudo с помощью опции NOPASSWD. Не следует автоматизировать ввод пароля.

+0

Спасибо за ваше объяснение. К сожалению, мне не разрешено использовать ssh как root или изменять конфигурацию sudoers на этих серверах ... Наверное, мне придется найти обходной путь! – julienc