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の位置です。そのフラグを使用するとinsftp-client.c
から始まりますprocess_get()
。sftp.c
-r
if (mkdir(dst, mode) == -1 && errno != EEXIST) {
error("mkdir %s: %s", dst, strerror(errno));
return -1;
}
これは私にとって論理的なようです。ファイルを再帰的にダウンロードする場合は、ファイルをインポートする前にディレクトリ構造を手動で作成する必要はありません。