我们正在使用:
takeWhile
我想使用scp(安全复制程序)将数据从一台服务器发送到另一台服务器。
我们首先解压缩数据。此外,我们只解压缩数据并将其管道(因此解压缩-p)到服务器,而不是解压缩到本地服务器上的文件然后发送它。这是因为服务器是生产服务器,他们不希望我们在生产服务器上存储可能累积的任何其他文件。
初始概念命令如下所示;
Linux version 2.6.32-696.20.1.el6.x86_64 (gcc version 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) ) #1 SMP Fri Jan 12 15:07:59 EST 2018 x86_64 x86_64 x86_64 GNU/Linux
我试图告诉Linux要做的是:
使用scp,将数据复制到以下服务器上的以下目录:
鹰@ svamn14glbsalh:/ pacelog / AUTOSYS / upload_event_logs /数据/
我收到了使用错误:
unzip -p car.zip car1 | scp eagle@svamn14glbsalh:/pacelog/AUTOSYS/upload_event_logs/data/car1
所以我尝试使用以下命令进行不同的操作:
usage: scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
[-l limit] [-o ssh_option] [-P port] [-S program]
[[user@]host1:]file1 ... [[user@]host2:]file2
我在考虑从解压缩命令获取数据流并将输出发送到scp命令......它没有工作。我收到以下错误:
unzip -p car.zip car1 > scp eagle@svamn14glbsalh:/pacelog/AUTOSYS/upload_event_logs/data/car1
有人有什么想法吗?我错过了什么?
答案 0 :(得分:2)
SCP并不适合您的目的。 SCP协议不支持向远程系统发送未知大小的字节流以保存为文件。用于发送文件的SCP协议消息需要首先发送文件的大小,然后是组成文件的字节。使用从管道读取的字节流,您通常不会知道管道将产生多少字节,因此无法发送包含正确大小的SCP协议消息。
(我所知道的SCP协议的最佳在线描述是here。请注意" C"消息。)
SFTP协议可以用于此类事情。据我所知,普通sftp
命令行实用程序不支持读取管道并将其存储为远程文件。但是大多数现代编程语言都有SSH / SFTP库(perl,python,ruby,C#,Java,C等)。如果您知道如何使用这些语言之一,那么编写满足您需要的实用程序应该很简单。
如果您坚持使用shell脚本,则可能会欺骗足够的SCP协议来传输文件。这是一个例子:
#!/bin/bash
cmd='cat /etc/group'
size=$($cmd | wc -c)
{
echo C0644 $size some-file
$cmd
echo -n -e '\000'
} | ssh user@host scp -v -p -t /some/directory
这将在具有权限644的远程系统上的some-file
中创建/some/directory
。文件内容将是$cmd
写入其标准输出的内容。请注意,您正在运行该命令两次,包括所暗示的任何资源消耗和副作用。并且命令必须每次输出相同数量的字节。
答案 1 :(得分:1)
只要您能够在服务器上运行任意命令,就可以使用ssh
执行此操作:
unzip -p car.zip car1 |
ssh eagle@svamn14glbsalh 'cat > /pacelog/AUTOSYS/upload_event_logs/data/car1'
如果你没有能力运行任意命令,只有scp
(scp -t
与OpenSSH)的服务器端模式,它理论上仍然可行,但我不知道如何,因为没有记录该模式,请参阅Creating your own activity logging in GAE/P。