【问题标题】:Are there ways of doing opendir(), readdir() type of calls through SSH/SFTP?有没有办法通过 SSH/SFTP 进行 opendir()、readdir() 类型的调用?
【发布时间】:2010-11-18 23:48:24
【问题描述】:

我有一些代码可以读取要处理的文件的目录。我目前使用 dirent.h,opendir(),readdir() 方法来执行此操作。有人告诉我我需要做同样的事情,只是现在它是远程机器上的一个目录,具有 SSH/SFTP 访问权限。

唯一的方法(我能想到的)做同样的事情,除了我的源代码之外不改变系统中的任何东西,是运行“ssh user@host ls”命令,解析和处理基于解析器结果。

这里真正的问题是,有没有办法通过 SSH/SFTP 执行 opendir()、readdir()(或类似的东西)?

【问题讨论】:

    标签: ssh sftp openssh dirent.h


    【解决方案1】:

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

    否则,您可以查看 sshfs 的 source 以获取有关它如何做事的提示。

    【讨论】:

      【解决方案2】:

      是的,SFTP 有执行此操作的协议。在此处阅读最新文档:http://tools.ietf.org/wg/secsh/draft-ietf-secsh-filexfer/

      【讨论】:

      • 这是在任何地方实现的吗?
      • OpenSSH 似乎没有稳定的 API 或任何 API 文档,除了代码内注释。
      • sshfs 只是将 ssh 作为一个单独的进程运行,并通过管道传输原始 SFTP,从而无需稳定的 API
      • OpenSSH 实现了网络协议,而不是 API - 没有标准的 SSH API。 sshfs 是一种替代方案,否则您需要使用 SFTP 客户端库。
      【解决方案3】:

      从 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);
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-18
        • 1970-01-01
        • 2019-01-15
        • 2017-06-18
        • 2022-01-11
        相关资源
        最近更新 更多