浅聊一下libssh和libssh2
在 Linux 上,SSH 是一种非常常用的远程登录协议。做了一个小型xftp项目,所以来聊聊libssh和libssh2两个客户端库。
libssh
libssh 是一个轻量级的 SSH 客户端库,可用于在 C++ 程序中实现 SSH 客户端功能。可以用来执行远程命令、传输文件以及在通道上进行加密通信等。
举一下我用到的函数接口:
#include <libssh/libssh.h>//头文件
session = ssh_new();//创建一个新的 SSH 会话
//return NULL on error 否则返回ssh_session类型
ssh_options_set(session,SSH_OPTIONS_HOST,ip);//设置远程主机IP,端口,用户名
ssh_options_set(session,SSH_OPTIONS_PORT,&port);
ssh_options_set(session,SSH_OPTIONS_USER,username);
ssh_connect(session);//函数连接到远程主机。
//有效将返回SSH_OK,否则SSH_ERROR
ssh_userauth_password(session, NULL, "password");//进行密码认证,并检查认证是否成功
//返回值
//SSH_AUTH_ERROR: A serious error happened.
//SSH_AUTH_DENIED: Authentication failed: use another method
//SSH_AUTH_PARTIAL: You've been partially authenticated, you still have to use another method
//SSH_AUTH_SUCCESS: Authentication success
//SSH_AUTH_AGAIN: In nonblocking mode, you've got to call this again later.
//连接成功做一些远程,命令事情
ssh_channel_new(session);//创建一个新的 SSH 通道
// return NULL on error,否则返回ssh_channel类型
ssh_channel_open_session(channel);//打开通道
//返回值SSH_OK on success, SSH_ERROR if an error occurred
ssh_channel_request_exec(channel, "xxx");//在远程服务器上执行命令
//返回值SSH_OK on success, SSH_ERROR if an error occurred
//文本传输
使用sftp接口
参考接口:libssh: Chapter 1: A typical SSH session
libssh2
libssh2 是另一个常用的 SSH 客户端库,它提供了更高级的功能,例如多进程/线程支持、SFTP 文件传输等。
//头文件
#include <libssh2.h>
ret = libssh2_init(0);//初始化 libssh2 库
if (ret != 0)
exit(-1);
//创建一个 TCP/IP 套接字
sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(22);
sin.sin_addr.s_addr = inet_addr("remote_host");
//连接
ret = connect(sock, (struct sockaddr*)&sin, sizeof(sin));
if (ret != 0)
exit(-1);
//创建一个新的 SSH 会话
session = libssh2_session_init();
if (session == NULL)
exit(-1);
libssh2_session_set_blocking(session, 1);
ret = libssh2_session_handshake(session, sock);//与远程主机建立安全连接
if (ret != 0)
exit(-1);
ret = libssh2_userauth_password(session, "name", "password");//进行密码认证
if (ret != 0)
exit(-1);
//初始化 SFTP 会话
LIBSSH2_SFTP* sftp_session;
sftp_session = libssh2_sftp_init(session);
if (sftp_session == NULL)
exit(-1);
//打开远程文件以进行写入操作
LIBSSH2_SFTP_HANDLE* sftp_handle;
char buf[1024];
sprintf(buf, "xxx");
sftp_handle = libssh2_sftp_open(sftp_session, buf,
LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_TRUNC,
LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR|
LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH);
if (sftp_handle == NULL)
exit(-1);
//写
libssh2_sftp_write();
接口参考:libssh2 docs
总结
1.关闭 SFTP 会话和 SSH 会话,并释放相应的资源。
2.只需要基本的远程命令执行和文件传输功能,使用 libssh 库。
3.需要更高级的功能,例如多进程/线程支持和 SFTP 文件传输等,使用 libssh2 库。