我想使用 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以供以后使用chown
和chgrp
命令,以便解决这个问题。但如果我可以将这些文件下载到变量而不是临时本地文件,那就更好了。
一种可能性是创建一个本地命名管道,并将远程文件保存到其中,但我想找到一个不太复杂的解决方案。另一种方法是使用额外的 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
开关。