วิธีทำ firefox อ่าน stdin


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

คำสั่งเหล่านี้ไม่ทำงาน
หาก firefox สามารถอ่าน stdin ได้ฉันสามารถส่ง html ไปยัง firefox ผ่านไพพ์ได้
เป็นไปได้หรือไม่ที่จะทำให้ firefox อ่าน stdin?


2
คุณต้องการทำอะไรให้สำเร็จ
pbm

6
@pbm: อาจเป็นประโยชน์ในการหลีกเลี่ยงการจัดเก็บข้อมูลชั่วคราว ...
l0b0

คำตอบ:


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ที่นี่จริง ๆ) วางบรรทัดยาวบางส่วนลงในหน้าต่างเชลล์ของคุณซ้ำ ๆ จนกระทั่ง Firefox ตัดสินใจที่จะอัปเดตหน้าเว็บและคุณสามารถดูว่าต้องใช้ข้อมูลจำนวนเท่าใด ตอนนี้ส่งสัญญาณ End-Of-File โดยกด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
rampion

มันใช้งานได้ดีขอบคุณ! มีใครรู้วิธีการทำเช่นนี้กับ Chrome แทน?
Alexander Mills

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

หากคุณต้องการคุณสามารถใส่ส่วนที่สองในสคริปต์ทุบตี (ฉันจะเรียกมันว่า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

ฉันมีคำถามที่คล้ายกันที่นี่หากมีความแตกต่างเดียวกันstackoverflow.com/questions/32303025/ …
1.21 gigawatts

2
น่าเสียดายที่นี่ใช้งานไม่ได้อีกต่อไปดูที่blog.mozilla.org/security/2017/11/27/…เพราะเหตุใด mimetypes ส่วนใหญ่ใน 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 ที่ใช้งานอยู่ชี้ไปที่ที่อยู่ localhost 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และการผูก WebKit (และการขึ้นต่อกัน) บน Ubuntu ของฉันดังนั้นฉันจึงรวบรวมสคริปต์ Python / PyQt4 / QWebKit - ซึ่งทำงานเหมือนbcat(ไม่ชอบbtee) แต่มีหน้าต่างเบราว์เซอร์ของตัวเอง - เรียกQt4WebKit_singleinst_stdin.py(หรือqwksisiสั้น ๆ ):

โดยพื้นฐานแล้วด้วยสคริปต์ที่ดาวน์โหลด (และการอ้างอิง) คุณสามารถใช้นามแฝงในbashเทอร์มินัลดังนี้:

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

... และในเทอร์มินัลเดียว (หลัง aliasing) qwksisiจะเพิ่มหน้าต่างเบราว์เซอร์หลัก ขณะอยู่ในเทอร์มินัลอื่น (อีกครั้งหลังจากนามแฝง) เราสามารถทำสิ่งต่อไปนี้เพื่อรับข้อมูล stdin:

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

... ดังแสดงด้านล่าง:

qwksisi

อย่าลืม-ที่จะอ้างอิงถึง stdin; มิฉะนั้นชื่อไฟล์ท้องถิ่นสามารถใช้เป็นอาร์กิวเมนต์สุดท้ายได้เช่นกัน

โดยทั่วไปปัญหาที่นี่คือการแก้ปัญหา:

  • ปัญหาอินสแตนซ์เดียว (ดังนั้นการเรียกใช้สคริปต์ครั้งแรกจึงกลายเป็น "ต้นแบบ" และยกระดับหน้าต่างเบราว์เซอร์ - ในขณะที่การเรียกใช้ในภายหลังจะส่งผ่านข้อมูลไปยังต้นแบบและออก)
  • การสื่อสารระหว่างกระบวนการสำหรับการแชร์ตัวแปร (ดังนั้นการออกจากกระบวนการสามารถส่งผ่านข้อมูลไปยังหน้าต่างเบราว์เซอร์หลัก)
  • อัปเดตตัวจับเวลาในต้นแบบที่ตรวจสอบเนื้อหาใหม่และอัปเดตหน้าต่างเบราว์เซอร์หากมีเนื้อหาใหม่เข้ามา

เช่นเดียวกันสามารถนำมาใช้ในการพูด Perl กับ Gtk ผูกและ WebKit (หรือส่วนประกอบเบราว์เซอร์อื่น ๆ ) ฉันสงสัยว่าถ้าหากเฟรมเวิร์ก XUL ของ Mozilla สามารถใช้ในการใช้งานฟังก์ชั่นเดียวกันได้ - ฉันเดาว่าในกรณีนี้จะใช้กับเบราว์เซอร์ Firefox แทน



5

ดูสิ่งที่ค้นหา 'เบราว์เซอร์ stdin' ปรากฏขึ้น! เป็นเชลล์สคริปต์ที่ดีเล็กน้อย:

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

ฉันเขียนสคริปต์ไพ ธ อนเพื่อเขียน 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

คุณสามารถเรียกใช้คำสั่งด้านล่างจากหน้าต่างเชลล์สคริปต์ / เทอร์มินัล

ก่อนที่จะเปิด Firefox (หรือเบราว์เซอร์อื่น ๆ ) มันจะอ่านจาก stdin เนื้อหาที่จะแสดงเมื่อเปิด

หากไม่มีการส่ง HTML ให้เปลี่ยนtext/htmlสตริงใน URL ด้านล่างเป็นประเภทไฟล์ (เช่นtext/plainหรือimage/png)

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

0

ffpipeนามแฝงง่ายๆ

โซลูชัน URI ข้อมูลที่ให้โดยก้อนหิมะและ luk3yx ไม่ทำงานสำหรับฉันบน GNU / Linux

นามแฝงต่อไปนี้ควรใช้งานได้:

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

เช่น.

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

ข้อ จำกัด

หน้าจะโหลดก็ต่อเมื่อปิดท่อไปแล้ว (เช่นถึงจุดสิ้นสุดไฟล์แล้ว)

หากจำเป็นต้องมีการเรนเดอร์แบบเนื้อหาส่วนเพิ่มคุณควรใช้บางอย่างเช่นbcatยูทิลิตีที่กล่าวถึงก่อนหน้านี้


0

แม้ว่าคำถามนี้อายุเจ็ดปีฉันประหลาดใจที่ไม่มีใครเสนอวิธีแก้ปัญหาการให้บริการไฟล์ผ่านเว็บเซิร์ฟเวอร์ สามารถทำได้ด้วยสคริปต์ Python3 ขนาดกะทัดรัดต่อไปนี้ บันทึกเป็นไฟล์เรียกทำงานพูดท่องเว็บ:

#!/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 (ฉันไม่ได้มีหนึ่งสำหรับการทดสอบ) แต่อาจจำเป็นต้องใช้ฟังก์ชั่นการหมดเวลาที่แตกต่างกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.