Почти в любом дистрибутиве Linux есть маленькая незаметная утилита netcat, или просто nc. Эта программа может создавать TCP-сокеты либо в режиме сервера для ожидания соединения, либо в режиме клиента для подключения к серверу. А по правде сказать, для netcat вовсе не играет роли, собираетесь ли вы использовать его как сервер или как клиент – его работа заключается только в том, чтобы собрать данные с stdin и передать на указанный сетевой адрес.
Простейший пример использования netcat – это создать клиент-серверный чат. Хотя это и очень примитивный способ создания чата, он наглядно показывает, как данная утилита работает. В последующих примерах будет подразумеваться, что машина, создающая сокет в режиме ожидания (сервер), имеет IP-адрес 192.168.0.1. Итак, создаем чат-сервер, который будет ожидать соединений на TCP-порт 3333:
$ nc -l 3333
Теперь мы можем с другого компьютера подключиться к данному серверу:
$ nc 192.168.0.1 3333
В данном случае клавиатура выступает в роли stdin. Все набираемое на клавиатуре на стороне сервера будет передано на терминал клиента, и наоборот.
Передача файлов
Совершенно аналогичным образом можно использовать netcat для передачи файлов между двумя компьютерами. При помощи следующей команды можно создать сервер, который подготовит файл к передаче:
$ cat backup.iso | nc -l 3333
Получить файл backup.iso на другом компьютере можно следующим образом:
$ nc 192.168.0.1 3333 > backup.iso
Как можно заметить, netcat не отображает никакой информации о процессе передачи данных. При работе с большими файлами это может быть довольно неудобно. Для решения этой проблемы можно использовать утилиту pv (progress viewer). В данном примере на стороне сервера будет в реальном времени отображаться информация о скорости и объеме передаваемых данных:
$ cat backup.iso | pv -b | nc -l 3333
Подобным образом можно показывать статистику и на стороне клиента:
$ nc 192.168.0.1 3333 | pv -b > backup.iso
Другие примеры
Утилита netcat может также пригодиться для создания образа раздела жесткого диска с возможностью отправки его на удаленный сервер на лету:
$ dd if=/dev/hdb5 | gzip -9 | nc -l 3333
А на удаленной машине принять созданный образ можно так:
$ nc 192.168.0.1 3333 | pv -b > myhdb5partition.img.gz
В случае необходимости отправки группы файлов – например, набора конфигурационных файлов – можно скомбинировать netcat и архиватор tar:
$ tar -czf - /etc/ | nc -l 3333
Дефис в качестве имени файла в параметрах tar необходим для того, чтобы вывести результат работы архиватора на stdin, который затем перенаправляется в netcat. Принять созданный бэкап на удаленной машине можно аналогично изложенному ранее:
$ nc 192.168.0.1 3333 | pv -b > mybackup.tar.gz
Безопасность
Очевидно, что при подобном использовании netcat информация передается по сети в исходном нешифрованном виде. Для передачи некритических данных это вполне приемлемо, но при передаче какой-либо ценной информации разумно использовать netcat в сочетании с SSH-туннелем.
Использование SSH-туннеля имеет два преимущества:
- Информация передается внутри зашифрованного туннеля, так что она хорошо защищена;
- На сервере не требуется открывать никаких дополнительных портов в конфигурации файрвола, поскольку соединение будет установлено через SSH
На стороне сервера файл в netcat выставляется точно так же, как описано ранее:
$ cat backup.iso | nc -l 3333
А вот на стороне клиента подключаемся к ожидающему соединений сокету netcat через SSH-туннель:
$ ssh -f -L 23333:127.0.0.1:3333 [email protected] sleep 10; \ nc 127.0.0.1 23333 | pv -b > backup.iso
Понятно, что есть и другие способы помещения соединения в SSH-туннель, но создание и использование туннеля именно таким образом имеет полезную особенность, что туннель автомагически закрывается при окончании передачи данных через netcat.
…и переносной сканер портов
Невероятно, но netcat еще можно использовать и для сканирования открытых портов. Для этого поможет параметр -z:
$ nc -z 192.168.0.1 80-90 Connection to 192.168.0.1 80 port [tcp/http] succeeded!
В данном примере netcat сканировал диапазон портов 80-90 и сообщил, что на удаленной машине открыт порт 80.
На страницах man по утилите netcat также содержится и ряд других полезных советов и интересных примеров использования данной программы.
Спасибо. Полезно!
client(10.2.1.19)
user@comp_1 ~ $ ssh [email protected]
ssh: Permission denied (publickey).
==========================
user@comp_1 ~ $ cat ~/.ssh/id_rsa.pub | nc -l 5000
server(10.2.1.8)
user@comp_2 ~ $nc 10.2.1.19 5000 > ~/.ssh/authorized_keys
=============================================
user@comp_1 ~ $ ssh -i ~/.ssh/id_rsa [email protected]