从 ssh 通道读取并写入缓冲区
Posted
技术标签:
【中文标题】从 ssh 通道读取并写入缓冲区【英文标题】:reading from ssh channel and writing to a buffer 【发布时间】:2020-11-11 14:06:32 【问题描述】:我有这个功能,如果你用 ssh 连接到一个系统,你可以调用它来在那个系统上执行你给定的命令。
std::string sshconnection::exec_ssh_command(ssh_session session, char *command)
string receive = "";
int rc, nbytes;
char buffer[256];
ssh_channel channel = ssh_channel_new(session);
if( channel == NULL )
return NULL;
rc = ssh_channel_open_session(channel);
if( rc != SSH_OK )
ssh_channel_free(channel);
return NULL;
rc = ssh_channel_request_exec(channel, command);
if( rc != SSH_OK )
ssh_channel_close(channel);
ssh_channel_free(channel);
cout << "Error";
return NULL;
nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
while (nbytes > 0)
if (write(1, buffer, nbytes) != (unsigned int) nbytes)
ssh_channel_close(channel);
ssh_channel_free(channel);
return NULL;
nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
if( nbytes < 0 )
return NULL;
ssh_channel_send_eof(channel);
ssh_channel_close(channel);
ssh_channel_free(channel);
return receive;
这个功能很好用。我只是不明白即将从buffer
到文件描述符=1 的write
部分。我们没有在任何地方填写receive
,但它是返回值。如果我们像下面这样调用这个函数:
s = exec_ssh_command(my_ssh_session, "cat /proc/stat" );
s
没有任何价值,但如果我们这样做:
std::cout<<s;
这将打印s
值。当然,我们不能将s
保存在文件中。 谁能解释一下这是怎么回事?
编辑:连接到 ssh 的函数:
int sshconnection::sshConnection()
if( my_ssh_session == NULL )
cout << "Error creating ssh session" << endl;
return 1;
ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, "yourip");
ssh_options_set(my_ssh_session, SSH_OPTIONS_USER, "username");
int rc = ssh_connect(my_ssh_session);
if( rc != SSH_OK )
cout << "Error with connecting" << endl;
ssh_free(my_ssh_session);
return -1;
rc = ssh_userauth_password(my_ssh_session, NULL, "yourpassword");
if( rc != SSH_AUTH_SUCCESS)
cout << "Error with authorization " << ssh_get_error(my_ssh_session) << endl;
ssh_disconnect(my_ssh_session);
ssh_free(my_ssh_session);
return -1;
// ssh_disconnect(my_ssh_session);
// ssh_free(my_ssh_session);
【问题讨论】:
1
是默认的 STDOUT
文件描述符。所以所有代码所做的就是将从 ssh 连接接收到的数据发送到标准输出。至于为什么永远不会设置receive
,这是编写代码的人而不是我们的问题。
从函数返回变量“receive”,但没有放入任何内容。所以函数总是返回一个空字符串。写入文件描述符 1 是标准输出,因此它应该将接收到的内容打印到屏幕上,即使它没有返回它。如果您希望它返回而不仅仅是打印,则将结果放入“receive”变量而不是写入。
您需要帮助将接收到的字符添加到“receive”变量吗?
我遵循了这个:***.com/questions/8960087/… 并在从缓冲区读取后添加了接收 = 缓冲区。 @JerryJeremiah
【参考方案1】:
我知道这是旧的,但我遇到了同样的问题。我想出了以下解决方案。
像这样使用std::string::append receive.append(buffer, nbytes)
。
std::string sshconnection::exec_ssh_command(ssh_session session, char *command)
string receive = "";
int rc, nbytes;
char buffer[256];
ssh_channel channel = ssh_channel_new(session);
if( channel == NULL )
return NULL;
rc = ssh_channel_open_session(channel);
if( rc != SSH_OK )
ssh_channel_free(channel);
return NULL;
rc = ssh_channel_request_exec(channel, command);
if( rc != SSH_OK )
ssh_channel_close(channel);
ssh_channel_free(channel);
cout << "Error";
return NULL;
nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
while (nbytes > 0)
receive.append(buffer, nbytes);
nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
if( nbytes < 0 )
return NULL;
ssh_channel_send_eof(channel);
ssh_channel_close(channel);
ssh_channel_free(channel);
return receive;
【讨论】:
以上是关于从 ssh 通道读取并写入缓冲区的主要内容,如果未能解决你的问题,请参考以下文章