我想使用 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
查找数字 uids/gids 以供以后chown
和chgrp
命令使用,以解决此问题。但是,如果我可以将此类文件下载到变量而不是临时本地文件,那就更好了。
一种可能性是创建一个本地命名管道,并将远程文件保存到其中,但我想找到一个不太复杂的解决方案。另一种方法是额外的 SSH 会话来获取此类数据,但由于我们使用定时令牌 (TOTP),这意味着每个远程主机需要额外 30 秒...
SCP 在我们的网络中是被禁止的,所以很遗憾,它不是一个选项。
SFTP 可以get
“保存”到标准输出吗?
谢谢!
SFTP 的工作方式,下载不一定是顺序的。这就是为什么
sftp
需要一个可寻找的目的地。所以它不适用于/dev/stdout
.如果服务器乱序发送,客户端可以序列化内存中的数据。如果
lftp
@Kamil 的建议有效,它必须这样做。我的Windows WinSCP 客户端也这样做。但 OpenSSHsftp
没有。但通常,如果你可以“sftp”,你也可以“scp”。SCP 下载是连续的,所以这有效:
或者,如果您至少有部分 shell 访问权限,您还可以执行以下操作: