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?
@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.
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
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.
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:
... ö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:
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.
#!/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.
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).
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:
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.
Antworten:
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
firefox
Befehl tatsächlich Firefox startet, anstatt mit einer bereits laufenden Firefox-Instanz zu kommunizieren, können Sie dies tun: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
firefox
Befehl 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:
(Beachten Sie, dass Sie das
cat
hier 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:
quelle
-new-instance
, so wird es... | firefox -new-instance /dev/fd/0
.Sie können Daten-URIs wie folgt verwenden:
&0
ist der Dateideskriptor für stdin, also codiert er stdin nachbase64
und interpoliert das dann in den Daten-URI.Der gleiche Trick funktioniert auch für andere Browser:
Wenn Sie möchten, können Sie den zweiten Teil in ein Bash-Skript einfügen (ich nenne es
pipefox.sh
):Jetzt können Sie Folgendes tun:
quelle
Ich habe das gefunden:
bcat - Pipe zum Browser-Dienstprogramm
... um auf Ubuntu Natty zu installieren, habe ich Folgendes getan:
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 derbcat
Installation können Sie auch Folgendes tun:... öffnet sich wieder ein Tab, aber Firefox zeigt weiterhin das Ladesymbol an (und würde anscheinend die Seite aktualisieren, wenn Syslog aktualisiert wird).
Die
bcat
Homepage 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 ,
bcat
die 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 installiertepython-qt4
und WebKit-Bindungen (und Abhängigkeiten) auf meinem Ubuntu Also habe ich ein Python / PyQt4 / QWebKit-Skript zusammengestellt, das wiebcat
(nicht wiebtee
) funktioniert , aber ein eigenes Browserfenster hat - genanntQt4WebKit_singleinst_stdin.py
(oderqwksisi
kurz):Grundsätzlich können Sie mit dem heruntergeladenen Skript (und den Abhängigkeiten) einen Alias in einem
bash
Terminal wie folgt erstellen:... und in einem Terminal (nach dem Aliasing)
qwksisi
wird das Hauptsuchfenster geöffnet; In einem anderen Terminal (erneut nach dem Aliasing) könnte man folgendermaßen vorgehen, um Standarddaten zu erhalten:... Wie nachfolgend dargestellt:
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:
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.
quelle
Sie können die Prozessersetzung verwenden :
quelle
Schau mal, was auf der Suche nach "Browser stdin" aufgetaucht ist! , ein nettes kleines Shell-Skript:
Wenn Sie dies in speichern
stdin2www
, machen Sie es ausführbar (chmod +x stdin2www
), Ihre Beispiele sollten über funktionierencat 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.quelle
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.
quelle
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/html
Zeichenfolge in der folgenden URL in einen beliebigen Dateityp (z. B.text/plain
oderimage/png
).quelle
Ein einfacher
ffpipe
Alias.Die Daten-URI-Lösungen von snowball und luk3yx funktionieren unter GNU / Linux nicht.
Der folgende Alias sollte funktionieren:
z.B.
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
bcat
Dienstprogramm verwenden.quelle
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:
Anschließend können Sie die Standardeingabe an den Standardbrowser umleiten:
Standardmäßig arbeitet der Server an Port 8000, aber dieses Verhalten kann mit einem Befehlszeilenargument geändert werden:
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.
quelle