Idioma na saída netstat

5

Eu tenho um programa aqui, que depende da saída de netstat . Mais concreto: netstat -apn .

Aqui está um exemplo de uma saída normal.

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -

Um cliente meu tem alguma outra saída (como exemplo):

Proto Recv-Q Send-Q Endereço Local          Endereço Remoto         Estado      PID/Program name
tcp        0      0 0.0.0.0:111             0.0.0.0:*               OUÇA       -

Eu quero testar meu software com uma saída alterada de netstat , como a saída do cliente.

Portanto, a pergunta é: O que devo fazer para alterar o idioma de saída de netstat , para que eu possa reproduzir os erros, o cliente obtém?

Eu já tentei alterar o idioma com export LANG=pt_PT , mas a saída não mudou.

    
por kristian 14.10.2015 / 10:43

2 respostas

6

Primeiro, você precisa ter certeza de que sua máquina tem o local necessário configurado. Você pode ver as localidades disponíveis com locale -a . Por exemplo, no meu sistema:

$ locale -a
C
C.UTF-8
el_GR.utf8
en_US.utf8
fr_FR.utf8
POSIX

Como você pode ver acima, eu não tenho a localidade portuguesa. No meu Debian, eu posso criá-lo executando sudo dpkg-reconfigure locales e escolhendo a localidade relevante:

Configuração do pacote

 ┌──────────────────────────┤ Configuring locales ├──────────────────────────┐  
 │ Locales are a framework to switch between multiple languages and allow    │  
 │ users to use their language, country, characters, collation order, etc.   │  
 │                                                                           │  
 │ Please choose which locales to generate. UTF-8 locales should be chosen   │  
 │ by default, particularly for new installations. Other character sets may  │  
 │ be useful for backwards compatibility with older systems and software.    │  
 │                                                                           │  
 │ Locales to be generated:                                                  │  
 │                                                                           │  
 │    [ ] pt_BR.UTF-8 UTF-8                                              ↑   │  
 │    [ ] pt_PT ISO-8859-1                                               ▒   │  
 │    [*] pt_PT.UTF-8 UTF-8                                              ▮   │  
 │    [ ] pt_PT@euro ISO-8859-15                                         ▒   │  
 │    [ ] quz_PE UTF-8                                                   ↓   │  
 │                                                                           │  
 │                                                                           │  
 │                    <Ok>                        <Cancel>                   │  
 │                                                                           │  
 └───────────────────────────────────────────────────────────────────────────┘  

Depois de pressionar Enter , você deve obter:

$ sudo dpkg-reconfigure locales
Generating locales (this might take a while)...
  el_GR.UTF-8... done
  en_US.UTF-8... done
  fr_FR.UTF-8... done
  pt_PT.UTF-8... done
Generation complete.

Se você não estiver usando uma distribuição baseada no Debian, você precisará fazer isso manualmente:

  1. Adicione o nome do local relevante a /etc/locale.gen . Por exemplo:

    pt_PT.UTF-8 UTF-8
    
  2. Executar locale-gen

Após as etapas acima (seja a abordagem manual ou a dpkg-reconfigre locales one), locale -a também listará a localidade portuguesa:

$ locale -a
C
C.UTF-8
el_GR.utf8
en_US.utf8
fr_FR.utf8
POSIX
pt_PT.utf8

Agora, você pode escolher em qual saída de idioma é exibida:

$ LC_ALL=el_GR.utf8 date
Τετ 14 Οκτ 2015 12:34:28 μμ EEST
$ LC_ALL=fr_FR.utf8 date
mercredi 14 octobre 2015, 12:35:07 (UTC+0300)
$ LC_ALL=pt_PT.utf8 date
Qua Out 14 12:35:11 EEST 2015

No entanto, se um determinado programa é capaz de imprimir a saída na localidade selecionada, dependerá se ele foi traduzido; se o pacote é enviado com o arquivo de tradução .mo relevante. No caso de netstat , isso é /usr/share/locale/${LANG%_*}/LC_MESSAGES/net-tools.mo . No meu Debian, o local francês tem mas o português não:

$ ls /usr/share/locale/{fr,pt}/LC_MESSAGES/net*
ls: cannot access /usr/share/locale/pt/LC_MESSAGES/net*: No such file or directory
/usr/share/locale/fr/LC_MESSAGES/net-tools.mo

Por isso, posso executar netstat em francês:

$ LC_ALL=fr_FR.utf8 netstat -apn | head -n2
(Tous les processus ne peuvent être identifiés, les infos sur les processus
non possédés ne seront pas affichées, vous devez être root pour les voir toutes.)
Connexions Internet actives (serveurs et établies)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        PID/Program name

Mas não em português:

$ LC_ALL=pt_PT.utf8 netstat -apn | head -n2
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    
por 14.10.2015 / 11:43
4

Você precisa instalar o pacote de idioma para o idioma escolhido, caso contrário, o utilitário de tradução de texto ( gettext nos sistemas GNU ) não pode traduzir as mensagens para o idioma escolhido:

$ strace -fe trace=open sh -c 'LANGUAGE=fr_FR.utf8 netstat -tnlp'
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
Process 14847 attached
[pid 14847] open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
[pid 14847] open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
[pid 14847] open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
[pid 14847] open("/proc/3690/cmdline", O_RDONLY) = 5
[pid 14847] open("/proc/8579/cmdline", O_RDONLY) = 5
[pid 14847] open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
[pid 14847] open("/usr/share/locale/fr_FR.utf8/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 14847] open("/usr/share/locale/fr_FR/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 14847] open("/usr/share/locale/fr.utf8/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 14847] open("/usr/share/locale/fr/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 14847] open("/usr/share/locale-langpack/fr_FR.utf8/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 14847] open("/usr/share/locale-langpack/fr_FR/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 14847] open("/usr/share/locale-langpack/fr.utf8/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 14847] open("/usr/share/locale-langpack/fr/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
....
[pid 14847] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14847, si_status=0, si_utime=0, si_stime=2} ---
+++ exited with 0 +++

Você pode ver o processo tentando procurar em /usr/share/locale e /usr/share/locale-langpack para obter o texto de tradução para net-tools package (ao qual netstat pertence).

Agora, instale o pacote de idiomas para que funcione. No sistema Ubuntu:

sudo apt-get install language-pack-fr

Outro sistema, o pacote de idiomas relevante para o pacote pode ser incluído pelo próprio pacote, pelo menos no Debian e no Centos:

$ apt-file search /usr/share/locale/fr/LC_MESSAGES/net-tools.mo
net-tools: /usr/share/locale/fr/LC_MESSAGES/net-tools.mo

(No Centos você pode usar yum whatprovides )

Então:

$ strace -fe trace=open sh -c 'LANGUAGE=fr_FR.utf8 netstat -tnlp'
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
Process 15155 attached
[pid 15155] open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
[pid 15155] open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
[pid 15155] open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
[pid 15155] open("/proc/3690/cmdline", O_RDONLY) = 5
[pid 15155] open("/proc/8579/cmdline", O_RDONLY) = 5
[pid 15155] open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
[pid 15155] open("/usr/share/locale/fr_FR.utf8/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 15155] open("/usr/share/locale/fr_FR/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 15155] open("/usr/share/locale/fr.utf8/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 15155] open("/usr/share/locale/fr/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 15155] open("/usr/share/locale-langpack/fr_FR.utf8/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 15155] open("/usr/share/locale-langpack/fr_FR/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 15155] open("/usr/share/locale-langpack/fr.utf8/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 15155] open("/usr/share/locale-langpack/fr/LC_MESSAGES/net-tools.mo", O_RDONLY) = 3
[pid 15155] open("/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache", O_RDONLY) = 3
(Tous les processus ne peuvent être identifiés, les infos sur les processus
non possédés ne seront pas affichées, vous devez être root pour les voir toutes.)
Connexions Internet actives (seulement serveurs)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat       PID/Program name
....
[pid 15155] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=15155, si_status=0, si_utime=0, si_stime=3} ---
+++ exited with 0 +++

/usr/share/locale-langpack/fr/LC_MESSAGES/net-tools.mo existia, gettext() com sucesso para traduzir as mensagens.

Observe que nem todas as palavras podem ser traduzidas, minha cidade natal vi_VN locale não funcionou mesmo se eu instalei o language-pack-vi .

Você deve usar LC_ALL para substituir todas as outras configurações de localização, exceto IDIOMA no sistema GNU como acima.

    
por 14.10.2015 / 12:28