
私は 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 以上を選択します。scp
sftp
これはbash
Linux で動作します:
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
を回避するための非移植性の魔法であり、以下で説明されています。mkfifo
man 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