2014-11-12 5 views
1

Я ищу рабочий пример того, как использовать pstream. Я планирую открыть сеанс ssh с удаленного хоста, выполнить команду и получить ее вывод. До сих пор я получил:Pstreams - как писать на stdin и получать выходные данные?

#include <pstreams/pstream.h> 
#include <string> 
#include <iostream> 

int main(){ 
    redi::pstream proc("ssh localhost -t -t", redi::pstreams::pstdout | redi::pstreams::pstdin); 
    std::string line; 
    std::cout.flush(); 
    while (std::getline(proc.out(), line)){ 
     std::cout << "stdout: " << line << '\n'; 
    } 
    return 0; 
} 

Но он не работает должным образом. Вместо того, чтобы:

stdout: [email protected]: 

я получаю это:

[email protected]: 

@Update Несколько минут назад я заметил, что после ввода пароля я получаю правильный вывод. Похоже, что openssh каким-то образом блокирует мою программу от отправки текста в stdout. Вот пример:

#include <pstreams/pstream.h> 
#include <string> 
#include <iostream> 

int main(){ 
    std::cout << "1\n"; 
    redi::pstream proc("ssh localhost -t -t", redi::pstreams::pstdout | redi::pstreams::pstdin); 
    std::cout << "2\n"; 
    std::string line; 
    std::cout << "3\n"; 
    std::cout.flush(); 
    std::cout << "4\n"; 
    while (std::getline(proc.out(), line)){ 
     std::cout << "5\n"; 
     std::cout << " " << "stdout: " << line << '\n'; 
     std::cout << "6\n"; 
    } 
    std::cout << "7\n"; 
    return 0; 
} 

Выход:

1 
2 
3 
4 
[email protected]'s password: 

Здесь я должен ввести пароль, а остальное выглядит следующим образом:

5 
stdout: Last login: Wed Nov 12 14:57:36 2014 from localhost.localdomain 
6 
5 
stdout: 

Моя первая догадка что " archer @ localhost's password: ", выводимый SSH, не сохраняется в буфере объектов pstreams (proc.out()).

+0

'\' n \ '' должно быть '\' \ n \ '' или 'std :: endl'. –

+0

@CaptainObvlious Ну, это одно, но это не решает главной проблемы. –

+0

Попробуйте использовать 'line.c_str()' вместо этого и вызовите 'std :: cout.flush()' после вашего вывода. – Pickle

ответ

1

Хорошо. Мне удалось решить мою проблему. Вот ответ: https://superuser.com/questions/569432/why-can-i-see-password-prompts-through-redirecting-output. Обходной путь заключается в использовании telnet. Вот пример рабочего кода:

#include <pstreams/pstream.h> 
#include <string> 
#include <iostream> 

int main(){ 
    std::string buffer; 
    redi::pstream proc("telnet localhost", redi::pstreams::pstdout | redi::pstreams::pstdin | redi::pstreams::pstderr); 
    while (proc >> buffer){ 
     std::cout << buffer << '\n'; 
     if (buffer.find("gin") != std::string::npos) // login 
      break; 
    } 
    proc << "my_login" << std::endl; 
    while (proc >> buffer){ 
     std::cout << buffer << '\n'; 
     if (buffer.find("sword") != std::string::npos) //password 
      break; 
    } 
    proc << "my_pass" << std::endl; 
    sleep(1); 
    proc << "ls" << std::endl; 
    while (proc >> buffer){ 
     std::cout << buffer << '\n'; 
    } 
    return 0; 
} 
Смежные вопросы