firefox stdin okumak nasıl


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

Bu komutlar çalışmıyor.
Eğer firefox stdin okuyabilirse, firefox'a pipe aracılığıyla html gönderebilirim.
Firefox'un stdin okumasını sağlamak mümkün müdür?


2
Tam olarak ne yapmak istiyorsun?
pbm

6
@pbm: Geçici veriyi saklamaktan kaçınmak faydalı olabilir ...
l0b0

Yanıtlar:


23

Kısa cevap, geçici bir dosya yazmaktan ve onu açmaktan daha iyi olmanız. Boruların düzgün çalışmasını sağlamak daha karmaşıktır ve muhtemelen size ekstra bir avantaj sağlamaz. Bu dedi, işte bulduklarım.

Senin Eğer firefoxkomut aslında yerine halihazırda çalışan Firefox örneği ile konuşurken Firefox başlıyor, bunu yapabilirsiniz:

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

Hangi Firefox'a borunun verilerini koyduğu standart girişini açıkça okumasını söyler. Ancak eğer Firefox zaten çalışıyorsa, firefoxkomut sadece bu ismi , kendi standart girişini okuyacak olan , muhtemelen hiçbir şey vermeyecek ve kesinlikle borunuza bağlı olmayacak olan ana Firefox işlemine aktaracaktır .

Üstelik, bir borudan okurken, Firefox işleri oldukça yoğun bir şekilde tamponlar, bu yüzden ne yapacaksanız, yeni bir HTML satırı verdiğinizde sayfayı güncellemeyecektir. Firefox'u kapatıp çalıştırmayı deneyin:

cat | firefox /dev/fd/0

(NB aslında catburaya ihtiyacınız var.) Firefox, sayfayı güncellemeye karar verinceye kadar kabuk pencerenize birkaç uzun satır tekrar tekrar yapıştırın ve ne kadar veri aldığını görebilirsiniz. Şimdi Ctrl+Dyeni bir satıra tıklayarak Dosya Sonu sinyalini gönderin ve Firefox güncellemesini anında izleyin. Ancak, daha fazla veri ekleyemezsiniz.

Yani en iyisi muhtemelen:

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

2
Firefox'u yeni bir işlem başlatması için zorlayabilirsiniz -new-instance, böylece olur ... | firefox -new-instance /dev/fd/0.
rampiyon

Bu harika çalışıyor, teşekkürler! kimse bunun yerine Chrome ile nasıl yapılacağını biliyor?
Alexander Mills,

33

Aşağıdaki gibi veri URI'lerini kullanabilirsiniz :

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

&0stdin için dosya tanımlayıcısıdır, bu nedenle stdin'i kodlar base64, sonra bunu veri URI'sine enterpolasyon eder.

Aynı numara diğer tarayıcılar için de geçerlidir:

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

İsterseniz ikinci kısmı bir bash betiğine koyabilirsiniz (Ben çağıracağım pipefox.sh):

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

Şimdi yapabilirsin:

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

1
Tamamen harika !, Buna nasıl başladın? Pipfox’u pipebrowser olarak yeniden adlandırmak bağlamında: $ 1 "data: text / html; base64, $ (base64 -w 0 <& 0)" istediğiniz tarayıcıyı seçmenize izin verebilir
albfan

Burada da aynı fark varsa benzer bir sorum var, stackoverflow.com/questions/32303025/…
1.21 gigawatts

2
Bu ne yazık ki artık işe yaramıyor , neden veri url'lerinde çoğu taklitçinin artık üst düzey gezinmeden engellendiği hakkında bilgi için blog.mozilla.org/security/2017/11/27/… .
TheDiveO

7

Bunu buldum:

bcat - pipo tarayıcı programına

... Ubuntu Natty'ye kurmak için şunu yaptı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

Kendi tarayıcısıyla çalıştığını düşünmüştüm - ancak yukarıdakileri çalıştırmak, çalışan bir Firefox'ta yerel bir adrese işaret eden yeni bir sekme açtı http://127.0.0.1:53718/btest... bcatYüklemeyle şunları da yapabilirsiniz:

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

... bir sekme tekrar açılacak, ancak Firefox yükleme simgesini göstermeye devam edecek (ve syslog güncellendiğinde görünen sayfa güncellenecektir).

Ana bcatsayfa ayrıca , görünüşe göre stdin'i işleyebilen uzbl tarayıcıya da atıfta bulunuyor - ancak kendi komutları için (buna muhtemelen daha fazla bakmalı)


DÜZENLEME: As I (anında oluşturulan veriler ile kötü (çoğunlukla görünüm HTML tabloları böyle bir şey gerekli ve benim Firefox ile yararlı olması gerçekten yavaş oluyor bcat), bir özel çözümü ile çalıştı kullandığım beri. ReText , ben zaten vardı python-qt4Ubuntu'ma yükledim ve WebKit bağlamaları (ve bağımlılıkları) Bu yüzden, bir Python / PyQt4 / QWebKit betiği oluşturdum bcat(ki gibi btee), ancak kendi tarayıcı penceresiyle Qt4WebKit_singleinst_stdin.py(ya da qwksisikısaca):

Temel olarak, indirilen komut dosyasıyla (ve bağımlılıklarla) aşağıdaki bashgibi bir terminale takma ad verebilirsiniz :

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

... ve bir terminalde (takma işlemden sonra), qwksisiana tarayıcı penceresini yükseltir; başka bir terminalde (yeniden takma işleminden sonra), stdin verisini elde etmek için aşağıdakileri yapabilirsiniz:

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

... Aşağıda gösterildiği gibi:

qwksisi

-Sonunda stdin'e atıfta bulunmayı unutmayın ; Aksi takdirde, yerel bir dosya adı da son argüman olarak kullanılabilir.

Temel olarak, buradaki sorun çözmektir:

  • tek örnekli sorun (bu nedenle ilk komut dosyası çalıştırma işlemi "usta" olur ve tarayıcı penceresini yükseltir - sonraki çalıştırmalar yalnızca usta ve çıkışa veri iletir)
  • değişkenleri paylaşmak için süreçler arası iletişim (bu nedenle çıkış işlemleri ana tarayıcı penceresine veri aktarabilir)
  • Yeni içeriği kontrol eden ana birimdeki Timer güncellemesi ve yeni içerik geldiğinde tarayıcı penceresini günceller.

Bu nedenle, aynısı, örneğin Gtk bağlantıları ve WebKit (veya diğer tarayıcı bileşenlerinde) ile Perl'de uygulanabilir. Acaba, Mozilla'nın XUL çerçevesi aynı işlevselliği uygulamak için kullanılabilirse, sanırım bu durumda biri Firefox tarayıcı bileşeniyle çalışacak.


6

İşlem değiştirmeyi kullanabilirsiniz :

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

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

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

1
Bunların bash ve Firefox 29.0 kullanarak Ubuntu 14.04 ile çalışmasını sağlayamıyorum 29.0
John S Gruber

5

'Tarayıcı stdin' için ne aradığına bak! , güzel bir küçük kabuk betiği:

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

Bu in tasarrufu ise stdin2www, (çalıştırılabilir hale chmod +x stdin2www), sizin örnekler aracılığıyla çalışması gerekir cat index.html | ./stdin2www. Göreceğiniz bağlantıların , resimlerin vb. Açılacağı sayfa bir şey olduğu için başarısız olacağını unutmayın /tmp/; Bunu düzeltmek için daha fazla çalışmaya ihtiyaç var.


3

Stdin'i geçici bir dosyaya yazmak için bir python betiği yazdım ve ardından geçici dosyayı Firefox ile açtım.

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

Aşağıdaki komutu bir kabuk betiği / terminal penceresinden çalıştırabilirsiniz.

Firefox'u (veya başka bir tarayıcıyı) başlatmadan önce, açılışta görüntülenecek içeriği stdin'den okuyacaktır.

HTML gönderilmiyorsa, text/htmlaşağıdaki URL'deki dizeyi dosya türünden bağımsız olarak değiştirin (örneğin text/plainveya image/png).

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

0

Basit bir ffpipetakma ad.

Kartopu ve luk3yx tarafından verilen veri URI çözümleri benim için GNU / Linux'ta çalışmıyor.

Aşağıdaki takma ad çalışmalıdır:

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

Örneğin.

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

Sınırlamalar

Sayfa sadece boru kapatıldıktan sonra yüklenecektir (örn. Dosya sonuna ulaşıldı).

Borulu içeriğin artımlı görüntülenmesi gerekiyorsa, daha önce belirtilen bir bcatyardımcı program gibi bir şey kullanarak daha iyi .


0

Bu soru yedi yaşında olmasına rağmen, kimsenin dosyayı bir web sunucusu üzerinden sunmak için bir çözüm önermediğine şaşırdım. Bu, aşağıdaki kompakt Python3 betiği ile elde edilir. Yürütülebilir bir dosya olarak kaydedin, örneğin, 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()

Ardından standart girişi varsayılan tarayıcıya yönlendirebilirsiniz:

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

Varsayılan olarak, sunucu 8000 numaralı bağlantı noktasında çalışır, ancak bu davranış bir komut satırı argümanı ile değiştirilebilir:

./browser.py 9000 < website.html

Bu senaryoyu Linux'ta test ettim. MacOS dahil diğer UNIX sistemlerini kutudan çıkarması gerekir. Prensip olarak Windows için bile hazırlanmıştır (test için bir programım yok), ancak zaman aşımı işlevini farklı şekilde uygulamak gerekebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.