如何打开PDF作为BASH变量?


1

我正在尝试使用Preview打开PDF,其中输入文件是shell var:

$ pdf=$(wget -qO- 'http://website.com/file.pdf') && open "$pdf"

$ pdf=$(wget -qO- 'http://website.com/file.pdf') && open -a /Applications/Preview.app -f "$pdf"

$ open -a /Applications/Preview.app $(wget -qO- 'http://website.com/file.pdf')

$ pdf=$(wget -qO- 'http://website.com/file.pdf') | open -a /Applications/Preview.app -f -

等等

我总是得到同样的错误:

-bash:/ usr / bin / open:参数列表太长

是否有可能做到这一点?

任何想要尝试的人的示例PDF:

https://www.exploit-db.com/docs/english/44592-linux-restricted-shell-bypass-guide.pdf

Answers:


4

很酷的问题显示bash,管道和开放是多么惊人。你是 很近 在第四次尝试:

wget -qO- 'https://www.com/big.pdf' | open -f -a Preview.app

幸运的是 -a 参数让我们 -f 从stdin获取数据但不在TextEdit中打开。


回到你的身边,@ lily - 在检查手册页之前我尝试了很多一半的努力,并希望这两个选项能够正常工作。
— bmike

这个答案并不完整,问题特别提到使用Preview打开PDF,其中输入文件是shell var。
— Dials Mavis

我印象非常深刻 - 我不希望这个有用,但确实如此!
— Gordon Davisson

1

您可以像这样打开PDF作为Bash变量(表示为文件的路径)。

  1. 设置你的变量:

    pdf=/path/to/44592-linux-restricted-shell-bypass-guide.pdf
    
  2. 像这样打开文件:

    open "$pdf" -a Preview
    

但是,您的示例表明文件系统上不存在该文件。如果要打开存储在变量中的原始数据流,我建议回显您的变量,然后将其汇总到 open 使用 -f 像这样的选项。

  1. 定义你的变量:

    pdf=$(wget -qO- https://www.exploit-db.com/docs/english/44592-linux-restricted-shell-bypass-guide.pdf)
    
  2. 从标准输入打开原始数据作为流:

    echo $pdf | open -f -a Preview
    

说明: 如果存储输出 wget -qO- … 作为变量,而不是将文件下载到您的文件系统, open 当你传递原始文件数据而不是文件路径时,它将不知道该怎么做。在 man open 'file'指的是给定应用程序的可打开文件,示例中的变量不是那个。该 -f 选项在此方案中很有用,因为设置变量的方法涉及存储整个文件流,而不会将其解释为文件 open,因此它只能作为文件流打开。


2
这不起作用,因为它会以多种方式破坏文件。首先,变量不适用于二进制数据,尤其是包含空字符(零字节)的任何内容。其次,使用不带双引号的变量引用会使值受到分词和通配符扩展。最后, echo 在打印内容的末尾添加换行符。您可以使用解决最后两个问题 printf "%s" "$pdf" 代替 echo $pdf,但第一个更难解决。你必须做一些事情,比如将它存储在base64编码中。
— Gordon Davisson

感谢您的反馈,戈登。我做到了 不 了解变量和空数据。那么有效的问题最初是不可能实现的?
— Dials Mavis

我应该提一下,这个代码确实在这个例子中成功运行。
— Dials Mavis
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.