如何使Firefox阅读标准输入


29
echo '<h1>hello, world</h1>' |  firefox
cat index.html | firefox

这些命令不起作用。
如果firefox可以读取stdin,则可以通过管道将html发送到firefox。
有可能使Firefox读取标准输入?


2
您到底想完成什么?
2011年

6
@pbm:避免存储临时数据可能会很有用...
l0b0'2

Answers:


23

简短的答案是,最好写一个临时文件并打开它。使管道正常工作更加复杂,可能不会给您带来任何额外的优势。也就是说,这就是我所发现的。

如果您的firefox命令实际上是在启动Firefox而不是与已经在运行的Firefox实例通信,则可以执行以下操作:

echo '<h1>hello, world</h1>' | firefox /dev/fd/0

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

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

cat | firefox /dev/fd/0

(注意,您实际上确实需要cat这里。)重复将一些长行粘贴到您的Shell窗口中,直到Firefox决定更新页面为止,您可以看到它需要多少数据。现在,通过Ctrl+D换行发送“文件结束”信号,并立即查看Firefox更新。但是,您再也无法添加任何数据。

所以最好的可能是:

echo '<h1>hello, world</h1>' >my_temporary_file; firefox my_temporary_file

2
您可以强制使用Firefox打开一个新进程-new-instance,这样就变成了... | firefox -new-instance /dev/fd/0
风铃草

这很好,谢谢!有人知道如何使用Chrome来做到这一点吗?
亚历山大·米尔斯

33

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

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

&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)"

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

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

现在您可以执行以下操作:

echo '<h1>hello, world</h1>' |pipefox.sh

1
太棒了!,您是怎么想到这个的?您可以改善pipefox.sh重命名为pipebrowser的上下文:$ 1“ data:text / html; base64,$(base64 -w 0 <&0)”允许选择您喜欢的浏览器
albfan 2014年

如果有相同的区别,我在这里也有类似的问题,stackoverflow.com
1.21吉瓦

2
不幸的是,这不再起作用了,请参阅blog.mozilla.org/security/2017/11/27/…,以了解为什么数据url中的大多数模仿类型现在都被顶级导航阻止了。
TheDiveO

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

我认为它可以与自己的浏览器一起使用-但运行上述命令后,在已经运行的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

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

bcat首页还引用了uzbl浏览器,该浏览器显然可以处理stdin-但针对其自己的命令(不过,应该对此进行更多研究)


编辑:由于我急需这样的东西(主要是使用动态生成的数据查看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"

...并在一个终端(别名后)中,qwksisi将显示主浏览器窗口;而在另一个终端中(还是在别名之后),可以执行以下操作来获取标准输入数据:

$ echo "<h1>Hello World</h1>" | qwksisi - 

... 如下所示:

qwksisi

不要忘了-在结尾引用stdin。否则,本地文件名也可以用作最后一个参数。

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

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

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


6

您可以使用流程替换

 firefox <( echo '<h1>hello, world</h1>' )

 firefox <( cat page_header.html contents.html footer.html )

 firefox  <( echo "<h1>Hello number "{1..23}"!</h1>" )

1
无法使用bash和Firefox 29.0将它们与Ubuntu 14.04配合使用
John S Gruber 2014年

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

如果将其保存在其中stdin2www,使其可执行(chmod +x stdin2www),则示例应通过进行工作cat index.html | ./stdin2www。只是请注意,相对的链接,图像等将失败,因为将要打开的页面是某种东西/tmp/;需要更多的工作来解决此问题。


3

我编写了一个python脚本,将stdin写入一个临时文件,然后使用Firefox打开该临时文件。

#!/usr/bin/env python
import sys
import tempfile
import subprocess

with tempfile.NamedTemporaryFile() as f:
  f.write(sys.stdin.read())
  f.flush()
  process = subprocess.Popen(['firefox', f.name])
  process.wait()

0

您可以从Shell脚本/终端窗口运行以下命令。

在启动Firefox(或任何其他浏览器)之前,它将从标准输入中读取要在打开时显示的内容。

如果不是发送HTML text/html,则将以下URL中的字符串更改为任何文件类型(例如text/plainimage/png)。

firefox "data:text/html;base64,$(base64)"

0

一个简单的ffpipe别名。

snowball和luk3yx给出的数据URI解决方案在GNU / Linux上对我不起作用。

以下别名应该起作用:

alias ffpipe='base64 -w0 <&0 | read -r x; firefox "data:text/html;base64,$x"'

例如。

echo '<h1>hello, world</h1>' | ffpipe

局限性

只有在管道关闭后(即已到达文件末尾),页面才会加载。

如果需要增量呈现管道内容,则最好使用前面提到的bcat实用工具。


0

尽管这个问题已有七年之久,但我感到惊讶的是,没有人提出通过Web服务器提供文件服务的解决方案。这是通过以下紧凑的Python3脚本实现的。将其另存为可执行文件,例如,browse.py:

#!/usr/bin/env python3
import sys, os, time, platform, signal
from subprocess import Popen
from http.server import HTTPServer, BaseHTTPRequestHandler
sys.stderr = open(os.devnull, 'w')
def timeoutHandler(signum, frame):
    sys.exit("")
signal.signal(signal.SIGALRM, timeoutHandler)
signal.alarm(2)
html = sys.stdin.read()
port = int(sys.argv[1]) if len(sys.argv) > 1 else 8000
class Handler(BaseHTTPRequestHandler):
    def _set_headers(self):
        self.send_response(200)
        self.send_header("content-type", "text/html")
        self.end_headers()
    def do_GET(self):
        self._set_headers()
        self.wfile.write(b = bytes(html, "utf-8"))
platform = platform.system().lower()
if platform.find("win") >= 0: command = "start"
elif platform.find("mac") >= 0 or platform.find("darwin") >= 0: command = "open"
else: command = "xdg-open"
p = Popen([command, "http://localhost:" + str(port) + "/"])
httpd = HTTPServer(("localhost", port), Handler)
httpd.serve_forever()

然后,您可以将标准输入重定向到默认浏览器:

./browser.py < somewebpage.html
echo "<html><body><h1>Hello</h1></body></html>" | browse.py

默认情况下,服务器在端口8000上运行,但是可以使用命令行参数更改该行为:

./browser.py 9000 < website.html

我在Linux上测试了此脚本。它应该开箱即用地处理其他UNIX系统,包括MacOS。原则上,它甚至是为Windows准备的(我没有要测试的Windows),但是可能有必要以不同的方式实现超时功能。

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.