如何让 Firefox 读取标准输入?

kev*_*kev 33 firefox

echo '<h1>hello, world</h1>' |  firefox
cat index.html | firefox
Run Code Online (Sandbox Code Playgroud)

这些命令不起作用。
如果firefox可以读取标准输入,我可以firefox通过管道发送 HTML 。
是否可以firefox读取标准输入?

Sno*_*all 41

您可以使用数据 URI,如下所示:

echo '<h1>hello, world</h1>' |firefox "data:text/html;base64,$(base64 -w 0 <&0)"
Run Code Online (Sandbox Code Playgroud)

&0是 stdin 的文件描述符,因此它将 stdin 编码为base64,然后将其插入到数据 URI 中。

同样的技巧也适用于其他浏览器:

echo '<h1>hello, world</h1>' |chromium "data:text/html;base64,$(base64 -w 0 <&0)"
echo '<h1>hello, world</h1>' |opera    "data:text/html;base64,$(base64 -w 0 <&0)"
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以将第二部分放在 bash 脚本中(我称之为pipefox.sh):

#!/bin/bash
firefox "data:text/html;base64,$(base64 -w 0 <&0)"
Run Code Online (Sandbox Code Playgroud)

现在你可以这样做:

echo '<h1>hello, world</h1>' |pipefox.sh
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这不再起作用,请参阅 https://blog.mozilla.org/security/2017/11/27/blocking-top-level-navigations-data-urls-firefox-59/ 了解为什么数据 url 中的大多数 mimetypes现在被阻止从顶级导航。 (4认同)

Jan*_*der 25

简短的回答是,您最好编写一个临时文件并打开它。让管道正常工作更复杂,可能不会给你任何额外的好处。也就是说,这就是我发现的。

如果您的firefox命令实际上是启动 Firefox 而不是与已经运行的 Firefox 实例对话,您可以这样做:

echo '<h1>hello, world</h1>' | firefox /dev/fd/0
Run Code Online (Sandbox Code Playgroud)

它明确地告诉 Firefox 读取它的标准输入,这是管道放置数据的地方。但是,如果 Firefox 已经在运行,该firefox命令只会将该名称传递给主 Firefox 进程,该进程将读取自己的标准输入,这可能不会给它任何内容并且肯定不会连接到您的管道。

此外,当从管道中读取时,Firefox 会大量缓冲内容,因此每次您给它一个新的 HTML 行时它都不会更新页面,如果这就是您想要的。尝试关闭 Firefox 并运行:

cat | firefox /dev/fd/0
Run Code Online (Sandbox Code Playgroud)

(注意,您确实需要cat此处。)将一些长行重复粘贴到您的 shell 窗口中,直到 Firefox 决定更新页面,您就可以看到它需要多少数据。现在通过点击Ctrl+D新行发送文件结束信号,并立即观看 Firefox 更新。但是这样你就不能再添加任何数据了。

所以最好的可能是:

echo '<h1>hello, world</h1>' >my_temporary_file; firefox my_temporary_file
Run Code Online (Sandbox Code Playgroud)

  • 你可以用`-new-instance`强制firefox打开一个新进程,所以它变成`... | firefox -new-instance /dev/fd/0`。 (2认同)

sda*_*aau 7

我找到了这个:

bcat -- 到浏览器实用程序的管道

...要在 Ubuntu Natty 上安装,我做了:

sudo apt-get install rubygems1.8
sudo gem install bcat
# to call
ruby -rubygems /var/lib/gems/1.8/gems/bcat-0.6.2/bin/bcat
echo "<b>test</b>" | ruby -rubygems /var/lib/gems/1.8/gems/bcat-0.6.2/bin/bcat
Run Code Online (Sandbox Code Playgroud)

我认为它可以与自己的浏览器一起使用 - 但运行上述内容会在已经运行的 Firefox 中打开一个新选项卡,指向本地主机地址http://127.0.0.1:53718/btest......bcat安装后,您还可以执行以下操作:

tail -f /var/log/syslog | ruby -rubygems /var/lib/gems/1.8/gems/bcat-0.6.2/bin/btee
Run Code Online (Sandbox Code Playgroud)

...一个选项卡将再次打开,但 Firefox 将继续显示加载图标(并且显然会在系统日志更新时更新页面)。

bcat主页还引用了uzbl浏览器,它可以明显处理标准输入-但它自己的命令(或许应该看看这个多,虽然)


编辑:因为我非常需要这样的东西(主要是为了查看带有动态生成的数据的 HTML 表格(我的 Firefox 变得非常慢,无法使用bcat),所以我尝试使用自定义解决方案。自从我使用ReText以来,我已经有了python-qt4在我的 Ubuntu 上安装和 WebKit 绑定(和依赖项)。所以,我把一个 Python/PyQt4/QWebKit 脚本放在一起 - 它的工作原理类似于bcat(不像btee),但有自己的浏览器窗口 - 称为Qt4WebKit_singleinst_stdin.py(或qwksisi简称):

基本上,使用下载的脚本(和依赖项),您可以在bash终端中为它设置别名,如下所示:

$ alias qwksisi="python /path/to/Qt4WebKit_singleinst_stdin.py"
Run Code Online (Sandbox Code Playgroud)

...并在一个终端中(在别名之后),qwksisi将提升主浏览器窗口;而在另一个终端中(再次在别名之后),可以执行以下操作来获取 stdin 数据:

$ echo "<h1>Hello World</h1>" | qwksisi - 
Run Code Online (Sandbox Code Playgroud)

... 如下所示:

夸克西西

不要忘记-在末尾引用标准输入;否则本地文件名也可以用作最后一个参数。

基本上,这里的问题是要解决:

  • 单实例问题(因此脚本的第一次运行成为“主”并引发浏览器窗口 - 而后续运行只是将数据传递给主并退出)
  • 共享变量的进程间通信(因此退出进程可以将数据传递到主浏览器窗口)
  • master 中的计时器更新检查新内容,并在新内容到达时更新浏览器窗口。

因此,可以在 Perl 中使用 Gtk 绑定和 WebKit(或其他浏览器组件)实现相同的功能。不过,我想知道是否可以使用 Mozilla 的 XUL 框架来实现相同的功能——我猜在那种情况下,可以使用 Firefox 浏览器组件。


sr_*_*sr_ 5

看看搜索“浏览器标准输入”的结果!,一个不错的小shell脚本:

#!/bin/sh

# read from stdin, write to a temp file, open the temp file in a browser, then delete it
tmpfile=$(tempfile); cat > $tmpfile; x-www-browser $tmpfile; rm $tmpfile
Run Code Online (Sandbox Code Playgroud)

如果你把它保存在stdin2www,使其可执行(chmod +x stdin2www),你的例子应该通过工作cat index.html | ./stdin2www。请注意,相对链接、图像等将失败,因为要打开的页面是一些东西/tmp/;需要做更多的工作来解决这个问题。