浅聊一下libssh和libssh2

浅聊一下libssh和libssh2

在 Linux 上,SSH 是一种非常常用的远程登录协议。做了一个小型xftp项目,所以来聊聊libssh和libssh2两个客户端库。

文章目录

  • 浅聊一下libssh和libssh2
    • libssh
    • libssh2
    • 总结

libssh

libssh 是一个轻量级的 SSH 客户端库,可用于在 C++ 程序中实现 SSH 客户端功能。可以用来执行远程命令、传输文件以及在通道上进行加密通信等。

举一下我用到的函数接口:

#include //头文件

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 

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 库。

你可能感兴趣的:(浅聊一下,ssh,c++,linux)