0

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

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

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

4

3 回答 3

2

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

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

于 2009-08-12T14:45:20.067 回答
1

是的,SFTP 有一个协议可以做到这一点。在此处阅读最新的文档:http ://tools.ietf.org/wg/secsh/draft-ietf-secsh-filexfer/

于 2009-08-12T14:45:21.440 回答
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);
 }
于 2009-08-25T12:07:17.190 回答