コマンド出力をSFTPリソースに保存する

コマンド出力をSFTPリソースに保存する

私は tar ボールを作成して、それを SFTP リソースにのみ保存した​​いと考えていました。データの破損を心配しているので、信頼できるものであれば、通常は tar ボールの sha256sum も一緒に保存し、アーカイブを生成するときと、アーカイブが書き込まれた後に、保存されているストレージ メディアから読み取って計算します。

これはかなり簡単だと思ったので、次のコマンドを入力しました:

tar --exclude='./somefolder' -zc . | tee "sftp://mydomain.ending/storage/location/on/server/sth.tar" | sha256sum

Nautilus がリモート端末に使用するものも試しました:

tar --exclude='./somefolder' -zc . | tee ":/run/user/1000/gvfs/sftp:host=mydomain.ending/storage/location/on/server/sth.tar" | sha256sum

ただし、出力は次のとおりでした。

tee: 'sftp://mydomain.ending/storage/location/on/server/sth.tar': No such file or directory

そして

tee: ':/run/user/1000/gvfs/sftp:host=mydomain.ending/storage/location/on/server/sth.tar': No such file or directory

それぞれ。

最初にローカルに保存せずに、そこに tar ボールを保存するにはどうすればよいですか? できれば、最初にリモート リソースを何らかのフォルダーにマウントせずに、簡単に使用できるようにしてください。

私はUbuntu 16.04(Linux 4.4.0)を使用しています。

答え1

高度な gvfs または sshfs マウントがない場合、sftp クライアントを使用する必要があります。FIFOパイプで動作する (および動作しない)lftpため、4.7 以上を選択します。scpsftp

これはbashLinux で動作します:

tar --exclude='./somefolder' -zc . \
 | tee >(lftp -c 'connect sftp://user:pass@server/path/ ;put /dev/stdin -o sth.tar.gz;') \
 | sha256sum

あるいは、sshクライアントを使用します (対話型パスワード認証には外側の括弧が必要です):

(tar --exclude='./somefolder' -zc . \
 | tee >(ssh user@server "cat > /path/sth.tar.gz") \
 | sha256sum)

注意:tee's引数も少し変わっているように見えますが、これは追加のコマンドbashを回避するための非移植性の魔法であり、以下で説明されています。mkfifoman bash

プロセス置換

プロセス置換は、名前付きパイプ (FIFO) または開いているファイルの命名に /dev/fd 方式をサポートするシステムでサポートされます。<(リスト) または >(リスト) の形式をとります。プロセス list は、その入力または出力が FIFO または /dev/fd 内のファイルに接続された状態で実行されます。このファイルの名前は、展開の結果として現在のコマンドに引数として渡されます。>(リスト) 形式を使用する場合、ファイルに書き込むと、リストに入力が提供されます。<(リスト) 形式を使用する場合、引数として渡されたファイルは、リストの出力を取得するために読み取られる必要があります。

答え2

Nautilusは、gvfs質問のSFTPサーバーなどのリモートストレージの場所をマウントするために使用します。これにより、リモートサーバーをローカルファイルシステムの一部であるかのように扱うことができます。マウント先のパスは通常、

/run/user/<your uid>/gvfs/<server specification>/<path>

私は接頭辞が常に

/run/user/<your uid>

そのため、そのディレクトリをlsまたはで検索することで、このマウント ポイントを見つけることができます。Tab

このマウント ポイントを見つけたら、tee通常どおりに使用できます (わかりやすくするために改行が追加されています)。

tar --exclude='./somefolder' -zc .  \
| tee "/run/user/1000/gvfs/sftp:host=mydomain.ending/storage/location/on/server/sth.tar"  \
| sha256sum

あるいは、SFTP の代わりに SSH を使用することで、GVFS マウントを回避しながら、移植不可能なプロセス置換を回避することもできます。

tar --exclude='./somefolder' -zc .  \
| ssh mydomain.ending 'tee "/storage/location/on/server/sth.tar"' 2>/dev/null  \
| sha256sum

残念ながら、sftpこのプログラムでは、単一のコマンド ラインを介してファイルをリモート ホストにプッシュすることはできず、取得することしかできません。

@rudimeierが指摘しているように、上記のssh方法ではおよびダウンロードファイルをローカルに保存しないようにします。再ダウンロードしたくない場合は、sha256sumリモートで実行した方がよいでしょう。

tar --exclude='./somefolder' -zc .  \
| ssh mydomain.ending 'tee "/storage/location/on/server/sth.tar" | sha256sum' 2>/dev/null

関連情報