2016-07-26 15 views
3

Ich habe eine Sitzung und einen Kanal erstellt. Eine Anfrage (ssh_channel_request_exec) soll ungefähr jede Sekunde gesendet werden und ich möchte die Antwort (ssh_channel_read) auf diese Anfrage lesen. Ich konnte jedoch kein Beispiel finden, wie man mehrere Anfragen stellen kann, die API enthält nur ein Beispiel, wie man eine Anfrage stellt, liest die Antwort und schließt den Kanal.libssh - Anfrage mehrmals senden und Antwort von Kanal

Wenn ich versuche Anfordern und aus dem Kanal zweimal nacheinander lesen, ssh_channel_request_exec kehrt zum zweiten Mal einen Fehler. Muss für jede Anfrage ein neuer Kanal geöffnet werden?

int ret = ssh_channel_request_exec(m_channel, request.c_str()); 
if (ret != SSH_OK) 
{ 
    ssh_channel_close(m_channel); 
    ssh_channel_free(m_channel); 
    return false; 
} 

std::stringstream sstream; 
nbytes = ssh_channel_read(m_channel, buffer, sizeof(buffer), 0); 
while (nbytes > 0) 
{ 
    sstream.write(buffer, nbytes); 
    nbytes = ssh_channel_read(m_channel, buffer, sizeof(buffer), 0); 
} 

if (nbytes < 0) // 'nbytes' becomes zero the first time, the channel is not closed the second time! 
{ 
    ssh_channel_close(m_channel); 
    ssh_channel_free(m_channel); 
    return false; 
} 

response = sstream.str(); 

Das API enthält auch eine ssh_channel_send_eof Funktion, die von dem Kanal nach dem Lesen in einem Beispiel verwendet wird. Wofür ist es gut? Die API sagt nur "Senden Sie ein Ende der Datei auf dem Kanal. Dies schließt nicht den Kanal. Sie können immer noch lesen, aber nicht schreiben."

Eine Prüfung auf ssh_channel_is_eof (api: „Überprüfen Sie, ob ein Remote-EOF gesendet“) zeigt, dass der Kanal nicht das erste Mal ist, EOF, aber das zweite Mal ist.

Antwort

0

Ja. Non-interactive exec ist für die Ausführung eines einzelnen Befehls vorgesehen und kann daher nur in einem Kanal ausgeführt werden, wie in der official documentation angezeigt wird.