帮我写一段c语言在Linux下基于libssh的sftp登录和下载文件代码
时间: 2024-02-09 10:09:42 浏览: 32
好的,以下是基于 `libssh` 库的 SFTP 登录和下载文件的 C 语言代码示例。请确保已经安装了 `libssh` 库,并且已经链接了 `-lssh` 库。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libssh/libssh.h>
#include <libssh/sftp.h>
// 定义宏
#define SFTP_DIR_MODE 0755
#define SFTP_FILE_MODE 0644
// 定义 SFTP 连接信息结构体
typedef struct {
ssh_session session; // SSH 会话
sftp_session sftp; // SFTP 会话
char *host; // 主机名
int port; // 端口号
char *username; // 用户名
char *password; // 登录密码
} SFTP_INFO;
// 初始化 SFTP 会话
int sftp_init(SFTP_INFO *info) {
// 连接 SSH 服务器
info->session = ssh_new();
if (info->session == NULL) {
fprintf(stderr, "Error: Failed to create SSH session.\n");
return -1;
}
ssh_options_set(info->session, SSH_OPTIONS_HOST, info->host);
ssh_options_set(info->session, SSH_OPTIONS_PORT, &info->port);
if (ssh_connect(info->session) != SSH_OK) {
fprintf(stderr, "Error: Failed to connect to SSH server.\n");
ssh_free(info->session);
return -1;
}
// 登录 SSH 服务器
if (ssh_userauth_password(info->session, info->username, info->password) != SSH_AUTH_SUCCESS) {
fprintf(stderr, "Error: Failed to authenticate with SSH server.\n");
ssh_disconnect(info->session);
ssh_free(info->session);
return -1;
}
// 打开 SFTP 会话
info->sftp = sftp_new(info->session);
if (info->sftp == NULL) {
fprintf(stderr, "Error: Failed to create SFTP session.\n");
ssh_disconnect(info->session);
ssh_free(info->session);
return -1;
}
if (sftp_init(info->sftp) != SSH_OK) {
fprintf(stderr, "Error: Failed to initialize SFTP session.\n");
sftp_free(info->sftp);
ssh_disconnect(info->session);
ssh_free(info->session);
return -1;
}
return 0;
}
// 关闭 SFTP 会话
void sftp_exit(SFTP_INFO *info) {
sftp_free(info->sftp);
ssh_disconnect(info->session);
ssh_free(info->session);
}
// 下载文件
int sftp_download_file(SFTP_INFO *info, const char *remote_path, const char *local_path) {
sftp_file file;
int access_type = O_RDONLY;
int mode = SFTP_FILE_MODE;
int nread;
char buffer[4096];
// 打开远程文件
file = sftp_open(info->sftp, remote_path, access_type, mode);
if (file == NULL) {
fprintf(stderr, "Error: Failed to open remote file '%s'.\n", remote_path);
return -1;
}
// 创建本地文件
FILE *fp = fopen(local_path, "wb");
if (fp == NULL) {
fprintf(stderr, "Error: Failed to create local file '%s'.\n", local_path);
sftp_close(file);
return -1;
}
// 读取远程文件内容并写入本地文件
while ((nread = sftp_read(file, buffer, sizeof(buffer))) > 0) {
fwrite(buffer, 1, nread, fp);
}
// 关闭文件
fclose(fp);
sftp_close(file);
return 0;
}
// 主函数
int main() {
SFTP_INFO info;
memset(&info, 0, sizeof(info));
info.host = "192.168.1.100"; // 主机名
info.port = 22; // 端口号
info.username = "username"; // 用户名
info.password = "password"; // 登录密码
if (sftp_init(&info) != 0) {
fprintf(stderr, "Error: Failed to initialize SFTP session.\n");
return -1;
}
if (sftp_download_file(&info, "/home/remote/file.txt", "/home/local/file.txt") != 0) {
fprintf(stderr, "Error: Failed to download file.\n");
}
sftp_exit(&info);
return 0;
}
```
在上面的代码中,我们定义了 `SFTP_INFO` 结构体来存储 SFTP 连接信息,包括 SSH 会话、SFTP 会话、主机名、端口号、用户名和密码。然后我们定义了 `sftp_init` 函数来连接 SSH 服务器、登录 SSH 服务器并打开 SFTP 会话。接着我们定义了 `sftp_download_file` 函数来下载文件。该函数首先打开远程文件,然后创建本地文件,并读取远程文件内容并写入本地文件。最后我们在主函数中调用 `sftp_init` 和 `sftp_download_file` 函数,并在下载完成后调用 `sftp_exit` 函数关闭 SFTP 会话。
需要注意的是,在实际使用中,我们需要根据实际情况修改代码中的主机名、端口号、用户名和密码,以及远程文件和本地文件的路径。另外,在下载文件时,我们可以根据需要设置文件的访问模式和缓冲区大小。