wie man Firefox dazu bringt, stdin zu lesen


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

Diese Befehle funktionieren nicht.
Wenn Firefox stdin lesen kann, kann ich HTML per Pipe an Firefox senden.
Ist es möglich, Firefox dazu zu bringen, Standard zu lesen?


2
Was genau möchten Sie erreichen?
pbm

6
@pbm: Es kann nützlich sein, das Speichern temporärer Daten zu vermeiden ...
l0b0

Antworten:


23

Die kurze Antwort lautet: Schreiben Sie besser eine temporäre Datei und öffnen Sie diese. Das ordnungsgemäße Funktionieren von Rohren ist komplizierter und bietet wahrscheinlich keine zusätzlichen Vorteile. Das heißt, hier ist, was ich gefunden habe.

Wenn Ihr firefoxBefehl tatsächlich Firefox startet, anstatt mit einer bereits laufenden Firefox-Instanz zu kommunizieren, können Sie dies tun:

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

Wodurch Firefox ausdrücklich angewiesen wird, seine Standardeingabe zu lesen, in der die Pipe ihre Daten ablegt. Wenn Firefox bereits ausgeführt wird, übergibt der firefoxBefehl diesen Namen nur an den Hauptprozess von Firefox, der seine eigene Standardeingabe liest , die ihm wahrscheinlich nichts gibt und mit Sicherheit nicht mit Ihrer Pipe verbunden ist.

Außerdem puffert Firefox beim Lesen aus einer Pipe die Dinge ziemlich stark, sodass die Seite nicht jedes Mal aktualisiert wird, wenn Sie ihr eine neue HTML-Zeile geben, wenn Sie dies wünschen. Schließen Sie Firefox und führen Sie Folgendes aus:

cat | firefox /dev/fd/0

(Beachten Sie, dass Sie das cathier tatsächlich benötigen .) Fügen Sie einige lange Zeilen wiederholt in Ihr Shell-Fenster ein, bis Firefox beschließt, die Seite zu aktualisieren, und Sie sehen, wie viele Daten dafür benötigt werden. Senden Sie jetzt ein Dateiendesignal, indem Sie Ctrl+Dauf eine neue Zeile klicken, und beobachten Sie, wie Firefox sofort aktualisiert wird. Dann können Sie jedoch keine weiteren Daten hinzufügen.

Das Beste ist also wahrscheinlich:

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

2
Sie können Firefox zwingen, einen neuen Prozess mit zu öffnen -new-instance, so wird es ... | firefox -new-instance /dev/fd/0.
Rampion

das funktioniert super, danke! weiß jemand, wie man das mit Chrome macht?
Alexander Mills

33

Sie können Daten-URIs wie folgt verwenden:

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

&0ist der Dateideskriptor für stdin, also codiert er stdin nach base64und interpoliert das dann in den Daten-URI.

Der gleiche Trick funktioniert auch für andere Browser:

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

Wenn Sie möchten, können Sie den zweiten Teil in ein Bash-Skript einfügen (ich nenne es pipefox.sh):

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

Jetzt können Sie Folgendes tun:

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

1
total genial !, Wie zur Hölle bist du darauf gekommen? Sie können die Umbenennung von pipefox.sh in pipebrowser mit folgendem Kontext verbessern: $ 1 "data: text / html; base64, $ (base64 -w 0 <& 0)", sodass Sie den Browser nach Ihren Wünschen auswählen können
albfan 22.04.14

Ich habe eine ähnliche Frage hier, wenn es der gleiche Unterschied ist, stackoverflow.com/questions/32303025/…
1,21 Gigawatt

2
Dies funktioniert leider nicht mehr, siehe blog.mozilla.org/security/2017/11/27/…, warum die meisten Mimetypen in Daten-URLs jetzt für die Navigation auf oberster Ebene gesperrt werden.
TheDiveO

7

Ich habe das gefunden:

bcat - Pipe zum Browser-Dienstprogramm

... um auf Ubuntu Natty zu installieren, habe ich Folgendes getan:

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

Ich dachte, es funktioniert mit einem eigenen Browser - aber beim Ausführen des oben genannten Befehls wurde in einem bereits laufenden Firefox ein neuer Tab geöffnet, der auf eine localhost-Adresse zeigt http://127.0.0.1:53718/btest... Bei der bcatInstallation können Sie auch Folgendes tun:

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

... öffnet sich wieder ein Tab, aber Firefox zeigt weiterhin das Ladesymbol an (und würde anscheinend die Seite aktualisieren, wenn Syslog aktualisiert wird).

Die bcatHomepage verweist auch auf den uzbl- Browser, der anscheinend mit stdin umgehen kann - aber für seine eigenen Befehle (sollte sich aber wahrscheinlich mehr damit befassen)


BEARBEITEN: Da ich so etwas dringend brauchte (hauptsächlich, um HTML-Tabellen mit Daten anzuzeigen , bcatdie im laufenden Betrieb generiert wurden (und mein Firefox wird immer langsamer ), habe ich es mit einer benutzerdefinierten Lösung versucht. Da ich ReText verwende , hatte ich es bereits installierte python-qt4und WebKit-Bindungen (und Abhängigkeiten) auf meinem Ubuntu Also habe ich ein Python / PyQt4 / QWebKit-Skript zusammengestellt, das wie bcat(nicht wie btee) funktioniert , aber ein eigenes Browserfenster hat - genannt Qt4WebKit_singleinst_stdin.py(oder qwksisikurz):

Grundsätzlich können Sie mit dem heruntergeladenen Skript (und den Abhängigkeiten) einen Alias ​​in einem bashTerminal wie folgt erstellen:

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

... und in einem Terminal (nach dem Aliasing) qwksisiwird das Hauptsuchfenster geöffnet; In einem anderen Terminal (erneut nach dem Aliasing) könnte man folgendermaßen vorgehen, um Standarddaten zu erhalten:

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

... Wie nachfolgend dargestellt:

qwksisi

Vergessen Sie nicht, -am Ende auf stdin zu verweisen. Andernfalls kann auch ein lokaler Dateiname als letztes Argument verwendet werden.

Grundsätzlich ist das Problem hier zu lösen:

  • Single-Instance-Problem (der erste Skriptlauf wird zum "Master" und öffnet ein Browserfenster)
  • Interprozesskommunikation für die gemeinsame Nutzung von Variablen (damit beim Beenden von Prozessen Daten an das Hauptsuchfenster übergeben werden können)
  • Timer-Aktualisierung im Master, die nach neuen Inhalten sucht und das Browserfenster aktualisiert, wenn neue Inhalte eingehen.

Als solches könnte dasselbe beispielsweise in Perl mit Gtk-Bindungen und WebKit (oder einer anderen Browserkomponente) implementiert werden. Ich frage mich jedoch, ob das XUL-Framework von Mozilla verwendet werden könnte, um dieselbe Funktionalität zu implementieren. In diesem Fall würde man wahrscheinlich mit der Firefox-Browserkomponente arbeiten.


6

Sie können die Prozessersetzung verwenden :

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

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

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

1
Kann diese nicht mit Ubuntu 14.04 unter Verwendung von Bash und Firefox 29.0 zum Laufen bringen
John S Gruber

5

Schau mal, was auf der Suche nach "Browser stdin" aufgetaucht ist! , ein nettes kleines Shell-Skript:

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

Wenn Sie dies in speichern stdin2www, machen Sie es ausführbar ( chmod +x stdin2www), Ihre Beispiele sollten über funktionieren cat index.html | ./stdin2www. Beachten Sie nur, dass relative Links , Bilder usw. fehlschlagen, da die Seite, die geöffnet wird, etwas ist /tmp/. Weitere Arbeiten wären erforderlich, um dies zu beheben.


3

Ich habe ein Python-Skript geschrieben, um stdin in eine temporäre Datei zu schreiben und die temporäre Datei dann mit Firefox zu öffnen.

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

Sie können den folgenden Befehl in einem Shell-Skript / Terminal-Fenster ausführen.

Vor dem Starten von Firefox (oder eines anderen Browsers) wird der beim Öffnen anzuzeigende Inhalt von der Standardeingabe gelesen.

Wenn kein HTML-Code gesendet wird, ändern Sie die text/htmlZeichenfolge in der folgenden URL in einen beliebigen Dateityp (z. B. text/plainoder image/png).

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

0

Ein einfacher ffpipeAlias.

Die Daten-URI-Lösungen von snowball und luk3yx funktionieren unter GNU / Linux nicht.

Der folgende Alias ​​sollte funktionieren:

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

z.B.

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

Einschränkungen

Die Seite wird erst geladen, wenn die Pipe geschlossen ist (dh das Dateiende erreicht wurde).

Wenn ein inkrementelles Rendern des weitergeleiteten Inhalts erforderlich ist, sollten Sie das zuvor erwähnte bcatDienstprogramm verwenden.


0

Obwohl diese Frage sieben Jahre alt ist, wundert es mich, dass niemand eine Lösung vorgeschlagen hat, mit der die Datei über einen Webserver bereitgestellt wird. Dies wird mit dem folgenden kompakten Python3-Skript erreicht. Speichern Sie es als ausführbare Datei, zum Beispiel 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()

Anschließend können Sie die Standardeingabe an den Standardbrowser umleiten:

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

Standardmäßig arbeitet der Server an Port 8000, aber dieses Verhalten kann mit einem Befehlszeilenargument geändert werden:

./browser.py 9000 < website.html

Ich habe dieses Skript unter Linux getestet. Es sollte andere UNIX-Systeme, einschließlich MacOS, sofort handhaben. Es ist im Prinzip sogar für Windows vorbereitet (ich habe keines zum Testen), aber dort kann es notwendig sein, die Timeout-Funktionalität anders zu implementieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.