[ anterior ] [ Conteúdo ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ próximo ]


Referência Debian
Capítulo 8 - Dicas Debian


8.1 Iniciando o sistema

Consulte o BootPrompt-HOWTO do LDP para obter informações detalhadas sobre o prompt de inicialização.


8.1.1 "Eu esqueci a senha do root !" (1)

É possível iniciar um sistema e logar com a conta do root sem conhecer a senha do root se você tiver acessso ao teclado do console. (Isto assume que não há requerimentos de senhas da BIOS e de um carregador de inicialização como o lilo que o impediriam de iniciar o sistema.)

Este é um procedimento que não requer discos de inicialização externos e nenhuma mudança nas configurações de inicialização. Aqui, "Linux" é o rótulo para inicializar o kernel Linux na instalação Debian padrão.

Na tela de inicialização do lilo, assim que boot: aparecer (você deve pressionar a tecla shift neste momento em alguns sistemas para prevenir a inicialização automática), digite :

     boot: Linux init=/bin/sh

Isso faz com que o sistema inicie o kernel e execute /bin/sh ao invés de seu padrão init. Agora você ganhou privilégios de root e um shell de root. Uma vez que o / estará atualmente montado como somente-leitura e muitas partições de disco ainda não foram montadas, você deve fazer o seguinte para conseguir um sistema razoavelmente funcional.

     init-2.03# mount -n -o remount,rw /
     init-2.03# mount -avt nonfs,noproc,nosmbfs
     init-2.03# cd /etc
     init-2.03# vi passwd
     init-2.03# vi shadow

(Caso o segundo campo de dados em /etc/passwd seja "x" para cada nome de usuário, seu sistema usa senhas shadow e você deve editar o arquivo /etc/shadow.) Para desabilitar a senha do root, edite o segundo campo de dados no arquivo de senhas de maneira a deixá-lo vazio. Agora o sistema pode ser reiniciado e você pode logar como root sem uma senha. Quando inicia no nível de execução 1, o Debian (pelo menos depois do Potato) requer uma senha, o que algumas distribuições mais antigas não requerem.

É uma boa idéia ter um editor mínimo em /bin/ caso o /usr/ não esteja acessível (consulte Editores de recuperação, Seção 11.2).

Considere também instalar o pacote sash. Quando o sistema ficar em um estado não-inicializável, execute :

     boot: Linux init=/bin/sash

O sash funciona como um substituo interativo para o sh mesmo quando o /bin/sh está inutilizável. Ele é estaticamente ligado e inclui muitos utilitários padrões embutidos (tecle "help" no prompt para uma lista de referência).


8.1.2 "Eu esqueci a senha do root !" (2)

Inicie a partir de qualquer conjunto de disco de boot/root. Caso /dev/hda3 seja a partição raiz original, os comandos a seguir irão lhe permitir editar o arquivo de senhas tão facilmente quanto da maneira citada acima.

     # mkdir fixit
     # mount /dev/hda3 fixit
     # cd fixit/etc
     # vi shadow
     # vi passwd

A vantagem deste método em relação ao método anterior é que você não precisa conhecer a senha do lilo (caso exista). Mas para usar este método você deve ser capaz de acessar o setup da BIOS e permitir o sistema iniciar a partir de um disquete ou de um CD, caso isto já não esteja configurado.


8.1.3 Não posso iniciar o sistema

Sem problemas, mesmo caso você não tenha se preocupado em criar um disco de inicialização durante a instalação. Caso o lilo esteja quebrado, pegue o disco de inicialização do conjunto de instalação Debian e inicie seu sistema a partir do mesmo. No prompt de inicialização, assumindo que a partição raiz de sua instalação Linux esteja em /dev/hda12 e você queira o nível de execução 3, digite :

     boot: rescue root=/dev/hda12 3

Você irá iniciar então em um sistema quase que complementamente funcional usando o kernel no disquete. (Podem existir problemas menores devido a falta de recursos ou módulos do kernel.)

Veja também Instalar um pacote em um sistema não iniciável, Seção 6.3.6 se tiver um sistema quebrado.

Caso você precise de um disquete de inicialização personalizado, siga as instruções de readme.txt no disco de recuperação.


8.1.4 "Deixe-me desabilitar o X na inicialização !"

Acompanhar a unstable/sid é divertido, mas uns xdm, gdm, kdm e wdm com bugs iniciados durante o processo de inicialização podem lhe deixar mal.

Primeiro obtenha o shell de root informando o seguinte no prompt de inicialização :

     boot: Linux vga=normal s

Aqui, Linux é o rótulo para a imagem de kernel através da qual você está inicializando; "vga=normal" irá certificar-se de que o lilo execute em vídeo VGA comum e "s" (ou "S") é o parâmetro passado ao init para invocar o modo monousuário. Informe a senha de root no prompt.

Existem algumas maneiras de desabilitar todos os daemons X que iniciam :

Aqui, o número em rc2.d deve corresponder ao nível de execução especificado em /etc/inittab. Também, ?dm significa que você precisa executar o comando várias vezes substituindo-o com todos entre xdm, gdm, kdm e wdm.

Somente o primeiro é "a verdadeira maneira" no Debian. O último é fácil mas funciona somente no Debian e requer que você configure o display manager novamente depois usando dpkg-reconfigure. Os outros são métodos genéricos para desabilitar daemons.

Você ainda pode iniciar o X através do comando startx a partir de qualquer console shell.


8.1.5 Outros truques de inicialização com o prompt de inicialização

O sistema pode ser iniciado em um nível de execução e configuração particulares usando o prompt de inicialização do lilo. Detalhes são dados no BootPrompt-HOWTO (LDP).

Caso você queira iniciar o sistema no nível de execução 4, use o seguinte no prompt de inicialização do lilo.

     boot: Linux 4

Caso você queira iniciar o sistema em modo monousuário funcionando normalmente e você conhece a senha de root, um dos exemplos a seguir no prompt de inicialização do lilo funcionará.

     boot: Linux S
     boot: Linux 1
     boot: Linux -s

Caso você queira iniciar o sistema com uma quantidade de memória inferior a quantidade de memória que o sistema possui fisicamente (digamos, 48MB para um sistema com 64MB), use o seguinte no prompt de inicialização do lilo :

     boot: Linux mem=48M

Certifique-se de não especificar mais do que a quantidade de memória que você possui fisicamente ou o kernel irá travar. Se você possui mais de 64MB de memória, por exemplo, 128MB, a menos que você execute mem=128M ou inclua uma linha adicional similar em /etc/lilo.conf, kernels antigos e/ou placas-mãe com uma BIOS antiga não utilizarão a memória acima de 64MB.


8.1.6 Definindo parâmetros de inicialização do GRUB

O GRUB é um novo gerenciador de inicialização do projeto Hurd e é muito mais flexível do que o Lilo, mas possui uma forma diferente de lidar com os parâmetros de inicialização.

     grub> find /vmlinuz
     grub> root (hd0,0)
     grub> kernel /vmlinuz root=/dev/hda1
     grub> initrd /initrd
     grub> boot

Aqui, você deve conhecer os nomes de dispositivos Hurd :

     o Hurd/GRUB         Linux               MSDOS/Windows
      (fd0)               /dev/fd0            A:
      (hd0,0)             /dev/hda1           C: (geralmente)
      (hd0,3)             /dev/hda4           F: (geralmente)
      (hd1,3)             /dev/hdb4           ?

Consulte /usr/share/doc/grub/README.Debian.gz e /usr/share/doc/grub-doc/html/ para maiores detalhes.


8.2 Gravando atividades


8.2.1 Gravando atividades shell

Administração de sistema envolve tarefas muito mais elaboradas em um ambiente Unix do que em um computador pessoal comum. Certifique-se de conhecer os meios mais básicos de configuração caso você precise recuperar um sistema com problemas. Ferramentas de configuração baseados em X11 possuem uma boa aparência e são convenientes mas geralmente não podem ser utilizadas nessas situações de emergência.

Neste contexto, gravar atividades shell é uma boa prática, especialmente como root.

Emacs: Use M-x shell para iniciar gravando em um buffer, e use C-x C-w para gravar o conteúdo do buffer para um arquivo.

Shell: Use o comando screen com "^A H" como descrito em Mudança de console com screen, Seção 8.6.27; ou use o comando script.

     $ script
     Script started, file is typescript
      ... faça qualquer coisa ...
      Ctrl-D
     $ col -bx <typescript >savefile
     $ vi savefile

O comando a seguir pode ser usado ao invés do script :

     $ bash -i 2>&1 | tee typescript

8.2.2 Gravando atividades no X

Caso você precise gravar a imagem gráfica de uma aplicação X, incluindo um display xterm, use o gimp (GUI). Ele pode capturar cada janela ou a tela toda. Alternativas são o xwd (xbase-clients), import (imagemagick) e scrot (scrot).


8.3 Copiar e arquivar um subdiretório inteiro


8.3.1 Comandos básicos para copiar um subdiretório inteiro

Caso você precise rearranjar a estrutra de arquivos, mova o conteúdo incluindo ligações de arquivos usando :

     Método padrão :
     # cp -a /diretório/fonte /diretório/destino # requer o GNU cp
     # (cd /diretório/fonte && tar cf - . ) | \
             (cd /diretório/destino && tar xvfp - )
     Caso uma ligação direta (hard link) esteja envolvida, um método pedante é necessário :
     # cd /caminho/para/diretório/antigo
     # find . -depth -print0 | afio -p -xv -0a /ponto/montagem/do/novo/diretório
     Caso remoto:
     # (cd /diretório/fonte && tar cf - . ) | \
             ssh usuário@máquina.domínio (cd /diretório/destino && tar xvfp - )
     Caso não existam arquivos ligados :
     # scp -pr usuário1@máquina1.domínio:/diretório/fonte \
               usuário2@máquina2.domínio:/diretório/destino

Aqui, scp <==> rcp e ssh <==> rsh.

A comparação informativa a seguir sobre copiar um subdiretório inteiro foi apresentada por Manoj Srivastava srivasta@debian.org na lista de discussão debian-user@lists.debian.org.


8.3.2 cp

Tradicionalmente, o cp não era um candidato para esta tarefa uma vez que ele não desreferenciava ligações simbólicas ou preservava ligações diretas (hard links). Outra coisa a considerar eram arquivos esparsos (arquivos com buracos).

O cp GNU superou estas limitações; porém, em um sistema não-GNU, o cp poderia continuar a ter problemas. Adicionalmente, você não pode gerar arquivos pequenos e portáveis usando o cp.

     % cp -a . novodiretório

8.3.3 tar

O Tar superou alguns dos problemas que o cp tinha com ligações simbólicas. Porém, apesar do cpio lidar com arquivos especiais, o tar tradicional não o faz.

A maneira do tar lidar com mútiplas ligações diretas para um arquivo é colocar somente uma cópia da ligação na fita, mas o nome anexado a esta cópia é o único que você pode usar para recuperar o arquivo; a maneira do cpio é colocar uma cópia para cada ligação, mas você pode recuperá-lo usando quaisquer dos nomes.

O comando tar mudou sua opção para arquivos .bz2 entre o Potato e o Woody, portanto, use --bzip2 em scripts ao invés de sua forma abreviada -I (Potato) ou -j (Woody).


8.3.4 pax

O novo, cantante e dançante Utilitário de Troca de Arquivos Portável, compatível com os padrões POSIX (IEEE Std 1003.2-1992, páginas 380–388 (seção 4.48) e páginas 936–940 (seção E.4.48)). O pax irá ler, gravar e listar os membros de um arquivo e irá copiar hierarquias de diretórios. A operação do pax é independente do formato específico do arquivo e suporta uma grande variedade de formatos de arquivo.

As implementações do pax ainda são novas.

     # apt-get install pax
     $ pax -rw -p e . novodiretório
      ou
     $ find . -depth  | pax -rw -p e  novodiretório

8.3.5 cpio

O cpio copia arquivos em ou de um arquivo cpio ou tar. O arquivo pode ser outro arquivo no disco, uma fita magnética ou um pipe.

     $ find . -depth -print0 | cpio --null --sparse -pvd novo-diretório

8.3.6 afio

O afio é uma maneira melhor de lidar com arquivo no formato cpio. Ele é geralmente mais rápido do que o cpio, oferece opções de fita magnética mais diversas e lida de maneira graciosa com corrupção de dados de entrada. Ele suporta arquivo em múltiplos volumes durante a operação interativa. O afio pode criar arquivos comprimidos que são muito mais seguros do que arquivo comprimidos tar ou cpio. O afio é melhor usado como um "mecanismo de arquivo" em um script de backup.

     $ find . -depth -print0 | afio -px -0a novo-diretório

Todos os meus backups em fita utilizam o afio.


8.4 Backups diferenciais e sincronização de dados

Backups diferenciais e sincronização de dados podem ser implementados com diversos métodos :

A combinação de um desses com o método descrito em Copiar e arquivar um subdiretório inteiro, Seção 8.3 e a atividade regular automatizada descrita em Agendar atividade (cron, at), Seção 8.6.26 farão um bom sistema de backup.

Explicarei três utilitários de fácil uso.


8.4.1 Backup diferencial com rdiff

O rdiff-backup oferece backup legal e simples com histórico diferencial para quaisquer tipos de arquivos incluindo ligações simbólicas. Para fazer backup da maioria de ~/ para /mnt/backup:

     $ rdiff-backup --include ~/tmp/keep --exclude ~/tmp  ~/ /mnt/backup

Para restaurar dados de três dias atrás do arquivo para ~/old:

     $ rdiff-backup -r 3D /mnt/backup ~/old

Consulte rdiff-backup(1).


8.4.2 Backup diário com pdumpfs

O pdumpfs é um sistema de backup diário simples similar ao dumpfs do Plan9 que preserva todo estado diário. Você pode acessar estados (snapshots) antigos a qualquer momento para obter um arquivo de um certo dia. Vamos fazer um backup de seu diretório home com o pdumpfs e o cron!

O pdumpfs constrói o estado (snapshot) YYYY/MM/DD (ano/mês/dia) no diretório destino. Todos os arquivos fontes são copiados para o diretório do snapshot quando o pdumpfs é executado pela primeira vez. Na segunda vez e depois, o pdumpfs copia apenas os arquivos recém criados ou atualizados e grava os arquivos não modificados como ligações diretas para os arquivos do snapshot do dia anterior para economizar espaço em disco.

     $ pdumpfs dir-fonte dir-dest [nomebase-dest]

Consulte pdumpfs(8).


8.4.3 Backup diferencial regular com RCS

O Changetrack irá gravar regularmente as mudanças nos arquivos de configurações baseados em texto em arquivos RCS. Consulte changetrack(1).

     # apt-get install changetrack
     # vi changetrack.conf

8.5 Recuperação de sistema paralizado


8.5.1 Matar um processo

Execute o top para ver qual processo está agindo de forma engraçada. Pressione `P' para ordenar por uso de CPU, `M' para ordenar por memória e `k' para matar um processo. Alternativamente, o comando estilo BSD ps aux | less ou estilo System V ps -efH | less podem ser usados. A sintaxe estilo System V exibe o ID (PPID) do processo pai que pode ser usado para matar os filhos zumbis (defunct).

Use o kill para matar (ou enviar um sinal para) um processo pelo ID do processo, killall para fazer o mesmo por nome de comando do processo. Sinais freqüentemente usados :

      1: HUP,  reinicia daemon
     15: TERM, kill normal
      9: KILL, kill forçado

8.5.2 Alt-SysRq

Garantia contra mal funcionamento do sistema é fornecida pela opção de compilação de kernel "Magic SysRq key". Pressionar Alt-SysRq em um i386, seguido por uma das teclas r 0 k e i s u b, faz a mágica.

Un`r'aw restaura o teclado após coisas como X travarem. Mudar o nível de log do console para `0' reduz mensagens de erros. sa`k' (tecla de administração de sistema) mata todos os processos no console virtual atual. t`e'rminate mata todos os processos no terminal atual exceto o init. k`i'll mata todos os processos exceto o init.

`S'ync, `u'mount e re`b'oot são para se livrar de situações realmente ruins.

Os kernels de instalação padrão Debian não são compilados com essa opção no momento em que este documento é escrito. Recompile o kernel para ativar esta função. Informações detalhadas podem ser encontradas em /usr/share/doc/kernel-doc-versão/Documentation/sysrq.txt.gz ou /usr/src/kernel-versão/Documentation/sysrq.txt.gz.


8.6 Belos pequenos comandos para se lembrar


8.6.1 Paginador

O less é o paginador padrão (navegador de conteúdo de arquivo). Pressione `h' para ajuda. Ele pode fazer muito mais do que o more. O less pode ser supercarregado executando eval $(lesspipe) ou eval $(lessfile) no script de inicialização do shell. Veja mais em /usr/share/doc/lessf/LESSOPEN. A opção -R permite saída de caracteres raw e habilita seqüências de escape de cores ANSI. Consulte less(1).

O w3m pode ser um paginador alternativo útil para alguns sistemas de códigos (EUC).


8.6.2 Memória livre

O free e o top oferecem boa informação sobre recursos de memória. Não se preocupe sobre o tamanho de "used" na linha "Mem:", e ao invés leia a abaixo dessa (38792 no exemplo abaixo).

     $ free -k # para uma máquina de 256MB
                  total       used       free     shared    buffers cached
     Mem:        257136     230456      26680      45736     116136 75528
     -/+ buffers/cache:      38792     218344
     Swap:       264996          0     264996

A quantidade exata de memória física pode ser confirmada com o comando grep '^Memory' /var/log/dmesg, que nesse caso exibe "Memory: 256984k/262144k available (1652k kernel code, 412k reserved, 2944k data, 152k init)".

     Total              = 262144k = 256M (1k=1024, 1M=1024k)
     Livre para o dmesg = 256984k = Total - kernel - reserved - data - init
     Livre para o shell = 257136k = Total - kernel - reserved - data

Aproximadamente 5MB de memória não pode ser usada pelo sistema devido ao kernel utilizá-la.


8.6.3 Definir a hora (BIOS)

     # date MMDDhhmmCCYY
     # hwclock --utc --systohc
     # hwclock --show

Isto irá definir a hora do sistema e de hardware para MM/DD hh:mm, CCYY. Horas são exibidas em tempo local mas a hora de hardware usa UTC.


8.6.4 Definir a hora (NTP)

Referência : HOWTO Gerenciando Data e Hora precisos.


8.6.4.1 Definir a hora com conexão Internet permanente

Ajustar o relógio do sistema para a hora correta automaticamente através de um servidor remoto :

     # ntpdate servidor

É bom ter esse comando em /etc/cron.daily/ caso seu sistema possua uma conexão Internet permanente.


8.6.4.2 Definir a hora com uma conexão Internet esporádica

Use o pacote chrony.


8.6.5 Como controlar recursos de console como o protetor de tela

Para desabilitar o protetor de tela, use os seguintes comandos.

No console Linux :

     # setterm -powersave off

Inicie o console kon2 (kanji) com :

     # kon -SaveTime 0

Executando o X :

     # xset s off
      ou
     # xset -dpms
      ou
     # xscreensaver-command -prefs

Leia as páginas de manual correspondentes para controlar outros recursos de console. Veja também a página de manual stty(1) para mudar e mostrar configurações de linha de terminal.


8.6.6 Procurar na base de dados administrativa

A Glibc oferece o getent(1) para procurar entradas nas bases de dados administrativas, isto é, passwd, group, hosts, services, protocols ou networks.

     getent base_de_dados [chave ...]

8.6.7 Desabilitar o som (beep)

Sempre é possível desconectar o alto-falante do PC. ;-) Para o shell Bash:

     echo "set bell-style none">> ~/.inputrc

8.6.8 Mensagens de erro na tela do console

Para acabar com as mensagens de erro na tela, o primeiro lugar a checar é /etc/init.d/klogd. Defina KLOGD="-c 3" nesse script e execute /etc/init.d/klogd restart. Um método alternativo é executar dmesg -n3.

Aqui os níveis de erro significam :

Caso uma mensagem de erro sem utilidade lhe incomode muito, considere fazer um patch para o kernel trivial como o shutup-abit-bp6 (disponível no subdiretório de exemplos).

Outro lugar a olhar pode ser o /etc/syslog.conf; cheque-o para ver se alguma mensagem é logada para um dispositivo console.


8.6.9 Definir o console para o tipo correto

Telas de console em sistemas semelhantes a Unix são normalmente acessadas usando as rotinas da biblioteca (n)curses. Estas fornecem ao usuário um método independente de terminal para atualizar caracteres de tela com razoável otimização. Consule ncurses(3X) e terminfo(5).

Em um sistema Debian, existem uma porção de entradas pré-definidas :

     $ toe | less                  # todas as entradas
     $ toe /etc/terminfo/ | less   # entradas reconfiguráveis pelo usuário

Exporte sua seleção como a variável de ambiente TERM.

Caso a entrada terminfo para o xterm não funcione com um xterm não-Debian, mude seu tipo de terminal de "xterm" para uma das versões limitadas em recursos como "xterm-r6" quando você logar em um sistema Debian remotamente. Consulte /usr/share/doc/libncurses5/FAQ para maiores informações. "dumb" é o menor denominador comum para terminfo.


8.6.10 Voltar o console ao estador normal

Quando a tela fica cheia de caracteres estranhos depois de um comando cat algum-arquivo-binário (você pode não ser capaz de ver o comando digitado enquanto você digita) :

     $ reset

8.6.11 Converter um arquivo texto DOS para o estilo Unix

Converter um arquivo texto DOS (fim-de-linha = ^M^J) para um arquivo texto Unix (fim-de-linha = ^J).

     # apt-get install sysutils
     $ dos2unix arquivo_dos

8.6.12 Substituição de expressões regulares

Substituir todas as instâncias de DE_REGEX por PARA_TEXTO em todos os arquivos ARQUIVOS ...:

     $ perl -i -p -e 's/DE_REGEX/PARA_TEXTO/g;' ARQUIVOS ...

-i é para edição "in-place", -p é para "loop implícito sobre ARQUIVOS ...". Caso a substituição seja complexa, você pode tornar a recuperação de erros mais fácil usando o parâmetro -i.bak ao invés de -i; isso irá manter cada arquivo original, adicionando .bak como uma extensão de arquivo.


8.6.13 Editar arquivo no local usando um script

O script seguinte removerá as linhas 5–10 e linhas 16–20 no local.

     #!/bin/bash
     ed $1 <<EOF
     16,20d
     5,10d
     w
     q
     EOF

Aqui, os comandos do ed são os mesmos comandos do command-mode do vi. Editar por trás do arquivo facilita a criação do script.


8.6.14 Extrair diferenças e juntar atualizações para os arquivos fonte

Seguir um desses procedimentos extrairá as diferenças entre dois arquivos fontes e criará arquivos diff unificados arquivo.patch0 ou arquivo.patch1 dependendo da localização dos arquivos:

     $ diff -u arquivo.antigo arquivo.novo1 > arquivo.patch0
     $ diff -u antigo/arquivo novo1/arquivo > arquivo.patch1

O arquivo diff (alternativamente chamado de arquivo patch) é usado para enviar atualizações de programas. O receptor aplicará esta atualização em outro arquivo usando :

     $ patch -p0 arquivo < arquivo.patch0
     $ patch -p1 arquivo < arquivo.patch1

Caso você possua três versões do código-fonte, você pode juntá-las mais efetivamente usando o diff3:

     $ diff3 -m meu.arquivo arquivo.antigo seu.arquivo > arquivo

8.6.15 Converter um arquivo grande em arquivos pequenos

     $ split -b 650m arquivo   # divide o arquivo em pedaços de 650MB
     $ cat x* >arquivogrande   # junta arquivos em 1 grande arquivo

8.6.16 Extrair dados de uma tabela em arquivo texto

Vamos considerar um arquivo texto chamado DPL em que os nomes de todos os líderes anteriores do projeto Debian e seus dias de iniciação são listados em um formato separado por espaços.

     Ian     Murdock   Agosto  1993
     Bruce   Perens    Abril   1996
     Ian     Jackson   Janeiro 1998
     Wichert Akkerman  Janeiro 1999
     Ben     Collins   Abril   2001
     Bdale   Garbee    Abril   2002
     Martin  Michlmayr Março   2003

O Awk é usado freqüentemente para extrair dados desses tipos de arquivo.

     $ awk '{ print $3 }' <DPL                   # mês de início
     Agosto
     Abril
     Janeiro
     Janeiro
     Abril
     Abril
     Março
     $ awk '($1=="Ian") { print }' <DPL          # DPL chamado Ian
     Ian     Murdock   Agosto  1993
     Ian     Jackson   Janeiro 1998
     $ awk '($2=="Perens") { print $3,$4 }' <DPL # Quando Perens começou
     Abril 1996

Shells como o Bash também podem ser usados para interpretar esse tipo de arquivo:

     $ while read primeiro ultimo mes ano; do
         echo $mes
       done <DPL
     ... mesma saída do primeiro exemplo Awk

Aqui, o comando interno (built-in) read usa os caracteres em $IFS (internal field separators) (separadores de campos internos) para dividir as linhas em palavras.

Se mudar IFS para ":", você pode interpretar o /etc/passwd com shell facilmente:

     $ oldIFS="$IFS"   # salva o valor antigo
     $ IFS=":"
     $ while read usuario senha uid gid resto_da_linha; do
         if [ "$usuario" = "osamu" ]; then
           echo "O ID de $usuario é $uid"
         fi
       done < /etc/passwd
     O ID de osamu é 1001
     $ IFS="$oldIFS"  # restaura o valor antigo

(Se o Awk for usado para fazer o mesmo, use FS=":" para definir o separador de campos.)

IFS também é usado pelo shell para dividir resultados de expansão de parâmetros, substituição de comandos, e expansão aritmética. Esses não ocorrem em palavras com aspas duplas ou simples (double or single quoted words). O valor padrão de IFS é <espaço>, <tab> e <nova_linha> combinados.

Tenha cuidado ao usar esses truques do IFS do shell. Coisas estranhas podem acontecer, quando o shell interpreta algumas partes do script como sua entrada.

     $ IFS=":,"                        # usa ":" e "," como IFS
     $ echo IFS=$IFS,   IFS="$IFS"     # echo é um comando interno (built-in) do Bash
     IFS=  , IFS=:,
     $ date -R                         # apenas uma saída de comando
     Sat, 23 Aug 2003 08:30:15 +0200
     $ echo $(date -R)                 # sub shell --> entrada para shell principal
     Sat  23 Aug 2003 08 30 36 +0200
     $ unset IFS                       # redefine IFS para o padrão
     $ echo $(date -R)
     Sat, 23 Aug 2003 08:30:50 +0200

8.6.17 Pequenos scripts para ligar comandos

Os scripts a seguir farão coisas legais como parte de um pipe.

     find /usr | egrep -v "/usr/var|/usr/tmp|/usr/local"
                          # encontra todos os arquivo em /usr excluindo alguns arquivos
     xargs -n 1 comando   # executa o comando para todos os itens de stdin
     xargs -n 1 echo |    # divide itens separados-por-espaços-em-branco em linhas
     xargs echo      |    # mescla todas as linhas em uma linha
     grep -e padrão|      # extrai linhas contendo padrão
     cut -d: -f3 -|       
             # extrai o terceiro campo separado por : (arquivo passwd etc.) 
     awk '{ print $3 }' | # extrai o terceiro campo separado por espaços
     awk -F'\t' '{ print $3 }' |
             # extrai terceiro campo separado por tab
     col -bx |            # remove backspace e expande tabs para espaços
     expand -|            # expande tabs
     sort -u|             # ordena e remove duplicados
     
     tr '\n' ' '|         # concatena linhas em uma linha
     tr '\r' ''|          # remove CR
     tr 'A-Z' 'a-z'|      # converte maiúsculas em minúsculas
     sed 's/^/# /'|       # torna cada linha um comentário
     sed 's/\.ext//g'|    # remove .ext
     sed  -n -e 2p|       # imprime a segunda linha 
     head -n 2 -|         # imprime as primeiras 2 linhas
     tail -n 2 -|         # imprime as últimas 2 linhas

8.6.18 Pequenos scripts para fazer loop para cada arquivo

As seguintes maneiras de fazer loop para cada arquivo do tipo *.ext asseguram a manipulação apropriada de nomes de arquivos engraçados como aqueles com espaços e executam processo equivalente:


8.6.19 Loucura de script Perl curto

Apesar de quaisquer scripts Awk poderem ser reescritos em Perl usando a2p(1), scripts Awk de uma linha são melhor convertidos para scripts perl de uma linha manualmente. Por exemplo

     awk '($2=="1957") { print $3 }' |

é equivalente a qualquer uma das seguintes linhas:

     perl -ne '@f=split; if ($f[1] eq "1957") { print "$f[2]\n"}' |
     perl -ne 'if ((@f=split)[1] eq "1957") { print "$f[2]\n"}' |
     perl -ne '@f=split; print $f[2] if ( $f[1]==1957 )' |
     perl -lane 'print $F[2] if $F[1] eq "1957"' |

Como todos os espaços nos argumentos para o perl na linha acima podem ser removidos, e tomando vantagem das conversões automáticas entre números e strings no Perl:

     perl -lane 'print$F[2]if$F[1]eq+1957' |

Veja perlrun(1) para detalhes sobre opções de linha de comando. Se quiser mais scripts Perl loucos, http://perlgolf.sourceforge.net pode ser interessante.


8.6.20 Obter texto ou arquivo de lista de discussão de uma página web

O comando a seguir irá ler uma página web em um arquivo texto. Muito útil quando copiando configurações da Web.

     $ lynx -dump http://www.remote-site.com/help-info.html >arquivotexto

O links e o w3m podem ser usados aqui também, com pequenas diferenças na renderização.

Caso esteja lidando com um arquivo de lista de discussão, use o munpack para obter conteúdos mime do texto.


8.6.21 Imprimir de forma bonita uma página web

O comando a seguir irá imprimir uma página Web em um arquivo/impressora Postscript :

     $ apt-get install html2ps
     $ html2ps URL | lpr

Consulte lpr/lpd, Seção 3.6.1. Confira também os pacotes a2ps e mpage para criar arquivos Postscript.


8.6.22 Imprimir de forma bonita uma página de manual

O comando a seguir irá imprimir uma página de manual em um arquivo/impressora Postscript :

     $ man -Tps alguma-página-de-manual | lpr
     $ man -Tps alguma-página-de-manual | mpage -2 | lpr

8.6.23 Juntar dois arquivos PostScript ou PDF

Você pode juntar arquivos PostScript ou PDF.

     $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite \
       -sOutputFile=bla.ps -f foo1.ps foo2.ps
     $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \
       -sOutputFile=bla.pdf -f foo1.pdf foo2.pdf

8.6.24 Contar o tempo de um comando

Exibir o tempo usado por um processo.

     # time algum-comando >/dev/null
     real    0m0.035s       # tempo no relógio de parede (tempo real decorrido)
     user    0m0.000s       # tempo em modo de usuário
     sys     0m0.020s       # tempo em modo kernel

8.6.25 Comando nice

Use o nice (do pacote GNU shellutils) para definir um valor de nice de um comando quando iniciá-lo. O renice (bsdutils) ou o top podem fazer o renice de um processo. Um valor nice de 19 representa o processo mais lento (a menor prioridade); valores negativos são "não-nice", com -20 sendo um processo bem rápido (alta prioridade). Somente o superusuário pode definir valores de nice negativos.

     # nice  -19 top                                         # muito "nice"
     # nice --20 cdrecord -v -eject speed=2 dev=0,0 disk.img # muito rápido

Algumas vezes um valor de nice extremo traz mais problemas do que melhorias para o sistema. Use esse comando com cuidado.


8.6.26 Agendar atividade (cron, at)

Use o cron e o at para agendar tarefas sob o Linux. Consulte at(1), crontab(5) e crontab(8).

Execute o comando crontab -e para criar ou editar um arquivo crontab para configurar eventos regularmente agendados. Exemplo de um arquivo crontab :

     # use /bin/sh para executar comandos, não importando o que o /etc/passwd diga
     SHELL=/bin/sh
     # envie por mail qualquer saída para `paul', não importando de quem seja esse crontab
     MAILTO=paul
     # Min Hora DiaDoMês Mês DiaDaSemana comando (Dia... são OU)
     # executa às 00:05, todos os dias
     5  0  *  * *   $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
     # executa às 14:15 no primeiro dia de cada mês -- saída enviada para paul
     15 14 1  * *   $HOME/bin/monthly
     # executa às 22:00 em dias de semana(1-5), saída para Joe. % para nova linha, último % para cc:
     0 22 *   * 1-5 mail -s "It's 10pm" joe%Joe,%%Onde estão suas crianças?%.%%
     23 */2 1 2 *   echo "executa 23 minutos depois de 0am, 2am, 4am ..., em 1 de Fevereiro"
     5  4 *   * sun echo "executa às 04:05 todo domingo"
     # executa às 03:40 na primeira Segunda-feira de cada mês
     40 3 1-7 * *   [ "$(date +%a)" == "Mon" ] && comando -argumentos

Execute o comando at para agendar uma atividade a ser executada apenas uma vez :

     $ echo 'comando -argumentos'| at 3:40 monday

8.6.27 Mudança de console com screen

O programa screen lhe permite executar múltiplos terminais virtuais, cada um com seu próprio shell interativo, em um único terminal físico ou janela de emulação de terminal. Mesmo caso você use consoles virtuais Linux ou múltiplas janelas xterm, vale a pena explorar o screen devido a seu abundante conjunto de recursos, os quais incluem


8.6.27.1 Cenários de acesso remoto

Caso você freqüentemente logue em uma máquina Linux de um terminal remoto ou usando um programa de terminal VT100, o screen irá tornar sua vida mais fácil com o recurso de detach.

  • Você está logado através de uma conexão discada e está executando uma sessão screen complexa com editores e outros programas abertos em diversas janelas.

  • Em certo momento você precisa deixar seu terminal, mas você não quer perder seu trabalho desconectando.

  • Simplesmente digite ^A d para separar a sessão e então faça o logout. (Ou, ainda mais rápido, digite ^A DD para fazer com que o screen separe e faça o logout dele mesmo.)

  • Quando você logar novamente posteriormente, digite o comando screen -r e o screen irá magicamente anexar todas as janelas que você deixou abertas.


  • 8.6.27.2 Comandos screen típicos

    Uma vez que você inicia o screen, toda a entrada de teclado é enviada para sua janela atual exceto as teclas de comando, por padrão ^A. Todos os comandos screen são informados digitando ^A mais uma única tecla [mais quaisquer parâmetros]. Comandos úteis :

         ^A ?     exibe uma tela de ajuda (exibe os mapeamentos de teclas)
         ^A c     cria uma nova janela e muda para ela
         ^A n     vai para a próxima janela
         ^A p     vai para a janela anterior
         ^A 0     vai para a janela número 0
         ^A w     exibe uma lista de janelas
         ^A a     envia um Ctrl-A para a janale atual como entrada de teclado
         ^A h     grava uma cópia "hard" da janela atual para arquivo 
         ^A H     inicia/finaliza log da janela atual para arquivo
         ^A ^X    trava o terminal (protegido por senha)
         ^A d     separa sessão screen do terminal
         ^A DD    separa a sessão screen e faz um logout
    

    Isto é somente um pequeno subconjunto dos comandos e recursos do screen. Caso exista alguma coisa que você queira que o screen seja capaz de fazer, as chances são que que possa fazê-lo ! Consulte screen(1) para maiores detalhes.


    8.6.27.3 Backspace e/ou Ctrl-H em sessão screen

    Se você achar que o backspace e/ou o Ctrl-H não funcionam corretamente quando você está executando o screen, edite /etc/screenrc, encontre a linha contendo

         bindkey -k kb stuff "\177"
    

    e comente-a (ou seja, adicione "#" como o primeiro caracter).


    8.6.27.4 Programa equivalente ao screen para X

    Confira o xmove. Consulte xmove(1).


    8.6.28 Testes de rede básicos

    Instale os pacotes netkit-ping, traceroute, dnsutils, ipchains (para kernel 2.2), iptables (para kernel 2.4) e net-tools e :

         $ ping yahoo.com            # checa a conexão Internet
         $ traceroute yahoo.com      # rastrea pacotes IP
         $ ifconfig                  # checa configuração do host
         $ route -n                  # checa configuração de roteamento
         $ dig [@servidor-dns.com] host.domínio [{a|mx|any}] |less
               # checa os registros DNS de host.domínio usando servidor-dns.com 
               # para um registro a {mx|any}
         $ ipchains  -L -n |less     # checa o filtro de pacotes (kernel 2.2)
         $ iptables -L -n |less      # checa o filtro de pacotes (kernel 2.4)
         $ netstat -a                # encontra todas as portas abertas
         $ netstat -l --inet         # encontra as portas em escuta
         $ netstat -ln --tcp         # encontra todas as portas TCP em escuta (numérico)
    

    8.6.29 Fazer flush em mensagens do spool local

    Para fazer um flush das mensagens do spool local :

         # exim -q    # faz flush em mensagens aguardando
         # exim -qf   # faz flush em todas as mensagens
         # exim -qff  # faz flush até mesmo em mensagens congeladas
    

    -qff pode ser melhor como uma opção no script /etc/ppp/ip-up.d/exim.


    8.6.30 Remover mensagens congeladas do spool local

    Para remover mensagens congeladas do spool local com uma mensagem de erro de entrega :

         # exim -Mg `mailq | grep frozen | awk '{ print $3 }'`
    

    8.6.31 Reentregar conteúdo mbox

    Você precisa entregar manualmente mensagens para caixas de mensagens ordenadas em seu diretório home a partir de /var/mail/username caso seu diretório home fique lotado e o procmail falhe. Depois de liberar espaço em disco no diretório home, execute :

         # /etc/init.d/exim stop
         # formail -s procmail </var/mail/nomedeusuário
         # /etc/init.d/exim start
    

    8.6.32 Limpar conteúdo de arquivo

    Para limpar o conteúdo de um arquivo como um arquivo de log, não use o rm para apagar o arquivo e então criar um novo arquivo vazio porque o arquivo pode estar sendo acessado no intervalo entre os comandos. O comando a seguir é uma maneira mais segura de limpar o conteúdo de um arquivo :

         $ :>arquivo-a-ser-limpo
    

    8.6.33 Arquivos Falsos

    Os comandos a seguir criarão arquivos falsos ou vazios :

         $ dd if=/dev/zero    of=nomedearquivo bs=1k count=5 # 5KB de conteúdo zero
         $ dd if=/dev/urandom of=nomedearquivo bs=1M count=7 # 7MB de conteúdo randômico
         $ touch nomedearquivo #  cria arquivo de 0B (caso o arquivo exista, atualiza seu mtime)
    

    Por exemplo, os seguintes comandos executados a partir do shell do disco de inicialização do Debian apagarão todo o conteúdo do disco rígido /dev/hda completamente para muitos usos práticos.

         # dd if=/dev/urandom of=/dev/hda ; dd if=/dev/zero of=/dev/hda
    

    8.6.34 chroot

    O programa chroot, chroot(8), nos possibilita executar diferentes instâncias do ambiente GNU/Linux em um único sistema simultaneamente sem reiniciar.

    Pode-se também executar um programa que exija muitos recursos como o apt-get ou o dselect sob o chroot de uma máquina host rápida enquanto montando por NFS uma máquina satélite lenta no host como leitura/escrita e o ponto de chroot sendo o ponto de montagem da máquina satélite.


    8.6.34.1 Executar um sabor diferente do Debian com chroot

    Um ambiente Debian chroot pode ser criado facilmente pelo comando debootstrap no Woody. Por exemplo, para criar um chroot Sid em /sid-root tendo acesso rápido à Internet:

         main # cd / ; mkdir /sid-root
         main # debootstrap sid /sid-root http://ftp.debian.org/debian/
         ... assista-o baixar o sistema inteiro
         main # echo "proc-sid /sid-root/proc proc none 0 0" >> /etc/fstab
         main # mount proc-sid /sid-root/proc -t proc
         main # cp /etc/hosts /sid-root/etc/hosts
         main # chroot /sid-root /bin/bash
         chroot # cd /dev; /sbin/MAKEDEV generic ; cd -
         chroot # apt-setup # configure /etc/apt/sources.list
         chroot # vi /etc/apt/sources.list # aponte a fonte para unstable
         chroot # dselect  # você pode usar aptitude, instalar o mc e o vim :-)
    

    Nesse ponto você deve ter um sistema Debian completamente funcional, onde pode mexer sem medo de afetar sua instalação Debian principal.

    Esse truque do debootstrap também pode ser usado para instalar o Debian em um sistema sem usar o disco de instalação do Debian, mas usando um de outra distribuição GNU/Linux. Veja http://www.debian.org/releases/stable/i386/apcs04.


    8.6.34.2 Configurando o login para chroot

    Digitar chroot /sid-root /bin/bash é fácil, mas isso mantém todos os tipos de variáveis de ambiente atribuídas que você pode não desejar, e tem outros problemas. Uma maneira muito melhor é executar outro processo de login em um terminal virtual separado onde você pode logar no chroot diretamente.

    Como em sistemas Debian padrões, do tty1 ao tty6 são executados consoles Linux e no tty7 é executado o Sistema X Window, vamos definir o tty8 para um console chroot'ado como um exemplo. Depois de criar o sistema chroot como descrito em Executar um sabor diferente do Debian com chroot, Seção 8.6.34.1, digite a partir do shell root do sistema principal:

         main # echo "8:23:respawn:/usr/sbin/chroot /sid-root "\
                "/sbin/getty 38400 tty8"  >> /etc/inittab
         main # init q    # recarrega o init
    

    8.6.34.3 Configurando o X para o chroot

    Você quer executar o X e o GNOME mais novos seguramente em seu chroot? Isso é perfeitamente possível! O exemplo seguinte fará o GDM executar em um terminal virtual vt9.

    Primeiro instale um sistema chroot usando o método descrito em Executar um sabor diferente do Debian com chroot, Seção 8.6.34.1. A partir do root do sistema principal, copie os arquivos de configuração chaves para o sistema chroot.

         main # cp /etc/X11/XF86Config-4 /sid-root/etc/X11/XF86Config-4
         main # chroot /sid-root # ou use console chroot
         chroot # cd /dev; /sbin/MAKEDEV generic ; cd -
         chroot # apt-get install gdm gnome x-window-system
         chroot # vi /etc/gdm/gdm.conf # faça s/vt7/vt9/ na seção [servers]
         chroot # /etc/init.d/gdm start
    

    Aqui, o arquivo /etc/gdm/gdm.conf foi editado para alterar o primeiro console virtual do vt7 para o vt9.

    Agora você pode alternar facilmente entre os ambientes X completos no sistema chroot e em seu sistema principal apenas alternando entre terminais virtuais Linux; por exemplo usando Ctrl-Alt-F7 e Ctrl-Alt-F9. Divirta-se!

    [FIXME] Adicionar um comentário e ligar ao script init do ambiente gdm chroot'ado.


    8.6.34.4 Executar outras distribuições com chroot

    Um ambiente chroot de outra distribuição pode ser criado facilmente. Você instala um sistema em partições separadas usando o instalador da outra distribuição. Se a partição raiz dela estiver em /dev/hda9.

         main # cd / ; mkdir /outra-dist
         main # mount -t ext3 /dev/hda9 /outra-dist
         main # chroot /outra-dist /bin/bash
    

    Então proceda como em Executar um sabor diferente do Debian com chroot, Seção 8.6.34.1, Configurando o login para chroot, Seção 8.6.34.2, e Configurando o X para o chroot, Seção 8.6.34.3.


    8.6.34.5 Construir um pacote com o chroot

    Existe um pacote chroot mais especializado, o pbuilder, que constrói um sistema chroot e compila um pacote dentro do chroot. Esse é um sistema ideal para ser usado para checar se as dependências de compilação de um pacote estão corretas, e para se certificar que dependências de compilação desnecessárias ou incorretas não existirão no pacote gerado.


    8.6.35 Como checar ligações diretas (hard)

    Você pode checar se dois arquivos são o mesmo arquivo com duas ligações diretas (hard links) usando :

          
         $ ls -li arquivo1 arquivo2
    

    8.6.36 Usar mount em um arquivo de uma imagem de disco rígido

    Se arquivo.img contém uma imagem de um disco rígido e o disco rígido original possuía uma configuração de disco que tinha xxxx = (bytes/setor) * (setores/cilindro), então o comando a seguir irá montá-lo em /mnt:

         # mount -o loop,offset=xxxx arquivo.img /mnt
    

    Note que a maioria dos discos rígidos possui 512 bytes/setor.


    8.6.37 Samba

    O básico para obter arquivos do Windows:

         # mount -t smbfs -o username=meunome,uid=my_uid,gid=my_gid \
                 //servidor/compartilhamento /mnt/smb  # monta arquivos Windows para o Linux
         # smbmount //servidor/compartilhamento /mnt/smb \
                 -o "username=meunome,uid=my_uid,gid=my_gid"
         # smbclient -L 192.168.1.2 # lista os compartilhamentos em um computador
    

    Vizinhos Samba podem ser checados a partir do Linux usando:

         # smbclient -N -L endereço_IP_de_seu_PC | less
         # nmblookup -T "*"
    

    8.6.38 Utilitários para sistemas de arquivos não nativos

    Muitos sistemas de arquivo não nativos têm suporte no kernel Linux, então podemos acessá-los simplesmente montando dispositivos que contêm o sistema de arquivos. Para alguns sistemas de arquivos, há também algumas ferramentas especializadas para acessar os sistemas de arquivos sem montar os dispositivos. Isso é feito com programas de espaço de usuário, de forma que não é necessário suporte para o sistema de arquivos no kernel.

    Para criar e verificar sistema de arquivos MS-DOS FAT, o pacote dosfstools é útil.


    8.7 Erros típicos a serem notados

    Aqui há alguns exemplos de ações perigosas. Os impactos negativos serão aumentados se você estiver usando a conta privilegiada: root.


    8.7.1 rm -rf .*

    Em "rm -rf .*", ".*" expande para incluir "." e "..", e se você tiver privilégios de escrita no diretório pai então você acabará removendo também todos os diretórios próximos ao seu diretório atual.


    8.7.2 rm /etc/passwd

    A perda de alguns arquivos importantes como /etc/passwd por estupidez é ruim. O sistema Debian faz cópias de segurança deles regularmente em /var/backups. Quando você tiver que restaurar esses arquivos, você pode ter que ajustar as permissões apropriadas manualmente.

         # cp /var/backups/passwd /etc/passwd
         # chmod 644 /etc/passwd
    

    Veja também Recuperação dos dados de seleção de pacotes, Seção 6.3.4.


    [ anterior ] [ Conteúdo ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ próximo ]


    Referência Debian

    CVS, Qui Jan 18 11:53:12 UTC 2007

    Osamu Aoki osamu#at#debian.org
    Paulo Rogério Ormenese (líder: pt-br) pormenese#at#uol.com.br
    Autores, Seção A.1