SFTPは新しいディレクトリを作成します。

SFTPは新しいディレクトリを作成します。

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;
}

これは私にとって論理的なようです。ファイルを再帰的にダウンロードする場合は、ファイルをインポートする前にディレクトリ構造を手動で作成する必要はありません。

関連情報