如何通过scp或sftp将远程文件传输到stdout?


28

使用ssh,使用以下命令可以轻松打印文件内容

ssh host 'cat file.txt'

禁用ssh且仅启用SFTP时,运行上一条命令会出现以下错误:

此服务仅允许sftp连接。

要解决此问题,我可以使用scp或创建一个临时文件sshfs(如下所示),但这看起来确实很丑陋。禁用SSH时,打印远程文件内容的正确方法是什么?

mkdir tmpdir
sshfs host: tmpdir
cat tmpdir/file.txt
fusermount -u tmpdir

# This does not work! scp -v host:file.txt . shows
# "Sink: This service allows sftp connections only."
scp host:file.txt .
cat file.txt
rm file.txt

Answers:


14

Curl可以像cat一样显示文件。无需删除该文件,因为它仅显示输出,除非您告诉它执行其他操作。

curl -u username:password sftp://hostname/path/to/file.txt

如果使用公共密钥身份验证:

curl -u username: --key ~/.ssh/id_rsa --pubkey sftp://hostname/path/to/file.txt

如果使用默认位置,则--key--pubkey可以省略:

curl -u username: sftp://hostname/path/to/file.txt

用户名也可以是URL的一部分,因此最终结果看起来非常接近ssh命令:

curl sftp://username@hostname/path/to/file.txt

谢谢,正是我想要的!我已经编辑了您的答案以扩展公钥身份验证,事实证明该语法与ssh / sshfs语法非常相似。如果curl命令失败并显示“ curl:(51)SSL对等证书或SSH远程密钥不正确”,则只需添加-k标记(--insecure)。
罗布W

28

对于可以跑步的人scp,您可以执行以下操作:

scp remotehost:/path/to/remote/file /dev/stdout

两种方法均无效。第一个等效于单线sftp username@hostname:/path/to/file.txt /dev/stdout,结果为“无法写入” / dev / stdout:非法查找”。第二条命令失败,并显示问题底部显示的错误。
罗布W

SFTP表格对我来说很好用。这可能取决于您使用的ssh软件版本。关于scp,我确实说过“如果scp有效”。您在问题中确定服务器不允许您执行scp,因此scp命令自然会对您失败。
Kenster 2014年

ssh -VOpenSSH_6.6.1p1, OpenSSL 1.0.1h 5 Jun 2014。因为它使用ssh引擎盖下,和ssh禁用SCP失败(作为一种安全措施,例如参见serverfault.com/questions/354615/allow-sftp-but-disallow-ssh
罗布W¯¯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.