firefoxにstdinを読み込ませる方法


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

これらのコマンドは機能しません。
firefoxが標準入力を読み取れる場合、パイプ経由で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がページの更新を決定するまで、シェルウィンドウにいくつかの長い行を繰り返し貼り付けて、必要なデータ量を確認します。次に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
ランプ

これはすばらしい、ありがとう!誰もが代わりにChromeでこれを行う方法を知っていますか?
アレクサンダーミルズ

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

必要に応じて、2番目の部分をbashスクリプトに配置できます(これを呼び出しますpipefox.sh)。

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

できるようになりました:

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

1
本当にすごい!、どうやってこれを思いついたの?あなたがコンテキストにpipebrowserにリネームpipefox.shを向上させることができます:$ 1 "データ:text / htmlの、base64で、$(base64で-w 0 <&0)"あなたは、好みに合わせてブラウザを選択することができ
albfan

同じ違い、stackoverflow.com
1.21ギガ

2
残念ながら、これはもう機能しません。blog.mozilla.org/ security / 2017/11/27 /を参照してください。データURLのほとんどのmimetypeがトップレベルナビゲーションからブロックされるようになりました。
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で新しいタブが開き、ローカルホストアドレスを指しています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(おそらくかかわらず、より多くの本になっているはずです)が、独自のコマンドについて-明らかに標準入力を処理できるブラウザを、


編集:私はこのようなものがひどく必要だったので(主にオンザフライで生成されたデータでHTMLテーブルを表示するために(そして私のFirefoxは有用であるために本当に遅くなっていますbcat))、私はカスタムソリューションで試しました。私はすでにReTextを使用していましたインストールpython-qt4およびWebKitのバインディング(および依存関係)私のUbuntuのように、私は一緒に入れパイソン/ PyQt4 / QWebKitスクリプト-のように動作します。bcat(ないようなbtee)が、独自のブラウザウィンドウで-と呼ばれるQt4WebKit_singleinst_stdin.py(またはqwksisi略して):

基本的に、ダウンロードしたスクリプト(および依存関係)を使用して、次のbashような端末でエイリアスを作成できます。

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

...そして、1つの端末(エイリアス処理後)でqwksisi、マスターブラウザーウィンドウを表示します。一方、別の端末で(再びエイリアシング後)、stdinデータを取得するために次のことができます。

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

...以下に示すように:

qwksisi

-最後にstdinを参照することを忘れないでください。それ以外の場合は、ローカルファイル名を最後の引数として使用することもできます。

基本的に、ここでの問題は解決することです:

  • 単一インスタンスの問題(したがって、スクリプトの最初の実行は「マスター」になり、ブラウザーウィンドウが表示されます-後続の実行ではデータが単にマスターに渡されて終了します)
  • 変数を共有するためのプロセス間通信(したがって、終了するプロセスはマスターブラウザーウィンドウにデータを渡すことができます)
  • 新しいコンテンツをチェックし、新しいコンテンツが到着した場合にブラウザーウィンドウを更新するマスターのタイマー更新。

そのため、たとえば、GtkバインディングとWebKit(または他のブラウザコンポーネント)を備えたPerlでも同じことが実装できます。ただし、MozillaのXULフレームワークを使用して同じ機能を実装できるのではないかと思います。その場合、Firefoxブラウザーコンポーネントを使用すると思います。


6

プロセス置換を使用できます:

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

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

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

1
これらをbashおよびFirefox 29.0を使用してUbuntu 14.04で動作させることはできません
ジョンSグルーバー

5

「ブラウザ標準」の検索結果が表示されます。、素敵な小さなシェルスクリプト:

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

標準入力を一時ファイルに書き込み、Firefoxで一時ファイルを開くためのPythonスクリプトを作成しました。

#!/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(または他のブラウザ)を起動する前に、標準入力から読み込み時に表示するコンテンツを読み取ります。

HTMLが送信されていない場合はtext/html、以下のURLの文字列をファイルの種類(たとえば、text/plainまたはimage/png)に変更します。

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

0

単純なffpipeエイリアス。

snowballとluk3yxが提供するデータURIソリューションは、GNU / Linuxでは機能しません。

次のエイリアスが機能するはずです。

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

例えば。

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

制限事項

ページは、パイプが閉じられると(つまり、ファイルの終わりに達すると)ロードされます。

パイプコンテンツのインクリメンタルレンダリングが必要な場合は、前述のbcatユーティリティのようなものを使用することをお勧めします。


0

この質問は7年前のものですが、Webサーバーを介してファイルを提供するソリューションを誰も提案していないことに驚いています。これは、次のコンパクトなPython3スクリプトで実現されます。それを実行ファイルとして保存します(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()

次に、標準入力をデフォルトのブラウザーにリダイレクトできます。

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

デフォルトでは、サーバーはポート8000​​で動作しますが、その動作はコマンドライン引数で変更できます。

./browser.py 9000 < website.html

このスクリプトをLinuxでテストしました。MacOSを含む他のUNIXシステムをそのまま使用できるはずです。原則としてWindows用にも準備されています(テスト用のものはありません)が、タイムアウト機能を異なる方法で実装する必要があるかもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.