通过 SFTP 将文件获取到 stdout

通过 SFTP 将文件获取到 stdout

我想使用 SFTP 获取远程文件,但选择 stdout 作为本地目标。我尝试了下面显而易见的代码,但失败了:

echo 'get <Remote file> /dev/stdout' | sftp <User>@<Host>:
sftp> <Remote file> /dev/stdout   
Fetching <Remote file> to /dev/stdout 
<Remote file>                                               100%   28KB  57.6KB/s   00:00
ftruncate "/dev/stdout": Invalid argument
Couldn't write to "/dev/stdout": Illegal seek

这样做的原因是我想要下载/etc/passwd/etc/group找到数字uid/gid以供以后使用chownchgrp命令,以便解决这个问题。但如果我可以将这些文件下载到变量而不是临时本地文件,那就更好了。

一种可能性是创建一个本地命名管道,并将远程文件保存到其中,但我想找到一个不太复杂的解决方案。另一种方法是使用额外的 SSH 会话来获取此类数据,但由于我们使用定时令牌 (TOTP),这意味着每个远程主机需要额外的 30 秒...

我们的网络禁止 SCP,因此不幸的是,它不是一个选择。

SFTP 可以get“保存”到标准输出吗?

谢谢!

答案1

SFTP 的工作方式是,下载不一定是连续的。这就是为什么sftp需要可搜索的目的地。所以它不适用于/dev/stdout

如果服务器发送的数据顺序错误,客户端可以在内存中序列化数据。如果lftp@Kamil 的建议有效,那么它一定是这么做的。我的Windows WinSCP 客户端可以做到这一点也是。但是 OpenSSHsftp没有。


但通常情况下,如果你能使用“sftp”,那么你也能使用“scp”。SCP 下载是连续的,因此这样做是可行的:

scp -q [email protected]:/remote/path /dev/stdout

或者如果你至少有部分 shell 访问权限,你也可以执行以下操作:

ssh [email protected] cat /remote/path

但请注意,从 OpenSSH 9.0 开始,scp默认情况下实际上是 SFTP 客户端。要使其使用 SCP 协议,请添加-O开关。

相关内容