Linux аналог net send
Сокет Netlink используется для достиженияПользовательский процесспротивПроцесс ядраСпециальная межпроцессная связь (IPC) также является наиболее часто используемым интерфейсом для связи между сетевыми приложениями и ядром.
В ядре Linux есть много приложений, которые используют netlink для связи с ядром, например
- Демон маршрутизации (NETLINK_ROUTE)
- Протокол сокета пользовательского режима (NETLINK_USERSOCK)
- Брандмауэр (NETLINK_FIREWALL)
- подсистема netfilter (NETLINK_NETFILTER)
- События ядра для уведомления пользовательского режима (NETLINK_KOBJECT_UEVENT)
- Общий сетевой канал (NETLINK_GENERIC)
Netlink - очень хороший способ двусторонней передачи данных между ядром и пользовательскими приложениями.Приложения пользовательского режима могут использовать стандартные API-интерфейсы сокетов для использования мощных функций, предоставляемых netlink, в то время как режим ядра должен использовать специальные API-интерфейсы ядра для использования netlink.
Вообще говоря, существует три способа связи между пользовательским пространством и пространством ядра: /proc、ioctl、Netlink . Первые два являются однонаправленными, и Netlink может реализовать дуплексную связь.
По сравнению с системными вызовами, файловой системой ioctl и / proc, Netlink имеет следующие преимущества:
Протокол Netlink основан на сокете BSD и AF_NETLINK Кластер адресов, использующий 32-битную адресацию номера порта, каждый протокол Netlink обычно связан с одной или группой основных служб / компонентов, таких как NETLINK_ROUTE Используется для получения и установки информации о маршрутах и ссылках, NETLINK_KOBJECT_UEVENT Используется ядром для отправки уведомлений процессу udev в пользовательском пространстве и т. Д.
Два, структура данных пользовательского режима
Приложения пользовательского режима используют стандартные API-интерфейсы сокетов, такие как sendto (), recvfrom (), sendmsg (), recvmsg ().
Связь Netlink похожа на обычную связь UDP Socket, struct sockaddr_nl Это коммуникационный адрес netlink, который совпадает с обычным socket struct sockaddr_in похожий.
1. Структура struct sockaddr_nl:
2. Структура struct nlmsghd:
3. Структура struct msghdr
Три, структура данных ядра netlink
2. Часто используемые макросы Netlink:
3. Общие функции ядра Netlink
Функция ядра netlink_kernel_create используется для создания сокета ядра и взаимодействия с пользовательским режимом.
4. Одноадресная передача netlink_unicast () и многоадресная передача netlink_broadcast ()
так что пользователь Windows может прочитать в своем окне cmd текст message ; тогда пользователь Windows сможет ответить другой командой. Является ли это возможным?
Я читал о команде Windows, msg но она не работает во всех версиях ОС. Что-нибудь еще?
Вместо PuTTY я хотел бы использовать оболочку Linux и Windows cmd.
В Unix: nc -l 192.168.1.10 32849
В Windows: telnet 192.168.1.10 32849
Где 32849 - произвольный порт, разрешенный в правилах брандмауэра, а IP - это прослушивающий IP-адрес Unix-машины. nc утилита netcat
Отличная идея! на windows7 x64 мне нужно было установить клиент "telnet" для Windows. идея заключалась в том, чтобы сделать, pkgmgr /iu:"TelnetClient" но в результате Operation failed with 0x8007000B An attempt was made to load a program with an incorrect format. , после регистрации я увидел You cannot service a running 64-bit operating system with a 32-bit version . Получил работу с c:\windows\sysnative\dism.exe /online /norestart /logpath:"c:\foo.txt" /enable-feature /ignorecheck /featurename:"TelnetClient" акцентом на sysnative . Это установлено c:\windows\sysnative\telnet.exe . Я должен был использовать -p как в nc -l 192.168.1.10 -p 32849 , благодаря JohnMurhy ! Мне пришлось использовать разные IP в двух командах. (IP-адрес другой машины с каждой стороны.) После этих новых комментариев я снова проверил, мне не нужен флаг -p с помощью команды [Free] BSD nc. Я получаю "wolf% sudo nc -l 10.0.0.1 -p 8888 nc: не могу использовать -p и -l ". Я также не упомянул, что вам необходим доступ суперпользователя для привязки к произвольным портам. Я не знаю, почему Naxa нужны разные IP-адреса или даже как это возможно, что это не работает. Это связано с тем, что флаг -l означает, что он прослушивает локально комбинацию IP-адресов и портов * nix. Это не имеет ничего общего с IP-адресом Windows-машины. Telnet действует как клиент в этом сценарии.Идея из ответа ProjectDP : Netcat на Linux служит Telnet на победу . Однако необходимо -p и разные IP-адреса на двух компьютерах:
В Linux: netcat -l 10.0.0.2 -p 14415 - если у вас Windows 10.0.0.2
В Windows: telnet 10.0.0.1 14415 - если ваш linux на 10.0.0.1
Для выхода из телнета нажмите ^] что означает Ctrl + , ] а затем печатать q .
Выбрать свой произвольный порт как 14415 удобный столик можно у Дэвида Вереба .
Однако на win7 x64 мне сначала пришлось включить telnet, короче говоря:
c:\windows\sysnative\dism.exe /online /norestart /logpath:"c:\foo.txt" /enable-feature /ignorecheck /featurename:"TelnetClient"
Проблема в первоначальной попытке заключалась в том, что pkgmgr пытались использовать 32-битные dism и ныли для 64-битных. У меня есть sysnative идея от Османа Шенера .
Устанавливается в c:\windows\sysnative\telnet.exe . Я положил c:\windows\sysnative в переменную среды PATH с sysdm.cpl .
Если у вас есть DeVuan или Ubuntu для Linux, sudo apt-get install netcat-traditional
Чат выглядел так:
Как NET SEND message на машине с Windows, и echo "message" | smbclient -M name2 на коробке с Linux? name1 и name2 являются именами netbios машин.
@diffracteD У меня нет машины для тестирования Windows. Я полагаю, с "Bash, чтобы победить", вы имеете в виду от Linux до Windows? Мой второй пример должен сделать именно этоСуществует интересный инструмент, который позволяет выполнять команды Windows из Linux, имя таково winexe .
Как вы можете видеть, ответ Нолети намного проще, но с помощью Winexe вы также можете открыть калькулятор или все, что захотите, в этой машине. Мы использовали его для автоматической установки на компьютерах с Windows из пакетного скрипта в Linux. Довольно круто и экономит время .
- Run command in existing processes network namespace:
- Run a new command in an existing processes ps-table namespace:
- Run command in existing processes IPC namespace:
notify-send
nsnake
Как получить дерево директорий на Bash одним однострочникомКак установить PostgreSQL на Linux и создать базу и пользователя
PostgreSQL - система управления базой данных общего назначения. Одна из самых распространённых баз данных, используемая на многих коммерческих и некоммерческих проектах.
Как скопировать вывод команды из терминала в буфер обмена Linux и MacOS
Скорее приятный, чем необходимы "трюк", но возможность использовать возможность скопировать вывод в буфер обмена – действительно круто иной раз выручает.
Как создать неизменяемый файл в Linux / MacOS / FreeBSD
Само собой, root может всё (если введёт пару команд), однако, это вполне легальный способ запретить изменение файла.
Как удалить все Docker образы и контейнеры
Не всегда нужно удалять всё, но объяснение данного "рецепта" объяснит как в целом удалять образы и контейнеры.
Bash < потоки ввода > вывода && управляющие конструкции || коротко о главном
Небольшая заметка о конструкциях Bash, в которых путается большинство новичков. А именно: >, <, &, &&, |, ||
Лучше плохо, но сейчас. Взгляд на пути развития ПО
Сейчас такие языки как Perl и Ruby чувствуют себя не лучшим образом. Но ещё 10 – 15 лет назад они были на "гребне волны".
Как запустить программу в терминале в фоне, без вывода какого либо текста
Запускаем программу в терминале в фоновом режиме и разбираемся, как и почему это работает в Linux / Unix терминале.
Малоизвестные, но полезные возможности утилиты less
Команда less является одной из самых известных на ряду с cd, cp, mv и т.д. Но используется less зачастую далеко не на всю мощь.
Как синхронизировать локальную Git версию репозитория с серверной
Прибираемся в локальной версии Git – чтобы локальная версия соответствовала удалённой (серверной) версии Git проекта.
Так ли безопасен Linux? Несколько коммитов с уязвимосятми в stable
Исследователи сумели пройти code-review с реквестами в ядро Linux, заведомо содержащими добавление уязвимостей.
Microsoft открывает исходники, а её IDE супер-популярна
Решил сложить пару фактов и немного над этим поразмыслить. Реально ли Microsoft "переобулись"?
Пример своей консольной команды в Django проекте
Если вы работали с Django проектом, то, скорее всего, запускали команды из консоли (manage.py). В Django есть простой способ писать свои команды для управления проектом.
Как на Bash посчитать число строк в проекте (директории)
Ниже будет представлен однострочник, решающий данную задачу на Bash + пошаговое описание его работы.
Как на Bash получить файлы, изменённые за сегодняшний день
Bash имеет огромные возможности по программированию/скриптованию и администрированию операционной системы. Не важно: Linux это, FreeBSD, или MacOS – на Bash можно сделать многое.
Как установить часовой пояс в Linux
В рамках первичной настройки Операционной Системы важно установить и по какому времени вы живёте, ведь при следующем обновлении времени через Интернет ваше время слетит.
Как найти самые большие папки и файлы в Linux
Когда кончается место на жестком диске, возникает закономерный вопрос: на что же оно было потрачено, какие файлы разрослись больше положенного?
Команда grep – полезные ключи и примеры использования
У команды "grep" довольно много различных особенностей. особенно, если учесть, что с английского это "решето" – а что может войти в решето , не факт что выйдет!
ОБЗОР
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
ОПИСАНИЕ
Вызов send() можно использовать, только если сокет находится в состоянии соединения (то есть известен получатель). Вызов send() отличается от write(2) только наличием аргумента flags. Если значение flags равно нулю, то вызов send() эквивалентен write(2). Также, вызов
send(sockfd, buf, len, flags);
sendto(sockfd, buf, len, flags, NULL, 0);
Аргумент sockfd представляет файловый дескриптор сокета отправления.
Если sendto() используется с сокетом в режиме с установлением соединения (SOCK_STREAM, SOCK_SEQPACKET), то аргументы dest_addr и addrlen игнорируются (и может быть возвращена ошибка EISCONN, если их значения не равны NULL и 0) и возвращается ошибка ENOTCONN, если соединение через сокет не установлено. Иначе в dest_addr задаётся адрес назначения и его размер в addrlen. Для sendmsg() адрес назначения указывается в msg.msg_name, а его размер в msg.msg_namelen.
Неудачная отправка с помощью send() никак не отмечается. При обнаружении локальных ошибок возвращается значение -1.
Аргумент флагов
Аргумент flags является битовой маской и может содержать следующие флаги: MSG_CONFIRM (начиная с Linux 2.3.15) Сообщить уровню связи, что процесс пересылки произошел: вы получили успешный ответ с другой стороны. Если уровень связи не получит его, то он будет регулярно перепроверять наличие ответной стороны (например посредством однонаправленной передачи ARP). Это работает только с сокетами SOCK_DGRAM и SOCK_RAW и в настоящее время реализовано только для IPv4 и IPv6. В arp(7) представлена более подробная информация. MSG_DONTROUTE Не использовать маршрутизацию для отправки пакета, а посылать его только на узлы локальной сети. Обычно это используется в диагностических программах и программах маршрутизации. Этот флаг определён только для маршрутизируемых семейств протоколов; пакетные сокеты не используют маршрутизацию. MSG_DONTWAIT (начиная с Linux 2.2) Включить неблокирующий режим. Если операция могла бы привести к блокировке, возвращается EAGAIN или EWOULDBLOCK. Такое поведение подобно заданию флага O_NONBLOCK (в fcntl(2) операцией F_SETFL), но отличие в том, что MSG_DONTWAIT указывается в вызове, а O_NONBLOCK задаётся в описании открытого файла (смотрите open(2)), что влияет на все нити вызывающего процесса, а также на другие процессы, у которых есть файловые дескрипторы, ссылающиеся на это описание открытого файла. MSG_EOR (начиная с Linux 2.2) Завершить запись (record) (если поддерживается, например в сокетах типа SOCK_SEQPACKET). MSG_MORE (начиная с Linux 2.4.4) Вызывающий имеет дополнительные данные для отправки. Этот флаг используется с сокетами TCP для получения такого же эффекта как с параметром сокета TCP_CORK (см. tcp(7)), с той разницей, что этот флаг можно устанавливать при каждом вызове.Начиная с Linux 2.6 этот флаг также поддерживается для сокетов UDP и информирует ядро, о том что нужно упаковать все отправляемые данные вызовов с этим флагом в одну дейтаграмму, которая передаётся только когда выполняется вызов без указания этого флага (смотрите также описание параметра сокета UDP_CORK в udp(7)).
MSG_NOSIGNAL (начиная с Linux 2.2) Не генерировать сигнал SIGPIPE, если сторона потокоориентированного сокета закрыла соединение. Ошибка EPIPE по прежнему возвращается. Это создаёт поведение как при использовании sigaction(2) для игнорирования SIGPIPE, но MSG_NOSIGNAL является свойством вызова, а установка SIGPIPE в атрибутах процесса влияет на все нити процесса. MSG_OOB Послать внепоточные данные, если сокет это поддерживает (как, например, сокеты типа SOCK_STREAM); протокол более низкого уровня также должен поддерживать внепоточные данные.
sendmsg()
Определение структуры msghdr, используемой sendmsg():Поле msg_name используется на неподключённом сокете для указания адреса назначения дейтаграммы. Оно указывает на буфер с адресом; в поле msg_namelen должен быть указан размер адреса. Для подключённого сокета значения этих полей должны быть равны NULL и 0, соответственно.
В полях msg_iov и msg_iovlen задаются места приёма/передачи, как для writev(2).
Управляющую информацию можно посылать через поля msg_control и msg_controllen. Максимальная длина управляющего буфера, которую поддерживает ядро, ограничена значением /proc/sys/net/core/optmem_max; см. socket(7).
Поле msg_flags игнорируется.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении эти вызовы возвращают количество отправленных байт. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.ОШИБКИ
Здесь представлено несколько стандартных ошибок, возвращаемых с уровня сокетов. Могут также появиться другие ошибки, возвращаемые из соответствующих модулей протоколов; их описание находится в соответствующих справочных страницах. EACCES (для доменных сокетов UNIX, которые идентифицируются по имени пути) Нет прав на запись в файл сокета назначения или в одном из каталогов пути запрещён поиск (см. также path_resolution(7)).(для сокетов UDP) Попытка отправки по сетевому/широковещательному адресу, как будто это был однозначный (unicast) адрес.
СООТВЕТСТВИЕ СТАНДАРТАМ
4.4BSD, SVr4, POSIX.1-2001. Эти интерфейсы впервые появились в 4.2BSD.В POSIX.1-2001 описаны только флаги MSG_OOB и MSG_EOR. В POSIX.1-2008 добавлено описание MSG_NOSIGNAL. Флаг MSG_CONFIRM является нестандартным расширением Linux.
ЗАМЕЧАНИЯ
В соответствие с POSIX.1-2001 поле msg_controllen структуры msghdr должно иметь тип socklen_t, но в настоящее время в glibc оно имеет тип size_t.В sendmmsg(2) можно найти информацию о специальном системном вызове Linux, который можно использовать для передачи нескольких дейтаграмм за один вызов.
Читайте также: