Làm thế nào để làm cho firefox đọc stdin


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

Các lệnh này không hoạt động.
Nếu firefox có thể đọc stdin, tôi có thể gửi html đến firefox qua đường ống.
Có thể làm cho firefox đọc stdin?


2
Chính xác những gì bạn muốn thực hiện?
pbm

6
@pbm: Có thể hữu ích để tránh lưu trữ dữ liệu tạm thời ...
l0b0

Câu trả lời:


23

Câu trả lời ngắn gọn là, tốt hơn hết bạn nên viết một tập tin tạm thời và mở nó ra. Làm cho các đường ống hoạt động đúng là phức tạp hơn và có lẽ sẽ không cung cấp cho bạn bất kỳ lợi thế nào nữa. Điều đó nói rằng, đây là những gì tôi đã tìm thấy.

Nếu firefoxlệnh của bạn thực sự bắt đầu Firefox thay vì nói chuyện với một phiên bản Firefox đã chạy, bạn có thể thực hiện việc này:

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

Điều này cho Firefox biết rõ ràng để đọc đầu vào tiêu chuẩn của nó, đó là nơi đường ống đưa dữ liệu của nó. Nhưng nếu Firefox đã chạy, firefoxlệnh sẽ chuyển tên đó sang quy trình Firefox chính, nó sẽ đọc đầu vào tiêu chuẩn của chính nó , có thể sẽ không cung cấp cho nó bất cứ điều gì và chắc chắn không được kết nối với đường ống của bạn.

Hơn nữa, khi đọc từ một đường ống, Firefox đệm rất nhiều thứ, vì vậy nó sẽ không cập nhật trang mỗi khi bạn cung cấp cho nó một dòng HTML mới, nếu đó là những gì bạn đang làm. Hãy thử đóng Firefox và chạy:

cat | firefox /dev/fd/0

(NB bạn thực sự cần catở đây.) Dán một số dòng dài vào cửa sổ shell của bạn cho đến khi Firefox quyết định cập nhật trang và bạn có thể thấy nó mất bao nhiêu dữ liệu. Bây giờ hãy gửi tín hiệu End-Of-File bằng cách nhấn Ctrl+Dvào một dòng mới và xem cập nhật Firefox ngay lập tức. Nhưng sau đó bạn không thể thêm bất kỳ dữ liệu nào.

Vì vậy, tốt nhất có lẽ là:

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

2
Bạn có thể buộc firefox mở một quy trình mới -new-instance, để nó trở thành ... | firefox -new-instance /dev/fd/0.
hung hăng

Điều này làm việc tuyệt vời, cảm ơn! thay vào đó, có ai biết cách làm điều này với Chrome không?
Alexander Mills

33

Bạn có thể sử dụng URI dữ liệu , như thế này:

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

&0là bộ mô tả tệp cho stdin, vì vậy nó mã hóa stdin thành base64, sau đó nội suy nó vào URI dữ liệu.

Thủ thuật tương tự cũng hoạt động cho các trình duyệt khác:

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

Nếu bạn muốn, bạn có thể đặt phần thứ hai vào tập lệnh bash (tôi sẽ gọi nó pipefox.sh):

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

Bây giờ bạn có thể làm:

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

1
hoàn toàn tuyệt vời! Làm thế quái nào bạn nghĩ ra điều này?. Bạn có thể cải thiện việc đổi tên pipefox.sh thành pipebrowser với ngữ cảnh: $ 1 "dữ liệu: text / html; base64, $ (base64 -w 0 <& 0)" cho phép chọn trình duyệt theo ý thích của bạn
albfan

Tôi có một câu hỏi tương tự ở đây nếu nó có cùng một sự khác biệt, stackoverflow.com/questions/32303025/iêu
1,21 gigawatt

2
Thật không may, điều này không còn hiệu quả nữa, hãy xem blog.mozilla.org/security/2017/11/27/ Khăn để biết lý do tại sao hầu hết các mô phỏng trong các url dữ liệu hiện bị chặn khỏi điều hướng toplevel.
TheDiveO

7

Tôi đã tìm thấy cái này:

bcat - đường dẫn đến tiện ích trình duyệt

... Để cài đặt trên Ubuntu Natty, tôi đã làm:

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

Tôi nghĩ rằng nó hoạt động với trình duyệt riêng của mình - nhưng việc chạy ở trên đã mở một tab mới trong Firefox đã chạy, chỉ vào một địa chỉ localhost http://127.0.0.1:53718/btest... Với bcatcài đặt, bạn cũng có thể làm:

tail -f /var/log/syslog | ruby -rubygems /var/lib/gems/1.8/gems/bcat-0.6.2/bin/btee

... Một tab sẽ mở lại, nhưng Firefox sẽ tiếp tục hiển thị biểu tượng tải (và dường như sẽ cập nhật trang khi cập nhật nhật ký hệ thống).

Các bcattrang web cũng tham chiếu Uzbl trình duyệt, mà dường như có thể xử lý stdin - nhưng đối với các lệnh riêng của mình (có lẽ nên nhìn vào điều này hơn, mặc dù)


EDIT: Vì tôi rất cần một thứ như thế này (chủ yếu là để xem các bảng HTML với dữ liệu được tạo nhanh chóng (và Firefox của tôi đang trở nên rất hữu ích với bcat), tôi đã thử với một giải pháp tùy chỉnh. Vì tôi đã sử dụng ReText , tôi đã có đã cài đặt python-qt4và liên kết WebKit (và phụ thuộc) trên Ubuntu của tôi. Vì vậy, tôi kết hợp một tập lệnh Python / PyQt4 / QWebKit - hoạt động như bcat(không thích btee), nhưng với cửa sổ trình duyệt riêng - được gọi là Qt4WebKit_singleinst_stdin.py(hoặc gọi tắt là qwksisi):

Về cơ bản, với tập lệnh được tải xuống (và phụ thuộc), bạn có thể đặt bí danh cho nó trong một bashthiết bị đầu cuối như thế này:

$ alias qwksisi="python /path/to/Qt4WebKit_singleinst_stdin.py"

... và trong một thiết bị đầu cuối (sau khi răng cưa), qwksisisẽ nâng cửa sổ trình duyệt chính; trong khi ở một thiết bị đầu cuối khác (một lần nữa sau khi răng cưa), người ta có thể làm như sau để có được dữ liệu stdin:

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

... như hình dưới đây:

qwksisi

Đừng quên -cuối cùng để đề cập đến stdin; mặt khác, tên tệp cục bộ cũng có thể được sử dụng làm đối số cuối cùng.

Về cơ bản, vấn đề ở đây là giải quyết:

  • vấn đề đơn lẻ (vì vậy lần chạy tập lệnh đầu tiên trở thành "chính" và tăng cửa sổ trình duyệt - trong khi các lần chạy tiếp theo chỉ đơn giản là truyền dữ liệu cho chủ và thoát)
  • giao tiếp giữa các quá trình để chia sẻ các biến (vì vậy các quá trình thoát có thể truyền dữ liệu đến cửa sổ trình duyệt chính)
  • Cập nhật hẹn giờ trong bản chính kiểm tra nội dung mới và cập nhật cửa sổ trình duyệt nếu nội dung mới đến.

Như vậy, điều tương tự có thể được thực hiện trong, giả sử, Perl với các ràng buộc Gtk và WebKit (hoặc thành phần trình duyệt khác). Tuy nhiên, tôi tự hỏi, nếu khung XUL của Mozilla có thể được sử dụng để thực hiện chức năng tương tự - tôi đoán trong trường hợp đó, người ta sẽ làm việc với thành phần trình duyệt Firefox.


6

Bạn có thể sử dụng thay thế quá trình :

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

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

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

1
Không thể làm cho những thứ này hoạt động với Ubuntu 14.04 bằng bash và Firefox 29.0
John S Gruber

5

Hãy nhìn những gì đang tìm kiếm 'stdin' trình duyệt! , một kịch bản shell nhỏ đẹp:

#!/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

Nếu bạn lưu cái này vào stdin2www, làm cho nó có thể thực thi được ( chmod +x stdin2www), các ví dụ của bạn sẽ hoạt động thông qua cat index.html | ./stdin2www. Chỉ cần lưu ý rằng các liên kết tương đối , hình ảnh, vv, sẽ thất bại vì trang sẽ được mở là một cái gì đó /tmp/; cần nhiều công việc hơn để khắc phục điều này.


3

Tôi đã viết một kịch bản python để viết stdin vào một tệp tạm thời và sau đó mở tệp tạm thời bằng 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

Bạn có thể chạy lệnh dưới đây từ cửa sổ shell / terminal.

Trước khi khởi chạy Firefox (hoặc bất kỳ trình duyệt nào khác), nó sẽ đọc từ nội dung đó để hiển thị khi mở.

Nếu nó không được gửi HTML, hãy thay đổi text/htmlchuỗi trong URL bên dưới thành bất kỳ loại tệp nào (ví dụ: text/plainhoặc image/png).

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

0

Một ffpipebí danh đơn giản .

Các giải pháp URI dữ liệu được cung cấp bởi snowball và luk3yx không hoạt động với tôi trên GNU / Linux.

Các bí danh sau sẽ hoạt động:

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

ví dụ.

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

Hạn chế

Trang sẽ chỉ tải sau khi đường ống được đóng lại (tức là đã kết thúc tập tin).

Nếu việc hiển thị gia tăng nội dung được yêu cầu, bạn nên sử dụng một cái gì đó giống như bcattiện ích được đề cập trước đó .


0

Mặc dù câu hỏi này đã bảy tuổi nhưng tôi ngạc nhiên rằng không ai đề xuất giải pháp phục vụ tệp thông qua máy chủ web. Điều này đạt được với tập lệnh Python3 nhỏ gọn sau đây. Lưu nó dưới dạng một tập tin thực thi, giả sử, duyệt:

#!/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()

Sau đó, bạn có thể chuyển hướng đầu vào tiêu chuẩn sang trình duyệt mặc định:

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

Theo mặc định, máy chủ hoạt động trên cổng 8000, nhưng hành vi đó có thể được thay đổi bằng đối số dòng lệnh:

./browser.py 9000 < website.html

Tôi đã thử nghiệm kịch bản này trên Linux. Nó sẽ xử lý các hệ thống UNIX khác bao gồm cả MacOS. Về nguyên tắc, nó thậm chí đã được chuẩn bị cho Windows (tôi không có bản nào để thử nghiệm), nhưng có thể cần phải thực hiện chức năng hết thời gian khác nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.