我有一些代码可以读取要处理的文件的目录。我目前使用dirent.h,opendir(),readdir()方法执行此操作。我被告知我需要做同样的事情,只是现在它是具有SSH / SFTP访问权限的远程机器上的目录。
唯一的方法(我能想到)做同样的事情,除了我的源代码之外,不更改系统中的任何内容,就是运行“ssh user @ host ls”命令,解析和处理基于解析器结果。
真正的问题是,有没有办法通过SSH / SFTP执行opendir(),readdir()(或类似的东西)?
答案 0 :(得分:2)
最简单的方法是,如果您使用的是Linux或Mac OS X(或某些BSD),则可以使用sshfs将其附加到文件系统。大多数文件系统调用只会直接工作而无需修改。
否则你可以查看sshfs的source,了解它是如何做的。
答案 1 :(得分:1)
是的,SFTP有一个执行此操作的协议。请在此处阅读最新文档:http://tools.ietf.org/wg/secsh/draft-ietf-secsh-filexfer/
答案 2 :(得分: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);
}