c++ - 从 ssh 通道读取并写入缓冲区
问题描述
我有这个功能,如果你用 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;
}
这个功能很好用。我只是不明白即将进入文件描述符= 1 的那write
部分buffer
。我们没有填写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);
}
解决方案
我知道这是旧的,但我有同样的问题。我想出了以下解决方案。
像这样使用std::string::appendreceive.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;
}
推荐阅读
- timer - stm32中的定时器/计数器溢出中断的名称是什么
- javascript - 功能未定义。动态加载js文件后无法调用函数
- c# - 如何将解决方案测试的代码覆盖结果文件输出到解决方案目录而不是测试项目目录
- python - 如何使用cherrypy tree.mount 指定监听服务器实例?
- assembly - 如何从反汇编的二进制文件中读取函数?
- python - TypeError: input() 接受 2 个位置参数,但给出了 3 个
- python - Retrieve table size and item count of multiple dynamo db tables using boto3
- c# - 收到错误“System.Data.SqlClient.SqlException:'')'附近的语法不正确。”
- python - How can I reduce a numpy array into bins with a max value per bin?
- php - Docker不会更新php版本