less
O comando less
exibe um documento de texto no console. Ele é presente em muitas instalações.
# less unixtoolbox.xhtml
Alguns comandos importantes são (^N representa o [control]-[N]):
- h H boa ajuda na exibição
- f ^F ^V SPAÇO Avança uma janela (ou N de linhas).
- b ^B ESC-v Volta uma janela (ou N de linhas).
- F Avança eternamente; como o “tail -f”.
- /parametro Procura por (N-th) linha marcada.
- ?parametro Procura por (N-th) linha marcada.
- n Repete busca anterior (ou N-th localização).
- N Repete busca anterior em direção reversa.
- q sai
vi
Vi está presente em QUALQUER instalação Linux/Unix (não no gentoo?) e é logo útil saber alguns comandos básicos. Há dois modos: modo comando e modo inserção. O modo de comandos é acessado com [ESC], o modo de inserção com o i. Use : help
se estiver perdido.
Os editores nano
e pico
estão geralmente disponíveis também e são mais fáceis (IMHO) de usar.
Sair (Quit)
- :w newfilename salva o arquivo em com o nome de newfilename
- :wq or 😡 salva e sai
- :q! sai sem salvar
Buscar e mover
- /string Busca por string para frente
- ?string Volta por string para tras
- n Busca pela próxima instância de string
- N Busca por instancia de string anterior
- { Move um paragrafo para trás
- } Move um paragrafo para frente
- 1G Move para a primeira linha do arquivo
- nG Move para o n th de linha do arquivo
- G Move para a ultima ultima linha do arquivo
- :%s/OLD/NEW/g Busca e substitui toda a ocorrência
Excluir, copiar e colar text
- dd (dw) Corta linha corrente (palavra)
- D Cut to the end of the line
- x Delete (cut) character
- yy (yw) Copy line (word) after cursor
- P Paste after cursor
- u Desfaz a ultima modificação
- U Desfaz todas as alterações até a linha atual
O comando mail
é uma aplicação básica para ler e enviar e-mail, é normalmente instalado. para enviar um e-mail simplesmente digite “mail user@domain”. A primeira linha é o assunto, depois o conteúdo da mensagem. Termine e envie o e-mail com um único ponto (.) em uma nova linha. Exemplo:
# mail c@cb.vu Subject: Seu texto está cheio de erros de digitação "Por um tempo, nada aconteceu. Depois de alguns segundos ou mais, nada continua acontecendo." . EOT #
Também funciona com um cano (pipe):
# echo "Esse é o corpo da mensagem" | mail c@cb.vu
Essa é também uma forma simples de testar o servidor de e-mail.
tar
O comando tar
(tape archive) gera e extrai arquivos e diretórios armazenados. O arquivo .tar descompactado, um arquivo compactado tem a extensão .tgz ou .tar.gz (zip) ou .tar.bz (bzip2). Não utilize caminho absoluto quando gerar um arquivo, você provavelmente quer desempacotá-lo em algum outro lugar. Alguns comandos são:
Gerar
# cd / # tar -cf home.tar home/ # arquiva o diretório /home completo (c para criar) # tar -czf home.tgz home/ # o mesmo com compressão zip # tar -cjf home.tbz home/ # o mesmo com compressão bzip2
inclue somente um (ou dois) diretórios a partir de uma arvore, mas mantém a estrutura relativa. Por exemplo, arquivar /usr/local/etc e /usr/local/www e o primeiro diretório no arquivo deve ser local/.
# tar -C /usr -czf local.tgz local/etc local/www # tar -C /usr -xzf local.tgz # Para desempacotar (untar) o diretório local dentro de /usr # cd /usr; tar -xzf local.tgz # é o mesmo que acima
Extrair
# tar -tzf home.tgz # Olha dentro do arquivo sem extrair (lista) # tar -xf home.tar # extrai o arquivo aqui (x para extrair) # tar -xzf home.tgz # o mesmo que da compressão zip (-xjf para a compressão bzip2) # remove caminho guias gallery2 e extrai para dentro de gallery # tar --strip-components 1 -zxvf gallery2.tgz -C gallery/ # tar -xjf home.tbz home/colin/file.txt # Restaura um único arquivo # tar -xOf home.tbz home/colin/file.txt # Imprime o arquivo na saída (stdout) (sem extração)
Mais avançado
# tar c dir/ | gzip | ssh user@remote 'dd of=dir.tgz' # arquiva o dir/ e armazena remotamente. # tar cvf - `find . -print` > backup.tar # arquiva o diretório atual. # tar -cf - -C /etc . | tar xpf - -C /backup/etc # Cópia diretórios # tar -cf - -C /etc . | ssh user@remote tar xpf - -C /backup/etc # Cópia remota. # tar -czf home.tgz --exclude '*.o' --exclude 'tmp/' home/
zip/unzip
Arquivos zip podem ser faceis de compartilhar com o Windows.
# zip -r fileName.zip /path/to/dir # zipa o diretório para dentro do arquivo fileName.zip # unzip fileName.zip # descompacta o arquivo zip # unzip -l fileName.zip # lista arquivos dentro do arquivo # unzip -c fileName.zip fileinside.txt # imprime um arquivo na saída (sem extração) # unzip fileName.zip fileinside.txt # extrai somente um arquivo
dd
O programa dd
(disk dump ou destroy disk ou veja (the meaning of dd) é utilizado para copiar partições e discos e para outros truques de cópias. Uso típico:
# dd if=<source> of=<target> bs=<byte size> conv=<conversion>
# kill -INFO PID # Visualiza p processo do dd (FreeBSD, OSX)
Opções importantes:
notrunc
não trunca a saída do arquivo, todos os zeros serão escrtidos como zeros.noerror
continua depois da leitura de erros (ex. bad blocks)sync
Enche todo bloco de entrada com Nulls para ibs-size
O tamanho de byte padrão é de 512 (um bloco). O MBR, aonde a tabela de partição fica localizada, fica no primeiro bloco, os primeiros 63 blocos de um disco ficam vazios. Tamanhos maiores de byte são mais rápidos para copiar mas requer também mais memória.
Backup e restaurção
# dd if=/dev/hda of=/dev/hdc bs=16065b # Cópia de disco para disco (do mesmo tamanho) # dd if=/dev/sda7 of=/home/root.img bs=4096 conv=notrunc,noerror # Realiza backup do / # dd if=/home/root.img of=/dev/sda7 bs=4096 conv=notrunc,noerror # Restaura o / # dd bs=1M if=/dev/ad4s3e | gzip -c > ad4s3e.gz # Zipa o backup # gunzip -dc ad4s3e.gz | dd of=/dev/ad0s3e bs=1M # Restaura o zip # dd bs=1M if=/dev/ad4s3e | gzip | ssh eedcoba@fry 'dd of=ad4s3e.gz' # também remoto # gunzip -dc ad4s3e.gz | ssh eedcoba@host 'dd of=/dev/ad0s3e bs=1M' # dd if=/dev/ad0 of=/dev/ad2 skip=1 seek=1 bs=4k conv=noerror # Pula o MBR # Isso é necessário se o destino (ad2) for menor. # dd if=/vm/FreeBSD-8.2-RELEASE-amd64-memstick.img of=/dev/disk1 bs=10240 conv=sync # Cópia a imagem do FreeBSD para o pendrive (USB memory stick)
Recuperar
O comando dd
lerá cada bloco da partição. Em caso de problemas é melhor usar a opção conv=sync,noerror
então o dd pulará o bad block e escreverá zeros no destino. Consequentemente é importante definir o tamanho do bloco igual ou menor do que o tamanho dos blocos do disco. o tamanho de 1k parece seguro, defina-o com bs=1k
. Se um disco tem setores ruins (bad sectors) e o dado deve ser restituído a partir de uma partição, Gere um arquivo de imagem com o dd, monte a imagem e copie o conteúdo para um novo disco. Com a opção noerror
, dd pulará os setores ruins e escreverá zeros ao invés de ocupá-los, assim somente os dados contidos nos setores ruins serão perdidos.
# dd if=/dev/hda of=/dev/null bs=1m # verificar se há bad blocks # dd bs=1k if=/dev/hda1 conv=sync,noerror,notrunc | gzip | ssh \ # Envia para algum lugar remoto root@fry 'dd of=hda1.gz bs=1k' # dd bs=1k if=/dev/hda1 conv=sync,noerror,notrunc of=hda1.img # Armazena dentro de uma imagem # mount -o loop /hda1.img /mnt # Monta a imagem # rsync -ax /mnt/ /newdisk/ # Cópia em um novo disco # dd if=/dev/hda of=/dev/hda # Atualizar o estado magnético (apagará todo o disco) # A opção acima é util para atualizar o disco. É perfeitamente seguro, mas deve ser desmontado.
Excluir
# dd if=/dev/zero of=/dev/hdc # Exclui (zera) todo o disco # dd if=/dev/urandom of=/dev/hdc # Exclui melhor todo o disco # kill -USR1 PID # Visualiza o progresso do dd (Linux) # kill -INFO PID # Visualiza o progresso do dd (FreeBSD)
MBR truques
O MBR contém o carregador de boot (boot loader) e a tabela de partição e é do tamanho de 512 bytes. Os primeiros 446 são para o carregador de boot, os bytes 446 á 512 são para a tabela de partição.
# dd if=/dev/sda of=/mbr_sda.bak bs=512 count=1 # Faz backup de todo o MBR # dd if=/dev/zero of=/dev/sda bs=512 count=1 # Exclui o MBR e a tabela de partições # dd if=/mbr_sda.bak of=/dev/sda bs=512 count=1 # Recupera todo o MBR # dd if=/mbr_sda.bak of=/dev/sda bs=446 count=1 # Recupera somente o carregador de boot # dd if=/mbr_sda.bak of=/dev/sda bs=1 count=64 skip=446 seek=446 # Recupera a tabela de partições
screen
Screen (a must have) tem duas funcionalidades principais:
- Executa seções de terminais múltiplos dentro do mesmo terminal.
- Um programa inicial é desassociado do terminal original e pode assim executar em plano de fundo (background). O verdadeiro terminal pode ser fechado e e re-anexado mais tarde.
Exemplo curto de exemplo
Iniciar a tela com:
# screen
Dentro da seção da tela nós podemos iniciar um programa bem duradouro (como o top).
# top
Agora separe com o Ctrl-a Ctrl-d. Recoloque o terminal com:
# screen -R -D
Em detalhes, isso significa: Se uma seção estiver sendo executada, então recoloque. Se necessário separe o faça logout remotamente primeiro. Se não estiver sendo executado, gere-o e notifique ao usuário. Ou:
# screen -x
Anexe a tela em execução em um modo multi display. O console é assim compartilhado entre outros múltiplos usuários. Muito útil para a equipe de trabalho/debug!
Comandos de tela (dentro da tela)
Todos os comandos de tela iniciam com Ctrl-a.
- Ctrl-a ? ajuda e sumário de funções
- Ctrl-a c gera uma nova janela (terminal)
- Ctrl-a Ctrl-n and Ctrl-a Ctrl-p mudar para a janela seguinte ou anterior
na lista, por número. - Ctrl-a Ctrl-N aonde N é um número de 0 á 9, para mudar para a janela correspondente.
- Ctrl-a “ para obter uma lista navegável de janelas em execução
- Ctrl-a a para limpar um missed Ctrl-a perdido
- Ctrl-a Ctrl-d para desconectar e deixar a sessão que está em execução no plano de fundo (background)
- Ctrl-a x trava o terminal com uma senha
- Ctrl-a [ entra no modo scrollback, sai com esc.
Useecho "defscrollback 5000" > ~/.screenrc
para alimentar o buffer (o padrão é 100)- C-u Rola meia página para cima
- C-b Rola uma página inteira para cima
- C-d Rola meia página para baixo
- C-f Rola uma página inteira para baixo
- / Busca (a frente)
- ? Busca (para tras)
A sessão é terminada quando o programa dentro do terminal em execução for fechado e você fizer logout do terminal.
Find
Algumas opções importantes:
-x
(on BSD)-xdev
(no Linux) Permanece no mesmo sistema de arquivo (dev em fstab).-exec cmd {} \;
Executa o comando e substitui {} pelo caminho completo-iname
Como o -name mas é case sensitive-ls
Exibe informações a respeito do arquivo (como ls -la)-size n
n é +-n (k M G T P)-cmin n
Status de arquivo que foi alterado pela última vez em n de minutes atrás.
# find . -type f ! -perm -444 # Encontra arquivos não legíveis por todos # find . -type d ! -perm -111 # Encontra diretórios não acessíveis por todos # find /home/user/ -cmin 10 -print # Arquivos gerados ou modificados nos últimos 10 minutos. # find . -name '*.[ch]' | xargs grep -E 'expr' # Busca 'expr' nesse diretório abaixo. # find / -name "*.core" | xargs rm # Encontra core dumps e os exclui (também tenta core.*) # find / -name "*.core" -print -exec rm {} \; # Outra syntax # Encontra imagens e gera um arquivo, iname não é case sensitive. -r para anexo (append) # find . \( -iname "*.png" -o -iname "*.jpg" \) -print -exec tar -rf imagens.tar {} \; # find . -type f -name "*.txt" ! -name README.txt -print # Exclui arquivos README.txt # find /var/ -size +10M -exec ls -lh {} \; # Encontra arquivos grandes > 10 MB # find /var/ -size +10M -ls # Isso é mais simples # find . -size +10M -size -50M -print # find /usr/ports/ -name work -type d -print -exec rm -rf {} \; # Limpa as portas # Find files with SUID; those file are vulnerable and must be kept secure # find / -type f -user root -perm -4000 -exec ls -l {} \; # find flac/ -iname *.flac -print -size +500k -exec /Applications/Fluke.app/Contents/MacOS/Fluke {} \; # Eu utilizo a opção acima para adicionar arquivos flac (formato de audio) ao iTunes no OSX
Seja cuidadoso com o xarg ou o exec já que pode ou não honrar quotings e pode retornar resultados errados quando os arquivos ou diretórios conterem espaços. Na dúvida, utilize “-print0 | xargs -0” ao invés de “| xargs”. A opção -print0 deve ser a ultima no comando find. Veja esse bom mini tutorial para o find (em inglês)http://www.hccfl.edu/pollock/Unix/FindCmd.htm.
# find . -type f | xargs ls -l # Não funcionará com espaços nos names # find . -type f -print0 | xargs -0 ls -l # Não funcionará com espaços nos nomes # find . -type f -exec ls -l '{}' \; # Or use quotes '{}' with -exec
Duplicar arvore de diretório:
# find . -type d -exec mkdir -p /tmp/new_dest/{} \;
Miscelâneas
# which comando # Exibe nome completo do caminho do comando # time comando # Veja quanto tempo p comando leva para ser executado # time cat # Usa o time como o as cronômetro. Ctrl-c para parar # set | grep $USER # Lista o ambiente atual # cal -3 # Exibe um calendário de três meses # date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] # date 10022155 # Define data e hora # whatis grep # Exibe uma informação curta no comando # whereis java # Busca caminho (path) e diretórios padrões paar a palavra # setenv varname value # Set env. variável varname para o valor (csh/tcsh) # export varname="value" # set env. variável varname para o valor (sh/ksh/bash) # pwd # Imprime diretório de trabalho atual (sigla de Print Working Directory) # mkdir -p /path/to/dir # sem erro se existir, gera diretórios pai caso necessário (parent dirs) # mkdir -p project/{bin,src,obj,doc/{html,man,pdf},debug/some/more/dirs} # rmdir /path/to/dir # Remove o diretório # rm -rf /path/to/dir # Remove e diretório e o seu conteúdo (f= força) # rm -- -badchar.txt # Remove o arquivo que inicia com um traço (-) # cp -la /dir1 /dir2 # Arquiva e gera arquivos hard link ao invés de copiá-los # cp -lpR /dir1 /dir2 # O mesmo para o FreeBSD # cp unixtoolbox.xhtml{,.bak} # Jeito curto de copiar o arquivo com uma nova extensão # mv /dir1 /dir2 # Renomeia um diretório # ls -1 # lista um arquivo por linha # history | tail -50 # Exibe us últimos 50 comandos utilizados # cd - # cd para o diretório anterior ($OLDPWD) # /bin/ls| grep -v .py | xargs rm -r # canaliza (pipe) nomes de arquivos para o rm com o xargs
Verificar hashs de arquivo com o openssl. Essa é uma boa alternativa para os comandos md5sum
ou sha1sum
(FreeBSD utiliza md5
e sha1
) que não ven sempre instalados por padrão.
# openssl md5 file.tar.gz # Gera um checksum md5 do arquivo # openssl sha1 file.tar.gz # Gera um checksum sha1 do arquivo # openssl rmd160 file.tar.gz # Gera um checksum RIPEMD-160 do arquivo