Ferramentas do usuário

Ferramentas do site


dicas_unix_e_etc

Boas práticas de programação Shell script

Como este tema tende a se tornar grande pra colocar aqui numa página com outros assuntos, optei por criar uma página só dele.

Recuperação de discos

Gosto muito de dois programas, o testdisk, capaz de recuperar partições, setor de boot e outras coisas, mas para recuperação de arquivos gostei mais do foremost. Interessante registrar ela aqui, pois é impressionante como eu nunca lembro o nome dela e sempre tenho que pesquisar um tempão até achar.

Expressões Regulares

Uma ótima referência on-line sobre o assunto: http://guia-er.sf.net

Expressão regular para colocar ponto de milhar em números até trilhões

 $ (echo 1234567890123; echo 1234) | sed -e 's/\([0-9]\{1,3\}\)\([0-9]\{3\}\)$/\1.\2/' \
 -e 's/\([0-9]\{1,3\}\)\([0-9]\{3\}\.[0-9]\{3\}\)$/\1.\2/' \
 -e 's/\([0-9]\{1,3\}\)\([0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\)$/\1.\2/' \
 -e 's/\([0-9]\{1,3\}\)\([0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\)$/\1.\2/'

 1.234.567.890.123
 1.234

Notem que essa é a sintaxe para uso com o sed. Em várias outras ferramentas, como perl por exemplo, a sintaxe muda um pouco. No perl não seria necessário usar a barra de escape nos parêntesis e chaves. Notem ainda que não se trata de apenas uma expressão, é a aplicação seqüencial de 4 expressões regulares que dá o resultado esperado. Talvez dê para reduzir isso, mas não parei pra pensar por falta de tempo e por que essa já resolveu meu problema.

Scripts

Upload de arquivos

Este é na verdade um conjunto de scripts combinando shell e php para upload de arquivos em grande número e possivelmente grandes. A necessidade surgiu para enviar arquivos a partir de uma rede fechada por firewall, que não permitia upload de arquivos via FTP. Para usar HTTP temos dois problemas, o upload é via formulário e não suporta grandes volumes de dados em geral.

A solução final tem 2 scripts na origem, que podem receber uma lista grande de arquivos grandes para upload. O script principal verifica o tamanho do arquivo, parte se necessário, envia cada parte ou cada arquivo, providencia a junção das partes no destino e registra o sucesso ou fracasso de cada upload, verificando isso via checksum com hash md5. Se o arquivo final foi corretamente enviado ou juntado (no caso de ter sido partido) o arquivo é renomeado com um prefixo “foi-”.

Inicialmente é necessário configurar o script principal da origem para indicar a url de upload, parâmetros do proxy, localização de comandos e limite de tamanho a partir do qual deve se partir os arquivos. Um pré-requisito básico, algumas vezes não encontrado no sistema de origem, é o comando wget.

Tanto o sistema origem como destino precisa ser unix-like, embora o php no destino possa ser refeito para evitar essa necessidade no destino. Na origem é um pouco mais complicado fugir do shell, mesmo por que, no meu caso pelo menos, o wget foi a única ferramenta que conseguiu passar com sucesso pelo proxy. Cheguei a tentar http_post_data do pacote pecl do php, sem sucesso.

Scripts na origem

post.sh - script principal. Deve ser configurado inicialmente. É quem deve ser executado, passando na própria linha de comando os arquivos que devem ser enviados ao destino.

post.php - script auxiliar que codifica o arquivo original em base64 para envio. É necessário interpretador php de linha de comandos para executá-lo.

Script no destino

recebe.php - recebe, decodifica e junta os arquivos enviados.

Melhorias interessantes

  • recuperação de falhas nos casos de erro de transmissão
  • interrupção limpa no meio do processo com limpeza local e remota de “resíduos”

Detectando Código de Tecla no Xorg

Já precisei reconfigurar arquivo de mapeamento de teclado por não encontrar um arquivo que mapeasse corretamente algum teclado. As vezes fica faltando só uma teclinha que não funciona e mesmo depois de testar vários arquivos de mapeamento a maldita tecla nunca funciona. Para estes casos há o comando “xev”, que abre uma pequena janela no xorg e vai mostrando, na janela do shell de onde foi chamado, uma série de informações referentes a cada “Evento do X” (daí o nome X Ev - X Events). No meio das muitas informações aparece lá o “keycode” que precisa ser usado no arquivo a ser usado no xmodmap, por exemplo. Daí é só acertar o arquivo. Hoje, por exemplo, coloquei a linha:

 keycode 211 = slash question degree questiondown

Naturalmente fui prático e copiei o texto necessário de outra linha, apenas alterando o código da tecla para 211. Botei na ordem, pois não sei se isso faz diferença. Como os códigos no meu arquivo só iam até 134 esta ficou sendo a última linha dos códigos. Depois delas ainda haviam algumas outras, mas não de códigos e respectivas funções.

Depois do arquivo pronto bastou um comando tipo:

 $ xmodmap .Xmodmap.abnt2

e o mapeamento ficou correto, já que o único problema era essa tecla que continha a barra e o interrogação.

Outras alternativas ao xev:

  • showkey
  • evtest

Colando texto sem acentos no VI/VIM

Um problema que tenho há ANOS é colar texto em um editor vi/vim em um terminal numa janela gráfica. Pode ser que o problema não ocorra em outras combinações de ferramentas, então vale mencionar que uso vi (vim) em um xterm num XFCE com teclado brasileiro. O sistema está todo configurado pra acentuar normalmente, afinal redijo textos como este aqui, em português, que precisam de acentos. Quando vou colar códigos ou qualquer outros textos, porém, é comum aparecerem textos entre aspas “ ou plics ' e aí, na hora de colar, se vem um plic e um “a”, por exemplo, o que sai é uma letra acentuada “á” e ainda some o plic que era necessário pra delimitar o texto. Exemplo: Ao colar o texto
“Um elemento importante” aparece
Üm elemento importante” Pra resolver isso temos que desativar tanto a acentuação no ambiente gráfico (X Windows) quanto no VI:

  • Com esse comando a acentuação no X é desativada:

$ setxkbmap -layout us -variant mac Só cuidado, pois as teclas especiais vão ficar fora do lugar. Pode tentar achar outro modelo de teclado mais parecido, mas não tive grandes problemas com isso, o que precisei consegui encontrar.

  • Ao chamar o VIM use a opção -u NONE pra que ele não leia configurações e plugins, evitando acentuação interna que pode estar configurada nele:

$ vi -u NONE seu_arquivo.txt

  • Depois que terminar é só voltar o teclado. O meu é esse aqui (teclado brasileiro mais comum hoje em dia, que tem tecla “ç”):

$ setxkbmap -model abnt2 -layout br -variant abnt2 Se não conseguir restaurar pode tentar reconfigurar na interface gráfica mesmo ou, no pior caso, deve voltar ao normal após um reboot, o que não é realmente uma boa opção. O ideal é descobrir o modelo, leiaute e variante do seu teclado.

Apresentações

Instalações de Aplicativos

Acertando acentos, teclas erradas de teclado e cedilha

É importante saber que as configurações de acentuação e teclado são diferentes para o ambiente gráfico e a console do sistema. Aqui vou falar primeiro do ambiente gráfico (X11/Xorg).

Acentos em geral

Primeiro recomendo acertar o teclado em uso e isso pode variar dependendo do gerenciador de janelas usado. O ambiente gráfico no *nix é um pouco diferente do que alguns podem ter visto no Rwindows. Existe uma camada de servidor, o X11, sobre a qual rodam os gerenciadores de janela específicos, como: Gnome, KDE, XFCE e muitos, muitos outros. Cada um tem uma forma diferente de configurar o leiaute de teclado.

XFCE - tenho usado atualmente o XFCE, que tem um aplicativo para configuração de teclado. Pra usar ele é só ir no menu e digitar teclado (ou keyboard se estiver em inglês) e chamar o aplicativo com este nome. Dentro dele, na aba “Disposição”, é possível configurar tanto o tipo de teclado que está em uso (105 teclas padrão, por exemplo) como o leiaute de teclas, por exemplo, Inglês EUA internacional com teclas mortas ou Português (Brasil). Em alguns casos depois dessa correta configuração já está tudo resolvido. Se você não sabe exatamente qual é o seu teclado, vale uma pesquisa e alguns testes pra ver se acerta por aí.

Teclas erradas

Dependendo do teclado que você está usando, pode ser que os acentos estejam todos corretos, mas que alguma tecla não esteja funcionando ou esteja trocada. O mais comum é que isso aconteça com teclas de símbolos como a barra “/”, a barra vertical “|” etc. O modo mais prático de acertar esse problema pontual é usar o xmodmap. Esse é um bom tutorial que encontrei e de onde peguei as dicas abaixo.

  • xev - use esse comando para descobrir o keycode da(s) tecla(s) que quer que tenha alguma função ou que está errada
  • xmodmap -pke - vai mostrar todas as configurações atuais. Pode jogar num arquivo pra analisar

Depois disso você pode criar um arquivo de xmodmap. Basta usar a saída do “xmodmap -pke”. Pode usar apenas as linhas que interessam, alterando de acordo com o que precisa. Tendo esse arquivo, digamos, com o nome xmodmap.meu basta carregá-lo com “xmodmap xmodmap.meu” É possível colocar esse arquivo para ser carregado na entrada, mas novamente isso vai depender do gerenciador de janelas usado.

Cedilha (cedilla) errado

Em alguns casos o cedilha ainda fica incorreto: “ć” e “Ć”. Isso acontece normalmente em teclados americanos (que não tem a tecla cedilha) onde acentuamos com ' + c.

Solução 1 \\Editar o arquivo /etc/environment inserindo as linhas abaixo:

GTK_IM_MODULE=cedilla
QT_IM_MODULE=cedilla

e reiniciando o computador em seguida.

Solução 2 \\Editar o arquivo /usr/share/X11/locale/en_US.UTF-8/Compose e colocar os caracteres corretos (copie da internet, daqui por exemplo) nos lugares onde tem <dead_acute> <c>

<dead_acute> <C>                        : "Ç"   U0106 # LATIN CAPITAL LETTER C WITH ACUTE
<Multi_key> <acute> <C>                 : "Ç"   U0106 # LATIN CAPITAL LETTER C WITH ACUTE
<Multi_key> <apostrophe> <C>            : "Ç"   U0106 # LATIN CAPITAL LETTER C WITH ACUTE
<Multi_key> <C> <apostrophe>            : "Ç"   U0106 # LATIN CAPITAL LETTER C WITH ACUTE
<dead_acute> <c>                        : "ç"   U0107 # LATIN SMALL LETTER C WITH ACUTE
<Multi_key> <acute> <c>                 : "ç"   U0107 # LATIN SMALL LETTER C WITH ACUTE
<Multi_key> <apostrophe> <c>            : "ç"   U0107 # LATIN SMALL LETTER C WITH ACUTE
<Multi_key> <c> <apostrophe>            : "ç"   U0107 # LATIN SMALL LETTER C WITH ACUTE

Solução 3
* Em sistemas 64 bits edite os arquivos (se existirem - pois não achei isso em versões mais recentes): /usr/lib/x86_64-linux-gnu/gtk-3.0/3.0.0/immodules.cache /usr/lib/x86_64-linux-gnu/gtk-2.0/2.10.0/immodules.cache

  • Em sistemas 32 bits edite o arquivo:

/usr/lib/i386-linux-gnu/gtk-2.0/2.10.0/immodules.cache

  • Altere as linhas onde tem cedilla colocando o idioma “en” no final, junto com os outros, separando com dois pontos “:”

“cedilla” “Cedilla” “gtk20” “/usr/share/locale” “az:ca:co:fr:gv:oc:pt:sq:tr:wa:en”

Controle de versões com Subversion (svn)

Por enquanto não vou cobrir aqui a instalação, apenas o uso.

Criando um repositório

No servidor
svnadmin create /<caminho pra raiz dos repos>/<novo repo>

checkout de um repositório

O checkout (co) pode ser usado para iniciar o uso de um repositório ainda vazio ou continuar os trabalhos num repositório.

No cliente

  • svn co svn+ssh:<usuario>@<servidor>/<raiz dos repos>/<repo> * svn co https:<usuario>@<servidor>/<raiz web dos repos>/<repo>

Para funcionar com HTTP ou HTTPS o servidor precisa ter sido configurado para tal. No momento dessa configuração é definida a “raiz web dos repos”, que não precisa ser igual ao caminho no disco dessa raiz e normalmente não é.

commit - enviando arquivos para o repositório

Nesse caso normalmente não é necessário especificar o protocolo (https, svn+ssh, …) pois a cópia local já guarda em suas configurações o que foi usado. No cliente

  • svn ci -m “mensagem de commit” [arquivos …]

Os nomes de arquivos podem ser omitidos e ficará implícito o diretório corrente “.”, que será percorrido recursivamente para o envio das modificações.

outros comandos

Com o comando

svn help

você obtém a lista dos demais comandos disponíveis. Com o comando “svn help <comando>” você obtém ajuda sobre um comando específico do svn. Por exemplo: svn help co

dicas_unix_e_etc.txt · Última modificação: 2018/10/30 09:37 por cartola