파이어 폭스가 stdin을 읽는 방법


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

이 명령은 작동하지 않습니다.
파이어 폭스가 stdin을 읽을 수 있다면 파이프를 통해 html을 파이어 폭스에 보낼 수 있습니다.
파이어 폭스가 stdin을 읽을 수 있습니까?


2
정확히 무엇을 달성하고 싶습니까?
pbm

6
@pbm : 임시 데이터 저장을 피하는 것이 유용 할 수 있습니다 ...
l0b0

답변:


23

짧은 대답은 임시 파일을 작성하고 여는 것이 좋습니다. 파이프가 제대로 작동하게하는 것은 더 복잡하며 추가적인 이점이 없을 것입니다. 즉, 여기 내가 찾은 것이 있습니다.

귀하의 경우 firefox명령이 실제로 대신 이미 실행중인 파이어 폭스 인스턴스와 이야기의 파이어 폭스를 시작, 당신은이 작업을 수행 할 수 있습니다 :

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

이것은 파이어 폭스가 표준 입력을 읽도록 지시합니다. 그러나 Firefox가 이미 실행 중이면 firefox명령이 해당 이름을 기본 Firefox 프로세스로 전달 하여 자체 표준 입력을 읽 습니다. 아무 것도 제공하지 않으며 파이프에 연결되어 있지 않을 것입니다.

또한 파이프에서 읽을 때 Firefox는 내용을 상당히 많이 버퍼링하므로 새로운 HTML 줄을 제공 할 때마다 페이지를 업데이트하지 않습니다. Firefox를 닫고 실행 해보십시오.

cat | firefox /dev/fd/0

(NB는 실제로 cat여기에 필요합니다 .) Firefox가 페이지를 업데이트하기로 결정할 때까지 긴 줄을 쉘 창에 반복적으로 붙여 넣으면 얼마나 많은 데이터 가 필요한지 알 수 있습니다. 이제 Ctrl+D새 줄 을 쳐서 파일 끝 신호를 보내고 Firefox 업데이트를 즉시보십시오. 그러나 더 이상 데이터를 추가 할 수 없습니다.

아마 가장 좋습니다 :

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

2
당신과 새로운 프로세스를 엽니 다 파이어 폭스를 강제 할 수 -new-instance있으므로이된다, ... | firefox -new-instance /dev/fd/0.
rampion

고마워요! 누구나 크롬 대신이 작업을 수행하는 방법을 알고 있습니까?
Alexander Mills

33

다음 과 같이 data URI 를 사용할 수 있습니다 .

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

&0stdin에 대한 파일 설명자이므로 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)"

원하는 경우 두 번째 부분을 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 "data : text / html; base64, $ (base64 -w 0 <& 0)"원하는대로 브라우저를 선택할 수 있습니다
albfan

이 같은 차이 인 경우 여기 비슷한 질문이 stackoverflow.com/questions/32303025/...
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 브라우저를 참조하는데 ,이 브라우저는 stdin을 처리 할 수 ​​있지만, 자체 명령을 위해 (아마도 이것에 대해 더 자세히 살펴 봐야합니다)


편집 : 나는 이것과 같은 것을 필요로했기 때문에 (대부분 생성 된 데이터로 HTML 테이블을 bcat보았고 (파이어 폭스가 유용하게 사용되는 데 실제로 느려짐 )) 사용자 정의 솔루션을 사용해 보았습니다 .ReText를 사용 했기 때문에 이미 python-qt4우분투에 설치 및 WebKit 바인딩 (및 의존성)을 제공하므로 Python / PyQt4 / QWebKit 스크립트는- bcat와 같지 btee않지만 Qt4WebKit_singleinst_stdin.py(또는 qwksisi짧음) 자체 브라우저 창과 함께 작동합니다 .

기본적으로 다운로드 한 스크립트 (및 종속성)를 사용하면 다음 bash과 같이 터미널 에서 별칭을 지정할 수 있습니다 .

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

... 및 한 터미널에서 (별칭 지정 후) 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
우분투 14.04 사용 배쉬와 파이어 폭스 29.0로 작업에이를 가져올 수 없습니다
존 S 그루버

5

'브라우저 stdin'에 대한 검색 결과가 어떻게되었는지보세요! 좋은 작은 쉘 스크립트 :

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

임시 파일에 stdin을 작성하고 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 살이지만 아무도 웹 서버를 통해 파일을 제공하는 솔루션을 제안하지 않은 것에 놀랐습니다. 다음과 같은 소형 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.