SFTPサーバーからファイルを取得し、メモリ内で操作する

SFTPサーバーからファイルを取得し、メモリ内で操作する

ありますかバッシュSFTPサーバーにアクセスし、ファイルに「アクセス」し、ダウンロードせずに読み取ることができる方法バッファコンテンツを操作してローカルに保存します。

これは Perl スクリプトを使用して実行できることはわかっています。

@file=$sftp->get($file);

私は bash でも同様のアプローチを探しています。

目的は、Perl スクリプトから離れて、bash で機能を実装することです。

ありがとう

答え1

libcurl と sftpサポート:

 curl sftp://sftp.example.com -o - | do_some_magic > filename


私は以下の Linux ディストリビューション/Unix で curl をテストしました:

sftp サポートが組み込まれた libcurl: RHEL6、RHEL7

なし: RHEL5、Ubuntu 11.04、Ubuntu 14.04、Solaris 11

答え2

リモート ファイルをダウンロードせずにアクセスすることはできませんが、ローカル ファイル システムに保存せずにリモート ファイルをダウンロードすることはできます。SFTP をサポートしていない bash 自体ではできませんが、コマンド ライン ユーティリティでは可能です。

OpenSSH のクライアントsftpではそれができないようです。シーク可能な出力場所を取得することを要求し、コマンド置換にパイプ出力することはできません。

Curlは標準出力にファイルをダウンロードできるただし、必ずしも SFTP サポート付きで構築されているわけではありません (HTTP ダウンローダーとして開始されました)。

Perl でこれを行う方法は既にわかっているので、Perl を実行するだけで済みます。

あるいは、リモートファイルシステムをマウントするSSHFS、などのコマンドを使用してアクセスしますcat

mkdir foo
sshfs example.com:/path/to/directory foo
content=$(cat foo/somefile)
fusermount -u foo
rmdir foo

あるいは、「通常の」シェルの方法で操作します。シェルはメモリ内で複雑なデータ操作を行うようには設計されておらず、主に他のコマンドの実行やファイルの操作に適しています。ファイルの内容の操作には通常、パイプラインが使用され、場合によっては一時ファイルが使用されます。

my_tmp_dir=
trap 'rm -rf "$my_tmp_dir"' EXIT INT HUP
my_tmp_dir=$(mktemp -d)
echo 'get remotefile localfile' | { cd "$my_tmp_dir" && sftp -q; }
content=$(cat "$my_tmp_dir/localfile")

関連情報