2009-08-12 62 views
0

我有一段代码读取要处理的文件的目录。我目前使用dirent.h,opendir(),readdir()方法来做到这一点。我被告知我需要做同样的事情,只是现在它是远程计算机上的一个目录,可以通过SSH/SFTP访问。有没有办法通过SSH/SFTP来执行opendir(),readdir()类型的调用?

在不改变系统中除我的源代码之外的任何东西的情况下,做同样的事情的唯一方法就是运行一个“ssh user @ host ls”命令,解析并基于解析器结果。

这里真正的问题是,是否有通过SSH/SFTP做执行opendir(),readdir的()(或类似的东西)的方式?

回答

2

最简单的方法,如果你在Linux或Mac OS X(或某些BSD系统)是使用sshfs将其附加到文件系统。大多数文件系统调用将直接运行而不需要修改。

否则,你可以看看sshfs的的source了它是如何做的事情的提示。

1

是的,SFTP有一个协议来做到这一点。通读最近的文档在这里:http://tools.ietf.org/wg/secsh/draft-ietf-secsh-filexfer/

+0

难道这在任何地方实施? – 2009-08-12 14:57:28

+1

它让我担心OpenSSH似乎没有稳定的API或任何API文档,除了代码中的评论。 – 2009-08-12 15:22:31

+1

sshfs只是将ssh作为一个单独的进程运行,并通过管道说出原始的SFTP,无需稳定的API – bdonlan 2009-08-12 15:28:46

0

由于OpenSSH的5.1,有一个有限的实施做到这一点。它没有完全实现File XFER标准。所以我不能检查文件类型之类的东西,但我可以自己扫描文件名......使用OpenSSH源代码中的“sftp.c”代码,我只是将一个adhoc main(),可以根据需要进行更改。我希望这个问题能够在稍后的日子里得到更多的答复。

/* Username is a NULL terminated string 
    Host is a NULL terminated string indicating remote IP */ 
void setup_args(arglist *args, char *username, char *host) 
{ 
     // Arg init allocation 
     memset(args, '\0', sizeof(*args)); 
     args->list = NULL; 

     // Arg setup 
     addargs(args, "%s", "/usr/bin/ssh"); 
     addargs(args, "%s", "-oForwardX11 no"); 
     addargs(args, "%s", "-oForwardAgent no"); 
     addargs(args, "%s", "-oPermitLocalCommand no"); 
     addargs(args, "%s", "-oClearAllForwardings yes"); 
     addargs(args, "%s%s", "-l", username); 
     addargs(args, "%s", "-oProtocol 2"); 
     addargs(args, "%s", "-s"); 
     addargs(args, "%s", host); 
     addargs(args, "%s", "sftp"); 
} 
void run_program() 
{ 
     // Setup connection parameters. 
     int in, out; // The IO file descriptors. 
     arglist args; 
     setup_args(&args, "chenz", "172.16.22.128"); 
     connect_to_server("/usr/bin/ssh", args.list, &in, &out); 
     freeargs(&args); 

     // Create connection 
     struct sftp_conn *conn; 
     conn = do_init(in, out, copy_buffer_len, num_requests); 
     if (conn == NULL) 
       fatal("Couldn't initialise connection to server"); 

     //Get the current directory 
     char *pwd; 
     pwd = do_realpath(conn, "."); 
     printf("PWD: %s\n", pwd); 
     if (pwd == NULL) 
       fatal("Need cwd"); 

     SFTP_DIRENT** dirent; 
     do_readdir(conn, "/home/chenz", &dirent); 
     int i = 0; 
     while (dirent[i] != 0) { 
       printf("filename: %s\n", dirent[i]->filename); 
       printf("longname: %s\n", dirent[i]->longname); 
       printf("attrib:\n", dirent[i]->a); 
       i++; 
     } 

     // Clean up file descriptors 
     close(in); 
     close(out); 

     // Wait for kill signal and exit 
     while (waitpid(sshpid, NULL, 0) == -1) 
       if (errno != EINTR) 
         fatal("Couldn't wait for ssh process: %s", 
          strerror(errno)); 

     //exit(err == 0 ? 0 : 1); 
     exit(0); 
} 
相关问题