我只想创建一个 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