Woof — простой обмен файлами по локальной сети в Linux
Woof (сокращение от Web Offer One File) – это простое приложение для обмена файлами между хостами в небольшой локальной сети. Он состоит из крошечного HTTP-сервера, который может обслуживать указанный файл заданное количество раз (по умолчанию один раз), а затем завершает работу.
Чтобы использовать woof, просто вызовите его для одного файла, и получатель сможет получить доступ к вашему общему файлу через веб-браузер или с помощью веб-клиента командной строки, такого как kurly (альтернатива curl), из Терминал.
Одним из преимуществ woof по сравнению с другими инструментами обмена файлами является то, что он обменивается файлами между другой операционной системой или разными устройствами (компьютерами, смартфонами, планшетами и т. д.), при условии, что у получателя установлен веб-браузер.
В этой статье мы покажем, как установить woof в Linux и использовать его для обмена файлами в локальной сети.
Как установить и использовать Woof в Linux
В Debian и Ubuntu вы можете легко установить пакет «woof» из стандартных репозиториев дистрибутива, используя диспетчер пакетов apt-get, как показано ниже.
$ sudo apt install woof OR $ sudo apt-get install woof
В других дистрибутивах Linux вы можете загрузить скрипт woof с помощью команды wget и переместить его в каталог /usr/bin, как показано ниже.
$ wget http://www.home.unix-ag.org/simon/woof $ sudo cp woof /usr/bin/
Чтобы поделиться файлом, укажите его в качестве аргумента, как показано.
$ woof ./bin/bashscripts/getpubip.sh
Затем woof сгенерирует URL-адрес (в данном случае http://192.168.43.31:8080/), который ваш партнер может использовать для доступа к файлу.
Отправьте URL-адрес получателю. Как только получатель получит доступ к файлу, woof выключится (см. следующий снимок экрана).
Примечание. В приведенном выше примере мы использовали загрузчик командной строки wget для получения общего файла, и он автоматически присваивает загруженному файлу другое имя (например, index.html).
Чтобы указать пользовательское имя, используйте параметр -O , как показано.
$ wget -O custom_name http://192.168.43.31:8080
Кроме того, вы также можете получить доступ к общему файлу из веб-браузера, как показано на рисунке (нажмите Сохранить файл, чтобы загрузить его).
По умолчанию woof передает файл один раз, и после того, как получатель загрузит его, работа woof прекращается. Вы можете установить количество раз, когда woof будет делиться файлом, прежде чем он отключится, используя параметр -c .
Следующая команда завершит woof после трех загрузок.
$ woof -c 3 ./bin/bashscripts/getpubip.sh
Чтобы поделиться каталогом, вы можете создать tar-архив и сжать его, используя ( -z для сжатия gzip, или -j для сжатия bzip2, или -Z для сжатия ZIP). Например:
Проверьте имя загружаемого файла, это должен быть архив Gzip, как показано на следующем снимке экрана.
Кроме того, вы можете использовать флаг -U , чтобы указать woof предоставить форму загрузки, позволяющую загружать файлы. Файл будет загружен в текущую директорию, из которой был запущен woof:
Затем ваш партнер может использовать сгенерированный URL-адрес для доступа к форме загрузки из браузера, как показано ниже.
После просмотра и выбора файла нажмите кнопку «Загрузить», чтобы загрузить файлы.
Вы можете убедиться, что файл должен быть загружен в тот же каталог, где был запущен woof.
Вы можете увидеть больше вариантов использования, запустив:
Woof – это небольшой, простой и удобный в использовании HTTP-сервер для обмена файлами в локальной сети. В этой статье мы показали, как установить и использовать woof в Linux. Используйте форму обратной связи ниже, чтобы поделиться своими мыслями об этом инструменте или задать вопросы.
Об HTTP-серверах для трансфера файлов в Linux
Последнее время часто сталкивался с необходимостью обмена файлами между Linux-машинами. В этом посте опишу 3 удобных способа, как можно быстро и легко развернуть тривиальный HTTP-сервер для трансфера файлов.
Local – 10.10.10.1, remote – 10.10.10.2.
Python
Питон может выручить практически в любой ситуации, и наш случай не исключение.
Всем известны эти замечательные команды для запуска HTTP-серверов для второй версии питона:
local@server:~$ python -m SimpleHTTPServer [port]
local@server:~$ python3 -m http.server [-h] [--cgi] [--bind ADDRESS] [port]
Таким способом можно только выдергивать файлы оттуда, где подняли сервер, т. к. единственные методы, который он понимает “из коробки”, это HEAD и GET . Однако никто не запрещает нам немного модифицировать дефолтное поведение, добавив, к примеру, обработку POST (выводим содержимое в консоль для примера) и PUT -запросов.
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Usage: python3 SimpleHTTPServer+.py [-h] [--bind ADDRESS] [port] import http.server import os from argparse import ArgumentParser class HTTPRequestHandler(http.server.SimpleHTTPRequestHandler): def _set_headers(self): self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() def do_POST(self): content_length = int(self.headers['Content-Length']) post_data = self.rfile.read(content_length) self._set_headers() self.wfile.write(b'POST!
') print(post_data.decode('utf-8')) def do_PUT(self): path = self.translate_path(self.path) if path.endswith('/'): self.send_response(405, 'Method Not Allowed') self.wfile.write(b'PUT not allowed on a directory\n') return else: try: os.makedirs(os.path.dirname(path)) except FileExistsError: pass length = int(self.headers['Content-Length']) with open(path, 'wb') as f: f.write(self.rfile.read(length)) self.send_response(201, 'Created') self.end_headers() def cli_options(): parser = ArgumentParser() parser.add_argument( '--bind', '-b', default='', metavar='ADDRESS', help='Specify alternate bind address [default: all interfaces]' ) parser.add_argument( 'port', action='store', default=8000, type=int, nargs='?', help='Specify alternate port [default: 8000]' ) return parser.parse_args() if __name__ == '__main__': args = cli_options() http.server.test(HandlerClass=HTTPRequestHandler, port=args.port, bind=args.bind)
Позволяет успешно как выгружать файлы с:
local@server:~$ wget 10.10.10.2:8881/message --2018-10-11 10:51:35-- http://10.10.10.2:8881/message Connecting to 10.10.10.2:8881. connected. HTTP request sent, awaiting response. 200 OK Length: 10 [application/octet-stream] Saving to: ‘message’ message 100%[===================>] 10 --.-KB/s in 0s 2018-10-11 10:51:35 (2.40 MB/s) - ‘message’ saved [10/10]
local@server:~$ cat message Hi there!
remote@server:~$ python3 SimpleHTTPServer+.py 8881 Serving HTTP on 0.0.0.0 port 8881 (http://0.0.0.0:8881/) . 10.10.10.1 - - [11/Oct/2018 11:04:37] "GET /message HTTP/1.1" 200 -
Так и загружать на Linux-машину:
local@server:~$ curl --upload-file message 10.10.10.2:8881 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 10 0 0 100 10 0 9 0:00:01 0:00:01 --:--:-- 9 local@server:~$ curl -d @message -X POST 10.10.10.2:8881 POST!
remote@server:~$ python3 SimpleHTTPServer+.py 8881 Serving HTTP on 0.0.0.0 port 8881 (http://0.0.0.0:8881/) . 10.10.10.1 - - [11/Oct/2018 10:52:10] "PUT /message HTTP/1.1" 201 - 10.10.10.1 - - [11/Oct/2018 10:52:18] "POST / HTTP/1.1" 200 - Hi there!
remote@server:~$ cat message Hi there!
Доступные методы: GET , POST , PUT .
Неудивительно, что двухстрочный скрипт на PHP может решить все наши проблемы — “препроцессор гипертекста” как-никак
Итак, для тривиального PHP-сервера нам понадобится такой код:
$fname = basename($_REQUEST['filename']); file_put_contents('uploads/' . $fname, file_get_contents('php://input')); ?>
На скриншоте ниже (кликабельно) можно видеть всю процедуру запуска сервера: предварительная настройка на панели слева, тесты — справа.
Несколько слов о том, что здесь происходит:
- Создаем необходимые директории и скрипт с содержимым выше.
- Создаем пользователя, от которого будет крутиться сервер. Новый пользователь нужен для того, чтобы недруги не смогли выполнить код, который сами загрузят. Поэтому командой umask 555 задаем настройку прав доступа, выдаваемых всем новым файлам, которые будет создавать наш юзер. 555 это 777 XOR 222 , следовательно дефолтные биты будут выставлены, как если бы мы каждому новому файлу вручную задавали chmod 222 (разрешена только запись).
- Запускаем сервер и тестируем.
- .
- PROFIT
Доступные методы: GET , POST , PUT .
Nginx
Ну и куда же без the High-Performance Web Server and Reverse Proxy? Благо, на большинстве Linux-дистрибутивах Nginx предустановлен, поэтому настроить и развернуть его можно в считанные минуты.
Опять же на скриншоте ниже можно видеть всю процедуру запуска: предварительная настройка на панели сверху, тесты — снизу.
- Создаем необходимые директории и конфигурацию сервера по образцу из default ‘а (содержимое конфига есть ниже).
- Делаем конфиг активным (симлинк в /etc/nginx/sites-enabled/ )
- Перезапускаем службу nginx , проверяем ее активность и тестируем сервер.
- .
- PROFIT
root@kali:~# cat /etc/nginx/sites-available/file_upload server < listen 8881 default_server; server_name snovvcrash.top; location / < root /var/www/uploads; dav_methods PUT; create_full_put_path on; dav_access group:rw all:r; >>
Как напользовались, не забываем остановить сервер:
root@kali:~# systemctl stop nginx
Доступные методы: GET , PUT .