如何将命令的(巨大)输出直接 scp 到远程机器?

如何将命令的(巨大)输出直接 scp 到远程机器?

请注意,我无法先将文件存储在本地——它太大了。

这个(令人讨厌的)页面(一直滚动到底部)似乎给出了答案,但我无法解开特定于磁带驱动器的部分:

http://webcache.googleusercontent.com/search?q=cache:lhmh960w2KQJ:www.experts-exchange.com/OS/Unix/SCO_Unix/Q_24249634.html+scp+redirect&cd=3&hl=en&ct=clnk&gl=us

为了更具体一点,你可以这样想可能工作:

在本地机器上:

% echo "pretend this string is a huge amt of data" | scp - remote.com:big.txt

(这是使用约定 —— 事实上 scp 并不支持 —— 用破折号代替源文件来告诉它从 stdin 获取。)

答案1

您可以通过管道连接到 ssh 并运行远程命令。在本例中,远程命令cat > big.txt会将 stdin 复制到big.txt文件中。

echo "Lots of data" | ssh [email protected] 'cat > big.txt'

这很简单直接,只要您可以使用 ssh 连接到远程端即可。

您还可以使用nc(NetCat)传输数据。在接收机器上(例如 host.example.com):

nc -l 1234 > big.txt

这将设置nc为监听端口 1234,并将发送到该端口的任何内容复制到文件中big.txt。然后,在发送机器上:

echo "Lots of data" | nc host.example.com 1234

此命令将告诉nc发送方连接到接收方的端口 1234 并通过网络从 stdin 复制数据。

然而,该nc解决方案有一些缺点:

  • 无需身份验证;任何人都可以连接到端口 1234 并将数据发送到该文件。
  • 数据并未加密,就像 一样ssh
  • 如果任何一台机器位于防火墙后面,则必须打开所选端口以允许连接通过并正确路由,尤其是在接收端。
  • 两端必须同时独立设置。使用此ssh解决方案,您只需从其中一个端点启动传输即可。

答案2

使用 ssh:

echo "pretend this is a huge amt of data" | ssh [email protected] 'cat > big.txt'

答案3

使用数控(Net Cat),它不需要在本地保存文件。

答案4

使用 FIFO 管道:

mknod mypipe p
scp mypipe destination &
ls > mypipe

相关内容