
我只想創建一個 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
分別。
如何在不先將其存儲在本地的情況下將焦油球存儲在那裡?最好不要先將遠端資源安裝在某個資料夾中,這樣就可以輕鬆使用。
我使用 Ubuntu 16.04(搭配 Linux 4.4.0)。
答案1
如果沒有花俏的 gvfs 或 sshfs 安裝,您需要使用 sftp 用戶端。我選擇lftp
>=4.7,因為它適用於 FIFO 管道(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 命名開啟檔案方法的系統支援進程替換。它採用<(列表)或>(列表)的形式。進程清單的輸入或輸出連接到 FIFO 或 /dev/fd 中的某個檔案。該文件的名稱作為擴展結果作為參數傳遞給當前命令。如果使用 >(list) 形式,寫入檔案將為清單提供輸入。如果使用 <(list) 形式,則應讀取作為參數傳遞的檔案以獲得 list 的輸出。
答案2
Nautilus 用於gvfs
掛載遠端儲存位置,例如您問題中的 SFTP 伺服器。這允許您將遠端伺服器視為本機檔案系統的一部分。它掛載的路徑通常是
/run/user/<your uid>/gvfs/<server specification>/<path>
我相當確定前綴總是
/run/user/<your uid>
因此您可以透過該目錄透過ls
或-ing 找到該安裝點。Tab
找到此安裝點後,您可以tee
像平常一樣使用(為了清楚起見,添加了換行符):
tar --exclude='./somefolder' -zc . \
| tee "/run/user/1000/gvfs/sftp:host=mydomain.ending/storage/location/on/server/sth.tar" \
| sha256sum
或者,您可以透過使用 SSH 而不是 SFTP 來避免 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