cara membuat firefox baca stdin

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

Perintah-perintah ini tidak berfungsi.
Jika firefox dapat membaca stdin, saya dapat mengirim html ke firefox melalui pipa.
Apakah mungkin membuat firefox read stdin?

kev
sumber
2
Apa yang sebenarnya ingin Anda capai?
pbm
6
@ pbm: Mungkin berguna untuk menghindari penyimpanan data sementara ...
l0b0

Jawaban:

23

Jawaban singkatnya adalah, Anda lebih baik menulis file sementara dan membukanya. Membuat pipa berfungsi dengan baik lebih rumit dan mungkin tidak akan memberi Anda keuntungan tambahan. Yang mengatakan, inilah yang saya temukan.

Jika firefoxperintah Anda sebenarnya memulai Firefox alih-alih berbicara dengan instance Firefox yang sudah berjalan, Anda dapat melakukan ini:

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

Yang memberitahu Firefox secara eksplisit untuk membaca input standarnya, yang merupakan tempat pipa meletakkan datanya. Tetapi jika Firefox sudah berjalan, firefoxperintah itu hanya akan meneruskan nama itu ke proses Firefox utama, yang akan membaca input standar sendiri , yang mungkin tidak akan memberikan apa pun dan tentu saja tidak terhubung ke pipa Anda.

Selain itu, ketika membaca dari sebuah pipa, Firefox sangat mendukung hal-hal, jadi itu tidak akan memperbarui halaman setiap kali Anda memberikan baris baru HTML, jika itu yang Anda inginkan. Coba tutup Firefox dan jalankan:

cat | firefox /dev/fd/0

(NB Anda benar-benar membutuhkannya di catsini.) Tempelkan beberapa baris panjang ke jendela shell Anda berulang kali hingga Firefox memutuskan untuk memperbarui halaman, dan Anda dapat melihat berapa banyak data yang dibutuhkan. Sekarang kirim sinyal End-Of-File dengan menekan Ctrl+Dpada baris baru, dan saksikan pembaruan Firefox secara instan. Tetapi Anda tidak dapat menambahkan data lagi.

Jadi yang terbaik mungkin:

echo '<h1>hello, world</h1>' >my_temporary_file; firefox my_temporary_file
Jander
sumber
2
Anda dapat memaksa firefox untuk membuka proses baru dengan -new-instance, jadi itu ... | firefox -new-instance /dev/fd/0.
rampion
ini bekerja dengan baik, terima kasih! Adakah yang tahu bagaimana melakukan ini dengan Chrome?
Alexander Mills
33

Anda dapat menggunakan URI data , seperti ini:

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

&0adalah deskriptor file untuk stdin, sehingga menyandikan stdin ke base64, lalu menginterpolasi itu ke dalam data URI.

Trik yang sama juga berfungsi untuk browser lain:

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

Jika mau, Anda bisa meletakkan bagian kedua dalam skrip bash (saya akan menyebutnya pipefox.sh):

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

Sekarang Anda bisa melakukannya:

echo '<h1>hello, world</h1>' |pipefox.sh
Semakin bertambah
sumber
1
benar-benar dahsyat !, bagaimana kamu bisa melakukan ini? Anda dapat meningkatkan penamaan pipefox.sh ke pipebrowser dengan konteks: $ 1 "data: teks / html; base64, $ (base64 -w 0 <& 0)" memungkinkan untuk memilih browser yang Anda sukai
albfan
Saya punya pertanyaan serupa di sini jika perbedaannya sama, stackoverflow.com/questions/32303025/...
1.21 gigawatts
2
Sayangnya ini tidak berfungsi lagi, lihat blog.mozilla.org/security/2017/11/27/… untuk alasan mengapa sebagian besar mimetipe dalam url data sekarang diblokir dari navigasi tingkat atas.
TheDiveO
7

Aku menemukan ini:

bcat - pipe to utility browser

... untuk menginstal di Ubuntu Natty, saya lakukan:

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

Saya pikir itu bekerja dengan browser sendiri - tetapi menjalankan di atas membuka tab baru di Firefox yang sudah berjalan, menunjuk ke alamat localhost http://127.0.0.1:53718/btest... Dengan bcatinstalasi Anda juga dapat melakukan:

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

... sebuah tab lagi akan terbuka, tetapi Firefox akan tetap menampilkan ikon pemuatan (dan tampaknya akan memperbarui halaman ketika syslog memperbarui).

The bcathomepage juga referensi uzbl browser, yang tampaknya dapat menangani stdin - tetapi untuk perintah sendiri (mungkin harus melihat ke dalam ini lebih, meskipun)


EDIT: Karena saya sangat membutuhkan sesuatu seperti ini (kebanyakan untuk melihat tabel HTML dengan data yang dihasilkan dengan cepat (dan Firefox saya menjadi sangat lambat untuk berguna bcat), saya mencoba dengan solusi khusus. Karena saya menggunakan ReText , saya sudah memiliki python-qt4binding yang terinstal dan WebKit (dan dependensi) pada Ubuntu saya. Jadi, saya mengumpulkan skrip Python / PyQt4 / QWebKit - yang bekerja seperti bcat(tidak suka btee), tetapi dengan jendela browser sendiri - disebut Qt4WebKit_singleinst_stdin.py(atau qwksisisingkatnya):

Pada dasarnya, dengan skrip yang diunduh (dan dependensi) Anda dapat alias di bashterminal seperti ini:

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

... dan dalam satu terminal (setelah aliasing), qwksisiakan menaikkan jendela browser utama; sementara di terminal lain (lagi setelah aliasing), orang bisa melakukan hal berikut untuk mendapatkan data stdin:

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

... seperti yang ditunjukkan di bawah ini:

qwksisi

Jangan lupa bagian -akhir untuk merujuk ke stdin; jika tidak, nama file lokal juga dapat digunakan sebagai argumen terakhir.

Pada dasarnya, masalah di sini adalah untuk menyelesaikan:

  • masalah instance tunggal (jadi jalankan skrip pertama menjadi "master" dan memunculkan jendela browser - sementara menjalankan selanjutnya hanya meneruskan data ke master dan keluar)
  • komunikasi antarproses untuk berbagi variabel (sehingga proses yang keluar dapat meneruskan data ke jendela browser utama)
  • Pembaruan timer di master yang memeriksa konten baru, dan memperbarui jendela browser jika konten baru tiba.

Dengan demikian, hal yang sama dapat diimplementasikan dalam, katakanlah, Perl dengan binding Gtk dan WebKit (atau komponen browser lainnya). Saya bertanya-tanya, apakah kerangka kerja XUL oleh Mozilla dapat digunakan untuk mengimplementasikan fungsi yang sama - saya kira dalam kasus itu, orang akan bekerja dengan komponen browser Firefox.

sdaau
sumber
6

Anda dapat menggunakan substitusi proses :

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

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

 firefox  <( echo "<h1>Hello number "{1..23}"!</h1>" )
rozcietrzewiacz
sumber
1
Tidak dapat menjalankan ini dengan Ubuntu 14.04 menggunakan bash dan Firefox 29.0
John S Gruber
5

Lihat apa yang mencari 'browser stdin' muncul! , skrip shell kecil yang bagus:

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

Jika Anda menyimpan ini di stdin2www, membuatnya bisa dieksekusi ( chmod +x stdin2www), contoh Anda harus bekerja melalui cat index.html | ./stdin2www. Harap perhatikan bahwa tautan relatif , gambar, dll, akan gagal karena halaman yang akan dibuka adalah sesuatu /tmp/; lebih banyak pekerjaan akan diperlukan untuk memperbaikinya.

sr_
sumber
3

Saya menulis skrip python untuk menulis stdin ke file sementara dan kemudian membuka file sementara dengan 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()
Tom
sumber
0

Anda dapat menjalankan perintah di bawah ini dari skrip shell / jendela terminal.

Sebelum meluncurkan Firefox (atau peramban lain), ia akan membaca dari konten yang akan ditampilkan saat dibuka.

Jika bukan HTML yang dikirim, ubah text/htmlstring di URL di bawah ini menjadi jenis file apa pun (misalnya, text/plainatau image/png).

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

ffpipeAlias sederhana .

Solusi data URI yang diberikan oleh bola salju dan luk3yx tidak berfungsi untuk saya di GNU / Linux.

Alias ​​berikut harus berfungsi:

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

misalnya.

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

Keterbatasan

Halaman hanya akan memuat setelah pipa ditutup (mis. Akhir file telah tercapai).

Jika rendering tambahan dari konten yang disaring diperlukan, Anda lebih baik menggunakan sesuatu seperti bcatutilitas yang disebutkan sebelumnya .

pyrocrasty
sumber
0

Meskipun pertanyaan ini berumur tujuh tahun, saya terkejut bahwa tidak ada yang mengusulkan solusi untuk melayani file melalui server web. Ini dicapai dengan skrip Python3 kompak berikut. Simpan sebagai file yang dapat dieksekusi, misalnya, 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()

Kemudian Anda dapat mengarahkan input standar ke browser default:

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

Secara default server beroperasi pada port 8000, tetapi perilaku itu dapat diubah dengan argumen baris perintah:

./browser.py 9000 < website.html

Saya menguji skrip ini di Linux. Itu harus menangani sistem UNIX lain termasuk MacOS di luar kotak. Ini pada prinsipnya bahkan disiapkan untuk Windows (saya tidak punya satu untuk pengujian), tetapi di sana mungkin perlu untuk menerapkan fungsi batas waktu secara berbeda.

tglas
sumber