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);
}
어디서나 구현 되었습니까? –
OpenSSH는 코드 안의 주석을 제외하고는 안정적인 API 나 API 문서가없는 것 같습니다. –
sshfs는 별도의 프로세스로 ssh를 실행하고 파이프를 통해 원시 SFTP를 말하며 안정적인 API가 필요하지 않습니다. – bdonlan