Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
libssh/scp-复制远程目录(某些指定子文件夹除外)的内容_C_Libssh - Fatal编程技术网

libssh/scp-复制远程目录(某些指定子文件夹除外)的内容

libssh/scp-复制远程目录(某些指定子文件夹除外)的内容,c,libssh,C,Libssh,我正在编写一个C程序,使用libssh和scp从远程机器复制目录。此目录包含大量子文件夹,我想排除其中的几个(少于10个) 我尝试迭代我需要的子文件夹(我使用SFTP子系统获得目录内容),并使用单独的SCP会话复制每个子文件夹。但由于有20000多个子文件夹,如果我能在一个会话中复制所有内容,可能会更有效率 我想知道是否有办法以递归模式打开SCP会话,并在对某个目录发出SSH\u SCP\u REQUEST\u NEWDIR请求后跳过对该目录的读取 这是我用来读取目录的函数 int-scp\u-

我正在编写一个C程序,使用libssh和scp从远程机器复制目录。此目录包含大量子文件夹,我想排除其中的几个(少于10个)

我尝试迭代我需要的子文件夹(我使用SFTP子系统获得目录内容),并使用单独的SCP会话复制每个子文件夹。但由于有20000多个子文件夹,如果我能在一个会话中复制所有内容,可能会更有效率

我想知道是否有办法以递归模式打开SCP会话,并在对某个目录发出
SSH\u SCP\u REQUEST\u NEWDIR
请求后跳过对该目录的读取

这是我用来读取目录的函数

int-scp\u-read\u文件夹(ssh\u会话,char*位置){
/*开放scp会话*/
ssh_scp scp=ssh_scp_new(session,ssh_scp_READ,ssh_scp_RECURSIVE,location);
如果(scp==NULL){
printf(“错误分配SCP会话:%s\n”,ssh_get_错误(会话));
返回SSH_错误;
}
int rc=ssh_scp_init(scp);
如果(rc!=SSH\u确定){
printf(“初始化SCP会话时出错:%s\n”,ssh_get_错误(会话));
ssh_scp_free(scp);
返回rc;
}
/*读取文件夹*/
int模式;
const int buffer_size=1024;
字符*文件名;
字符缓冲区[缓冲区大小];
int-fd;
读取整数字节;
while((rc=ssh\u scp\u pull\u request(scp))!=ssh\u scp\u request\u EOF){
if(rc==SSH\u SCP\u REQUEST\u NEWFILE){
filename=strdup(ssh_scp_request_get_filename(scp));
模式=ssh\u scp\u请求\u获取\u权限(scp);
printf(“接收文件%s:权限%o\n”、文件名、模式);
ssh\u scp\u接受请求(scp);
/*分块读写文件*/
fd=打开(文件名,O|u创建| O|u仅限,模式);
如果(fd==-1){
printf(“打开文件%s/%s\n时出错”,获取当前目录名称(),文件名);
perror(文件名);
ssh_scp_free(scp);
免费(文件名);
返回SSH_错误;
}
免费(文件名);
while((bytes\u read=ssh\u scp\u read(scp,buffer,buffer\u size))!=ssh\u ERROR){
写入(fd、缓冲区、字节和读取);
}
关闭(fd);
}else if(rc==SSH\u SCP\u REQUEST\u NEWDIR){
/*这就是我要检查文件夹名称并避免读取它的地方*/
filename=strdup(ssh\u scp\u request\u get\u filename(scp));//本例中为文件夹名称
模式=ssh\u scp\u请求\u获取\u权限(scp);
printf(“创建和输入%s:mode%d\n”,文件名,mode);
mkdir(文件名,模式);
如果(chdir(文件名)=-1){
printf(“无法输入目录%s\n”,文件名);
免费(文件名);
ssh_scp_free(scp);
返回SSH_错误;
}
免费(文件名);
ssh\u scp\u接受请求(scp);
}else if(rc==SSH\u SCP\u REQUEST\u ENDDIR){
printf(“离开目录\n”);
chdir(“…”);
}else if(rc==SSH\u SCP\u请求\u警告){
printf(“收到的警告:%s\n”,ssh_scp_请求_获取_警告(scp));
}else if(rc==SSH\u错误){
printf(“%s\n”,ssh\u get\u错误(会话));
ssh_scp_close(scp);
ssh_scp_free(scp);
返回SSH_错误;
}
}
ssh_scp_close(scp);
ssh_scp_free(scp);
返回SSH_OK;
}
我尝试过的方法:

  • 当我到达一个我不需要的文件夹时调用
    ssh\u scp\u deny\u request
    这不起作用,因为它随后用
    SSH\u SCP\u REQUEST\u EOF
    进行回复并结束请求,因此我无法读取此请求之后的文件夹

  • 当我到达一个我不需要的文件夹时,设置一个
    DONT\u READ
    标志,然后只调用
    ssh\u scp\u accept\u request
    ,在该文件夹结束之前不读取任何内容。
    当我尝试调用
    ssh\u scp\u pull\u请求而不读取文件时,这将抛出一个错误。我可以调用
    ssh\u scp\u read
    ,而无需向本地目录写入任何内容来防止出现这种情况,但这将是浪费时间,因为子文件夹中可能有大量文件


如果scp有更好的解决方案,我可以使用scp以外的其他解决方案。

我认为这可能是不可能的。
scp
命令行实用程序也有此限制(无法排除文件/文件夹)。。。只是我从来没有想到这可能是由于缺乏图书馆的支持。。。有意思。我希望有办法使用这个库,因为我可以用自定义的方式处理请求。