Как определить кодировку символов, которую терминал использует в программе C / C ++?

Вам понадобится bos.net.ipsec.rte, чтобы использовать решение, подобное iptables.

проверьте текущую установку с помощью:

michael@x071:[/home/michael]lslpp -L bos.net.ipsec.rte
  Fileset                      Level  State  Type  Description (Uninstaller)
  ----------------------------------------------------------------------------
  bos.net.ipsec.rte         6.1.9.45    C     F    IP Security

Если она уже установлена, вы можете проверить, активна она или неактивна, используя:

Актив:

michael@x071:[/home/michael]lsdev -C | grep ipsec
ipsec_v4    Available       IP Version 4 Security Extension
ipsec_v6    Available       IP Version 6 Security Extension

Неактивен:

root@x064:[/]lsdev -C | grep ipsec

То есть нет вывода , что означает, что он никогда не был активирован, или

root@x072:[/]lsdev -C | grep ipsec
ipsec_v4   Defined         IP Version 4 Security Extension
ipsec_v6   Defined         IP Version 6 Security Extension

какой-то выход, означающий, что может быть какая-то конфигурация, но он был деактивирован.

Вот несколько примеров того, как вы можете включить / выключить ipsec для v4 и / или v6 ipsec.

root@x072:[/]lsdev -C | grep ipsec
ipsec_v4   Defined         IP Version 4 Security Extension
ipsec_v6   Available       IP Version 6 Security Extension
root@x072:[/]mkdev -l ipsec_v4
ipsec_v4 Available
root@x072:[/]rmdev -l ipsec_v6
ipsec_v6 Defined
root@x072:[/]lsdev -C | grep ipsec
ipsec_v4   Available       IP Version 4 Security Extension
ipsec_v6   Defined         IP Version 6 Security Extension

Теперь остановимся на nfs для каждого клиента (определенного как IP-адрес).

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

Нам нужно сосредоточиться на порту 2049

root@x072:[/]grep nfs /etc/services
nfsd-status      1110/tcp               # Cluster status info
nfsd-keepalive  1110/udp                # Client status info
picknfs          1598/tcp               # picknfs
picknfs          1598/udp               # picknfs
shiva_confsrvr  1651/tcp                # shiva_confsrvr
shiva_confsrvr  1651/udp                # shiva_confsrvr
#nfs                    2049/tcp                # Network File System - Sun Microsystems
#nfs                    2049/udp                # Network File System - Sun Microsystems
3d-nfsd          2323/tcp               # 3d-nfsd
3d-nfsd          2323/udp               # 3d-nfsd
mediacntrlnfsd  2363/tcp                # Media Central NFSD 
mediacntrlnfsd  2363/udp                # Media Central NFSD 

Примечание: чтобы использовать smit (ty), используйте:

smitty ipsec4

, а затем используйте Advanced ...-> Добавить

                         Add an IP Security Filter Rule

Type or select values in entry fields.
Press Enter AFTER making all desired changes.

                                                        [Entry Fields]
* Rule Action                                        [shun_port]             +
* IP Source Address                                  [192.168.111.222]
* IP Source Mask                                     [255.255.255.255]
  IP Destination Address                             [0.0.0.0]
  IP Destination Mask                                [0.0.0.0]
* Apply to Source Routing? (PERMIT/inbound only)     [yes]                   +
* Protocol                                           [tcp]                   +
* Source Port / ICMP Type Operation                  [any]                   +
* Source Port Number / ICMP Type                     [0]                      #
* Destination Port / ICMP Code Operation             [eq]                    +
* Destination Port Number / ICMP Type                [2049]                   #
* Routing                                            [local]                 +
* Direction                                          [inbound]               +
* Log Control                                        [no]                    +
* Fragmentation Control                              [0]                     +
* Interface                                          [all]                   +
  Expiration Time  (sec)                             [300]                    #
  Pattern Type                                       [none]                  +
  Pattern / Pattern File                             []
  Description                                        <g port on NFS request]

Или из командной строки:

/usr/sbin/genfilt -v 4  -a 'S' -s '192.168.111.222' -m '255.255.255.255' -d '0.0.0.0' -M '0.0.0.0' -g 'y' -c 'tcp' -o 'any' -p '0' -O 'eq' -P '2049' -r 'L' -w 'I' -l 'N' -t '0' -i 'all' -e '300' -D 'block incoming port on NFS request'

И либо в smit, либо из командной строки - активировать правило

mkfilt -v4 -u

и увидеть настроенные правила

lsfilt -v4 -O

и увидеть любые (возможно) динамические правила

lsfilt -v4 -a -O

** Комментарий, который я еще не могу добавить: в случае, если вам нужно изменить прямо СЕЙЧАС - поскольку это влияет только на будущие подключения к порту, вы можете использовать команды:

nfs.clean; sleep 2; rc.nfs

, чтобы остановить, а затем перезапустить службы nfs. Обратите внимание, что

stopsrc -g nfs; startsrc -g nfs

не запускает демонов в правильной последовательности

2
12.11.2016, 20:00
3 ответа

Инициализируйте языковой стандарт вашего приложения с помощью setlocale (LC_ALL, "") , а затем вызовите nl_langinfo (CODESET) . Это дает вам разрешенное значение из переменных среды LANG, LC_CTYPE, LC_ALL.

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

2
20.08.2021, 11:54

Коротко:

  • terminfo не приведет вас туда, не поможет
  • нет надежного способа определить, какую кодировку фактически использует терминал
  • , начиная с литералов Unicode, является правильный путь, при условии, что вы знаете, какую кодировку нужно использовать на терминале
  • , пользователь должен знать, какая локаль подходит и какую кодировку может выполнять терминал
  • стандарт C имеет функции для преобразования "широкого" символы, которые будут доступны на любой Unix-подобной платформе (см., например, setlocale , wcrtomb и wcsrtombs )
3
20.08.2021, 11:54

Si el emulador de terminal está bien -diseñado y configurado adecuadamente, garantizará que el valor de la variable de entorno LC_CTYPEse establezca en un valor que sea consistente con su codificación. Desafortunadamente, en la práctica, la verificación LC_CTYPEno siempre es confiable :, puede no estar configurada o ser incorrecta. (Otras variables de entorno pueden transmitir la configuración regional, consulte ¿En qué debo configurar mi configuración regional y cuáles son las implicaciones de hacerlo? para más detalles.)

Si tiene alguna idea de qué codificaciones de caracteres son probables, puede determinar la codificación a través de la heurística. Muestra una cadena de bytes que tiene un ancho diferente en diferentes codificaciones y descubre cuánto hace que se mueva el cursor. Esto no lo ayudará en todos los casos, por ejemplo, no puede distinguir entre codificaciones de un solo byte -. Pero si para usted las únicas dos posibilidades probables son UTF -8 y una codificación heredada, eso funciona bien. En el inicio de mi shell, configuré LC_CTYPEde esta manera, usando un script widthofque publiqué en Obtener el ancho de visualización de una cadena de caracteres . widthof -1muestra una cadena de 4 -bytes que representa 2 caracteres en UTF -8, y en la que solo 3 bytes son caracteres latinos imprimibles -N. Por lo tanto, un ancho de 2 significa UTF -8 (o alguna otra codificación multibyte, lo cual no es probable para mí ), un ancho de 3 significa latín -N (sin forma de saber N ), y 4 significa una codificación de un solo byte -con caracteres imprimibles en el rango 128–159.

widthof -1
case $? in
  0) export LC_CTYPE=C;; # 7-bit charset
  2) locale_search.utf8.UTF-8;; # utf8
  3) locale_search.iso88591.ISO8859-1.latin1 '';; # 8-bit with nonprintable 128-159, we assume latin1
  4) locale_search.iso88591.ISO8859-1.latin1 '';; # some full 8-bit charset, we assume latin1
  *) export LC_CTYPE=C;; # weird charset
esac
0
20.08.2021, 11:54

Теги

Похожие вопросы