首页 > 解决方案 > 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;
}

我试过的方法:

如果它有更好的解决方案,我可以使用 scp 以外的东西。

标签: clibssh

解决方案


推荐阅读