c - libssh/scp - 复制远程目录的内容,除了一些指定的子文件夹
问题描述
我正在编写一个 C 程序来使用 libssh 和 scp 从远程计算机复制目录。该目录包含大量子文件夹,我想排除其中的几个(少于 10 个)。
我尝试遍历我需要的子文件夹(我使用 SFTP 子系统获取目录内容)并使用单独的 SCP 会话复制它们中的每一个。但是由于有超过 20,000 个子文件夹,如果我可以在一个会话中复制所有内容,可能会更有效率。
SSH_SCP_REQUEST_NEWDIR
我想知道是否有办法以递归模式打开 SCP 会话并在请求该目录后跳过读取某个目录。
这是我读取目录的功能。
int scp_read_folder(ssh_session session,char* location){
/*Open scp session*/
ssh_scp scp=ssh_scp_new(session, SSH_SCP_READ|SSH_SCP_RECURSIVE,location);
if (scp == NULL){
printf("Error allocationg SCP session: %s\n",ssh_get_error(session));
return SSH_ERROR;
}
int rc= ssh_scp_init(scp);
if (rc!=SSH_OK){
printf("Error initializing SCP session: %s\n",ssh_get_error(session));
ssh_scp_free(scp);
return rc;
}
/*Read folder*/
int mode;
const int buffer_size = 1024;
char* filename;
char buffer[buffer_size];
int fd;
int bytes_read;
while ((rc = ssh_scp_pull_request(scp))!= SSH_SCP_REQUEST_EOF){
if (rc == SSH_SCP_REQUEST_NEWFILE){
filename=strdup(ssh_scp_request_get_filename(scp));
mode = ssh_scp_request_get_permissions(scp);
printf("Receiving file %s: permissions %o\n",filename,mode);
ssh_scp_accept_request(scp);
/*Read and write to a file in chunks*/
fd = open(filename, O_CREAT | O_WRONLY, mode);
if (fd == -1){
printf("Error opening file %s/%s\n",get_current_dir_name(),filename);
perror(filename);
ssh_scp_free(scp);
free(filename);
return SSH_ERROR;
}
free(filename);
while ((bytes_read=ssh_scp_read(scp,buffer,buffer_size))!=SSH_ERROR){
write(fd, buffer, bytes_read );
}
close(fd);
}else if (rc == SSH_SCP_REQUEST_NEWDIR){
/*This is where I want to check the folder name and avoid reading it*/
filename = strdup(ssh_scp_request_get_filename(scp)); //folder name in this case
mode = ssh_scp_request_get_permissions(scp);
printf("Creating and entering %s: mode %d\n",filename,mode);
mkdir(filename,mode);
if (chdir(filename)==-1){
printf("Unable to enter directory %s\n",filename);
free(filename);
ssh_scp_free(scp);
return SSH_ERROR;
}
free(filename);
ssh_scp_accept_request(scp);
}else if (rc == SSH_SCP_REQUEST_ENDDIR){
printf("Leaving directory\n");
chdir("..");
}else if (rc == SSH_SCP_REQUEST_WARNING){
printf("Warning received: %s\n",ssh_scp_request_get_warning(scp));
}else if (rc == SSH_ERROR){
printf("%s\n",ssh_get_error(session));
ssh_scp_close(scp);
ssh_scp_free(scp);
return SSH_ERROR;
}
}
ssh_scp_close(scp);
ssh_scp_free(scp);
return SSH_OK;
}
我试过的方法:
ssh_scp_deny_request
当我到达一个我不需要的文件夹时调用
这不起作用,因为它会回复SSH_SCP_REQUEST_EOF
并结束请求,所以我无法读取这个文件夹之后的文件夹。DONT_READ
当我到达一个不需要的文件夹时设置一个标志,并且只是调用ssh_scp_accept_request
而不读取任何内容,直到该文件夹结束。当我尝试在不读取文件的情况下
调用时,这将引发错误。ssh_scp_pull_request
我可以ssh_scp_read
在不向本地目录写入任何内容的情况下调用以防止这种情况发生,但这会浪费时间,因为子文件夹中可能有很多文件。
如果它有更好的解决方案,我可以使用 scp 以外的东西。
解决方案
推荐阅读
- python-2.7 - 使用索引设置 Pandas DataFrame 中不同列的值
- c# - 使用 EPPLUS c# 将所有列放在一页上
- css - 在模块化css中设置具有状态值的ClassName react
- sql - 当记录向上或向下移动时 SQL Server 重新排序序列号
- powershell - 使用 PowerShell 计算日志文件中的唯一错误消息
- datetime - 在 JHipster + Angular2+ 项目中更改 DATE_TIME_FORMAT 常量
- python - 如何在 python 中使用 np.pad 填充图像?
- python - 我可以在没有请求的情况下检查连接并实时回复吗
- hadoop - 使用远程元存储在亚马逊 EMR 中创建 s3 外部表
- c# - 在 Excel 工作表中导出带有价格的 € 符号,结果为 €