我有两台 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"