我可以使用从解压缩 -p cmd 通过管道传输的数据来使用 SCP 吗?



我们正在使用:

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

我想使用 scp (安全复制过程)将数据从一台服务器发送到另一台服务器。

我们首先解压缩数据。此外,我们只是解压缩数据并将其管道(因此解压缩 -p)到服务器,而不是解压缩到本地服务器上的文件然后发送它。这是因为服务器是生产服务器,他们不希望我们在生产服务器上存储任何可能累积的额外文件。

初始概念命令如下所示;

unzip -p car.zip car1 | scp eagle@svamn14glbsalh:/pacelog/AUTOSYS/upload_event_logs/data/car1

我想告诉Linux做的是:

仅从压缩文件
  1. 车.zip解压缩文件car1中的数据。
  2. 通过管道将该信息传送到 scp 命令。
  3. 使用 scp 将数据复制到以下服务器上的以下目录:

    eagle@svamn14glbsalh:/pacelog/AUTOSYS/upload_event_logs/data/

我收到使用错误:

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

所以我尝试使用以下命令以不同的方式执行此操作:

unzip -p car.zip car1 >  scp eagle@svamn14glbsalh:/pacelog/AUTOSYS/upload_event_logs/data/car1

我在想从解压缩通信中获取数据流并将输出发送到 scp 命令......它没有用。我收到以下错误:

caution: filename not matched:  eagle@svamn14glbsalh:/pacelog/AUTOSYS/upload_event_logs/data/car1

有人有什么想法吗?我错过了什么?

SCP 不太适合您的目的。SCP 协议不支持将未知大小的字节流发送到远程系统以另存为文件。用于发送文件的 SCP 协议消息要求首先发送文件大小,然后是组成文件的字节。使用从管道读取的字节流,您通常不知道管道将产生多少字节,因此无法发送包含正确大小的 SCP 协议消息。

(我所知道的关于SCP协议的最佳在线描述在这里。注意"C"消息。

SFTP协议可用于此类事情。据我所知,普通的sftp命令行实用程序不支持读取管道并将其存储为远程文件。但是大多数现代编程语言(perl,python,ruby,C#,Java,C等)都有SSH/SFTP库。如果您知道如何使用这些语言之一,那么编写一个满足您需求的实用程序应该很简单。

如果您坚持使用 shell 脚本,则可以欺骗足够的 SCP 协议来传输文件。下面是一个示例:

#!/bin/bash
cmd='cat /etc/group'
size=$($cmd | wc -c)    
{
echo C0644 $size some-file
$cmd
echo -n -e '00'
} | ssh user@host scp -v -p -t /some/directory

这将在权限为 644 的远程系统上创建/some/directorysome-file。文件内容将是$cmd写入其标准输出的任何内容。请注意,您将运行该命令两次,这意味着任何资源消耗和副作用。并且该命令每次必须输出相同数量的字节。

您可以使用ssh

执行此操作,前提是您能够在服务器上运行任意命令:

unzip -p  car.zip car1 | 
ssh eagle@svamn14glbsalh 'cat > /pacelog/AUTOSYS/upload_event_logs/data/car1'

如果您没有能力运行任意命令,只有服务器端模式scp(scp -tOpenSSH),理论上

仍然是可能的,但我不知道如何,因为该模式没有记录在案,请参阅Kenster的答案。

最新更新