我正在使用 SFTP 来传输文件。但是在这个过程中,如果路径不存在,sftp会默认创建一个目录吗?谁能向我解释一下吗
答案1
使用 OpenSSHsftp
客户端时,如果命令的本地路径get
包含不存在的目录,则会出现错误。
这是代码(请参阅do_download()
中的函数sftp-client.c
):
local_fd = open(local_path,
O_WRONLY | O_CREAT | (resume_flag ? 0 : O_TRUNC), mode | S_IWUSR);
if (local_fd == -1) {
error("Couldn't open local file \"%s\" for writing: %s",
local_path, strerror(errno));
goto fail;
}
如果该目录不存在,则不会尝试创建该目录。
测试这个:
sftp> lls hello
ls: hello: No such file or directory
Shell exited with status 1
sftp> get Documents/answers.txt hello/world
Fetching /home/kk/Documents/answers.txt to hello/world
Couldn't open local file "hello/world" for writing: No such file or directory
sftp> lls hello
ls: hello: No such file or directory
Shell exited with status 1
sftp>
如果sftp
以相同的标志开始-r
或者如果该get
命令与相同的标志一起使用,则目标目录将要被创建。这是来自download_dir_internal()
in 的位置,如果使用该标志,sftp-client.c
我们最终会从process_get()
in开始:sftp.c
-r
if (mkdir(dst, mode) == -1 && errno != EEXIST) {
error("mkdir %s: %s", dst, strerror(errno));
return -1;
}
这对我来说似乎是合乎逻辑的。如果您想递归下载文件,则不需要在获取文件之前手动创建目录结构。