如何通过网络提取存档

如何通过网络提取存档

我有两台 Solaris 服务器。在 server1 上我有一个文件archive.tar.gz.我需要使用 ssh 到 server2 来提取它。

因此,我编写命令:

ssh server2 < archive.tar.gz | gunzip -c | tar -xf - -C /home/

但我收到一个错误:

伪终端不会被分配,因为 stdin 不是终端。

如何正确复制文件?

答案1

我相信你可以做这样的事情:

$ cat archive.tar.gz | ssh server2 "tar zxvf -"

如果您需要控制在 server2 上解压到的目录:

$ cat archive.tar.gz | ssh server2 "cd /path/to/dir; tar zxvf -"

索拉里斯

鉴于您使用的是 Solaris,您的 tar 版本可能不包含 GNU tar 提供的任何压缩功能。不用担心,您仍然可以执行此命令,我们只需要将 cat 分解archive.tar.gz为可以首先解压缩 tarball 的命令即可。

像这样的事情应该做:

$ cat archive.tar.gz | ssh server2 "(cd /some/dir; gunzip | tar xf -)"

或这个:

$ gzip -dc < sample.tar.gz | ssh server2 "cd /path/to/dir; tar xvf -"

或这个:

$ gunzip sample.tar.gz | ssh server2 " cd /path/to/dir; tar xvf -"

答案2

ssh server2 < archive.tar.gz

您没有向 传递任何命令ssh,因此它会在远程端执行 shell。的内容archive.tar.gz通过其标准输入传递到该 shell,因此它尝试将其解析为 shell 脚本。是否会引发欢闹,取决于文件的内容。

您的描述中并不清楚您在哪里运行这些命令。如果您位于 server1 上,archive.tar.gz并且想要在 server2 上提取存档,则将存档通过管道传输到 server2 并在那里运行提取命令。

<archive.tar.gz ssh server2 'cd /home && gunzip | tar -xf -'

或者,登录到 server2,挂载 server1 的文件系统sshfs,然后像解压本地文件一样解压存档。

mkdir /tmp/server1
sshfs server1:/ /tmp/server1
cd /home
gunzip </tmp/server1/path/to/archive.tar.gz | tar -xf -
fusermount -u /tmp/server1

答案3

您可以将存档扩展到特定的现有目录,而无需使用cd如下命令:

$ cat archive.tar.gz | ssh server2 "tar zxvf - -C /path/to/dir"

如果您不知道目录是否存在,可以使用以下命令:

$ cat archive.tar.gz | ssh server2 "mkdir -p /path/to/dir && tar zxvf - -C /path/to/dir"

相关内容