как сделать чтение Firefox stdin

Фаворит шахты должен использовать команду Python для создания временного http сервера:

python-m SimpleHTTPServer

и доступ к файлам от этой машины по LAN как:

http://192.168.1.70:8000

Другой должен загрузить файл tar в извлеченной форме как:

wget-qO - http://192.168.1.70:8000/test.bz2 | tar xjvf -

Здесь ссылка может быть любым по www, и bz2 может быть или gz, tgz или самим bz2 в этом отношении.

29
19.11.2011, 08:31
9 ответов

Короткий ответ, Вы - более обеспеченная запись временного файла и открытие это. Получение каналов работать правильно более сложно и вероятно не даст Вам дополнительных преимуществ. Тем не менее вот то, что я нашел.

Если Ваш firefox команда на самом деле запускает Firefox вместо того, чтобы говорить с уже рабочим экземпляром Firefox, можно сделать это:

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

Который говорит Firefox явно читать свой стандартный вход, который является, куда канал помещает свои данные. Но если Firefox уже работает, firefox команда просто собирается передать то имя к основному процессу Firefox, который считает его собственный стандартный вход, который, вероятно, ничего не даст ему и конечно не подключен к Вашему каналу.

Кроме того, при чтении из канала, Firefox буферизует вещи довольно в большой степени, таким образом, он не собирается обновлять страницу каждый раз, когда Вы даете ему новую строку HTML, если это - то, для чего Вы идете. Попробуйте заключительный Firefox и выполнение:

cat | firefox /dev/fd/0

(N.B. Вам действительно на самом деле нужно cat здесь.) Вставляют некоторые длинные линии в Ваше окно оболочки неоднократно, пока Firefox не решает обновить страницу, и Вы видите, сколько данных требуется. Теперь отправьте сигнал Конца Файла путем удара Ctrl+D в новую строку и обновления Firefox часов немедленно. Но затем Вы не можете больше добавлять данные.

Настолько лучше всего, вероятно:

echo '<h1>hello, world</h1>' >my_temporary_file; firefox my_temporary_file
23
27.01.2020, 19:38
  • 1
    Можно вынудить Firefox открыть новый процесс с -new-instance, таким образом, это становится ... | firefox -new-instance /dev/fd/0. –  rampion 23.01.2015, 16:44
  • 2
    , который это работает отлично, Спасибо! кто-либо знает, как сделать это с Chrome вместо этого? –  Alexander Mills 18.04.2018, 00:07

Можно использовать замену процесса:

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

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

 firefox  <( echo "<h1>Hello number "{1..23}"!</h1>" )
6
27.01.2020, 19:38
  • 1
    Не Может заставить их работать с Ubuntu 14.04 с помощью удара и Firefox 29.0 –  John S Gruber 08.05.2014, 01:07

Посмотрите что, ища 'браузер 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/; больше работы было бы необходимо для фиксации этого.

5
27.01.2020, 19:38

Я нашел это:

bcat - передайте по каналу к утилите браузера

... для установки на Аккуратной Ubuntu я сделал:

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, указывающем на адрес localhost 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 будет продолжать показывать загружающийся значок (и по-видимому обновил бы страницу, когда системный журнал обновляет).

bcat домашняя страница также ссылается на uzbl браузер, который может, по-видимому, обработать stdin - но для его собственных команд (должен, вероятно, изучить это больше, хотя),


Править: Когда мне было нужно что-то вроде этого плохо (главным образом для просмотра HTML-таблиц с данными, сгенерированными на лету (и мой Firefox становится действительно медленным, чтобы быть полезным с bcat), я попробовал настраиваемым решением. Так как я использую ReText, я уже установил python-qt4 и привязка WebKit (и зависимости) на моей Ubuntu. Так, я соединил Python/PyQt4/QWebKit сценарий - который работает как bcat (не как btee), но с его собственным окном браузера - названный Qt4WebKit_singleinst_stdin.py (или qwksisi если коротко):

В основном с загруженным сценарием (и зависимости) можно исказить его в a bash терминал как это:

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

... и в одном терминале (после искажения), qwksisi повысит окно главного браузера; в то время как в другом терминале (снова после искажения), можно было сделать следующее для получения stdin данных:

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

... как показано ниже:

qwksisi

Не забывайте - в конце для обращения к stdin; иначе локальное имя файла может использоваться в качестве последнего аргумента, также.

В основном проблема здесь состоит в том, чтобы решить:

  • единственная проблема экземпляра (таким образом, первый показ сценария становится "ведущим устройством" и повышает окно браузера - в то время как последующие выполнения просто передают данные ведущему устройству и выходу),
  • межпроцессное взаимодействие для совместного использования переменных (настолько выходящие процессы могут передать данные окну главного браузера),
  • Обновление таймера в ведущем устройстве, которое проверяет на новое содержание и обновляет окно браузера, если новое содержание прибыло.

По сути, то же могло быть реализовано в, скажем, Perl с привязкой Gtk и WebKit (или другой компонент браузера). Интересно, тем не менее, если бы платформа XUL Mozilla могла бы использоваться для реализации той же функциональности - я предполагаю в этом случае, можно было бы работать с компонентом браузера Firefox.

7
27.01.2020, 19:38

Я записал сценарий Python, чтобы записать stdin во временный файл и затем открыть временный файл с Firefox.

#!/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()
3
27.01.2020, 19:38

Можно использовать данные URIs, как это:

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

Если Вы хотите, можно поместить вторую часть в сценарий удара (я назову ее pipefox.sh):

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

Теперь можно сделать:

echo '<h1>hello, world</h1>' |pipefox.sh
34
27.01.2020, 19:38
  • 1
    !, Как, черт возьми, сделал Вы придумали это?. Можно улучшить pipefox.sh, переименовывающий до pipebrowser с контекстом: 1$ "data:text/html; base64, $ (base64-w 0 <&0)" позволяющий выбирать браузер к Вашей симпатии –  albfan 23.04.2014, 01:24
  • 2
    у меня есть подобный вопрос здесь, если это - то же различие, stackoverflow.com/questions/32303025 / … –  1.21 gigawatts 31.08.2015, 05:25

Вы можете выполнить приведенную ниже команду из сценария оболочки/терминального окна.

Перед запуском Firefox (или любого другого браузера), он прочитает из своего stdin содержимое, которое будет отображаться при открытии.

Если отправляется не HTML, измените строку text/html в приведенном ниже URL на любой тип файла (например, text/plain или image/png).

firefox "data:text/html;base64,$(base64)"
0
27.01.2020, 19:38

Простой псевдоним ffpipe .

Решения для URI данных, предоставляемые Snowball и luk3yx, не работают для меня в GNU / Linux.

Должен работать следующий псевдоним:

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

например.

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

Ограничения

Страница загружается только после закрытия конвейера (т. Е. Достижения конца файла).

Если требуется инкрементный рендеринг передаваемого по конвейеру содержимого, лучше использовать что-то вроде ранее упомянутой утилиты bcat .

0
27.01.2020, 19:38

Хотя этому вопросу уже семь лет, я удивлен, что никто не предложил решение, обслуживающее файл через веб-сервер. Это достигается с помощью следующего компактного скрипта 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. Он должен работать с другими системами UNIX, включая MacOS, из коробки. Он в принципе даже подготовлен для Windows (У меня нет для тестирования ), но там может быть нужно реализовать функционал таймаута по-другому.

1
27.01.2020, 19:38

Теги

Похожие вопросы