Linux 我可以使用从解压-p命令传输的数据来使用SCP吗?
我们正在使用:Linux 我可以使用从解压-p命令传输的数据来使用SCP吗?,linux,pipe,unzip,scp,Linux,Pipe,Unzip,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(安全复制过程)将数据从一台服务器发送到另一台服务器 我们先解压缩数据。此外,我们只解压缩数据并将其(因此是unzip-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
我想使用scp(安全复制过程)将数据从一台服务器发送到另一台服务器
我们先解压缩数据。此外,我们只解压缩数据并将其(因此是unzip-p)传输到服务器,而不是解压缩到本地服务器上的文件然后发送。这是因为服务器是生产服务器,他们不希望我们在生产服务器上存储任何可能累积的额外文件
最初的concept命令如下所示
unzip -p car.zip car1 | scp eagle@svamn14glbsalh:/pacelog/AUTOSYS/upload_event_logs/data/car1
我想告诉Linux要做的是:
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
有人有什么想法吗?我遗漏了什么?如果您能够在服务器上运行任意命令,您可以使用
ssh
实现这一点:
unzip -p car.zip car1 |
ssh eagle@svamn14glbsalh 'cat > /pacelog/AUTOSYS/upload_event_logs/data/car1'
如果您没有运行任意命令的能力,只有服务器端模式的
scp
(scp-t
,使用OpenSSH),理论上仍然可能,但我不知道如何,由于该模式没有文档记录,请参见。如果您能够在服务器上运行任意命令,则可以使用ssh
执行此操作:
unzip -p car.zip car1 |
ssh eagle@svamn14glbsalh 'cat > /pacelog/AUTOSYS/upload_event_logs/data/car1'
如果您不具备运行任意命令的能力,那么只有服务器端模式的
scp
(scp-t
,使用OpenSSH),理论上仍然是可能的,但我不知道如何实现,因为该模式没有文档记录,请参见。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 '\000'
} | ssh user@host scp -v -p -t /some/directory
这将在具有权限644的远程系统上的
/some/目录
中创建一些文件
。文件内容将是$cmd
写入其标准输出的内容。请注意,您将运行该命令两次,无论这意味着什么样的资源消耗和副作用。并且命令每次必须输出相同的字节数。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 '\000'
} | ssh user@host scp -v -p -t /some/directory
这将在具有权限644的远程系统上的
/some/目录
中创建一些文件
。文件内容将是$cmd
写入其标准输出的内容。请注意,您将运行该命令两次,无论这意味着什么样的资源消耗和副作用。并且该命令每次必须输出相同的字节数。不,您的解决方案工作正常。解压-p car.zip car1 | ssheagle@svamn14glbsalh“cat>/pacelog/AUTOSYS/upload\u event\u logs/data/car1”就成功了!谢谢不,你的解决方案很好用。解压-p car.zip car1 | ssheagle@svamn14glbsalh“cat>/pacelog/AUTOSYS/upload\u event\u logs/data/car1”就成功了!谢谢