Os sistemas Linux atuais têm utilitários gráficos dedicados ao trabalho de um administrador. No entanto, é importante poder utilizar a interface de linha de comando por várias razões:
A maioria dos comandos do sistema são comuns a todas as distribuições Linux, o que não é o caso para ferramentas gráficas.
Pode acontecer de o sistema não iniciar corretamente, mas um interpretador de linha de comando de reserva permanecer acessível.
A administração remota é feita via linha de comando com um terminal SSH.
A fim de preservar os recursos do servidor, a interface gráfica ou não está instalada, ou não é iniciada na maioria deles.
A administração é feita por scripts.
Aprender esses comandos permite que o administrador conecte-se a um terminal Linux para gerenciar os seus recursos e arquivos, para identificar a estação, o terminal e os usuários conectados, etc.
O usuário de um sistema Linux será definido no arquivo /etc/passwd por:
Um nome de login, mais comumente chamado de "login", sem espaços.
Um identificador numérico: UID (Identificador do Usuário).
Um identificador de grupo: GID (Identificador do Grupo).
Um interpretador de comandos, por exemplo, um shell, que pode ser diferente de um usuário para outro.
Um diretório de conexão, por exemplo, o diretório home.
Em outros arquivos, o usuário será definido por:
Uma senha, que é criptografada antes de ser armazenada (/etc/shadow).
Um prompt de comando ou prompt de login, que é simbolizado por um # para administradores e um $ para outros usuários (/etc/profile).
Dependendo da política de segurança implementada no sistema, a senha exigirá um certo número de caracteres e deverá atender a certos requisitos de complexidade.
Entre os interpretadores de comandos existentes, o Bourne-Again Shell (/bin/bash) é o utilizado com mais frequência. Ele é atribuído por padrão a novos usuários. Por várias razões, usuários avançados de Linux podem escolher shells alternativos, como o Korn Shell (ksh), o C Shell (csh), etc.
O diretório de login do usuário, por convenção, é armazenado no diretório /home da estação de trabalho. Ele irá conter os dados pessoais do usuário e os arquivos de configuração dos seus aplicativos. Por padrão, no login, o diretório de login é selecionado como o diretório atual.
Uma instalação de estação de trabalho (com ambiente gráfico) inicia essa interface no terminal 1. O Linux é multi-usuário, então é possível conectar vários usuários várias vezes em diferentes terminais físicos (TTY), ou terminais virtuais (PTS). Terminais virtuais estão disponíveis em um ambiente gráfico. Um usuário muda de um terminal físico para outro usando Alt + Fx na linha de comando ou usando CTRL + Alt + Fx.
Uma vez que o usuário esteja conectado a um console, o shell exibe o prompt de comando. Então, ele se comporta como um loop infinito, repetindo o mesmo padrão com cada informação inserida:
Exibe o prompt de comando.
Lê o comando.
Analisa a sintaxe.
Substitui os caracteres especiais.
Executa o comando.
Exibe o prompt de comando.
Etc.
A sequência de teclas CTRL + C é usada para interromper um comando em execução.
O uso de um comando geralmente segue essa sequência:
comando[opção(s)][argumentos(s)]
O nome do comando geralmente é em letras minúsculas.
Um espaço separa cada item.
Opções curtas começam com um traço (-l), enquanto opções longas começam com dois traços (--list). Um traço duplo (--) indica o final da lista de opções.
É possível agrupar algumas opções curtas:
$ls-l-i-a
é equivalente a:
$ls-lia
Pode haver vários argumentos após uma opção:
$ls-lia/etc/home/var
Na literatura, o termo "opção" equivale ao termo "parâmetro", que é mais comumente utilizado na programação. Para indicar que uma opção ou argumento são opcionais, o texto é simbolizado inserido em colchetes [ e ]. Quando é possível utilizar mais de uma opção, uma barra vertical chamada "pipe" separa elas [a|e|i].
É impossível para um administrador de qualquer nível saber detalhadamente todos os comandos e opções. Um manual geralmente está disponível para cada um dos comandos instalados.
Uma vez encontrado o comando por apropos ou whatis, seu respectivo manual é lido pelo man ("Man é seu amigo"). Esse conjunto de manuais é dividido em 8 seções, agrupando informações por tópico, sendo que a seção padrão é a 1:
Programas ou comandos executáveis.
Chamadas de sistema (funções dadas pelo kernel).
Chamadas da biblioteca (funções dadas pela biblioteca).
Arquivos especiais (normalmente encontrados em /dev).
Formatos de arquivo e convenções (arquivos de configuração como /etc/passwd).
Jogos (como aplicativos baseados em caracteres).
Diversos (por exemplo, man (7)).
Comandos de administração do sistema (geralmente apenas para root).
Rotinas do kernel (não padrão).
Informações sobre cada seção podem ser acessadas digitando man x intro, onde x é o número da seção.
O comando:
manpasswd
informará o administrador sobre o comando passwd, suas opções, etc. Enquanto que:
$man5passwd
informará a ele sobre os arquivos relacionados ao comando.
Navegue através do manual com as setas ↑ e ↓. Saia do manual pressionando a tecla q.
O comando clear limpa o conteúdo da tela do terminal. Mais precisamente, ele desloca a tela para que o prompt de comando esteja na parte superior da tela, na primeira linha.
No terminal físico, o display será ocultado permanentemente, enquanto que na interface gráfica uma barra de rolagem permitirá que você volte no histórico do terminal virtual.
Por vários motivos, o desenvolvedor do script pode precisar usar sequências especiais (iniciando com um caractere \). Nesse caso, a opção -e será utilizada, permitindo interpretação das sequências.
Entre as sequências frequentemente usadas, podemos mencionar:
O comando id é usado para exibir informações sobre usuários e grupos. Por padrão, nenhum parâmetro do usuário é adicionado e as informações do usuário conectado no momento são exibidas
As opções -g, -G, -n e -u apresentam o grupo principal GID, GIDs de subgrupos, nomes ao invés de identificadores numéricos, e o UID do usuário respectivamente.
O comando whoami exibe o login do usuário atual.
O comando who sozinho exibe os nomes dos usuários logados:
Como o Linux é multi-usuário, é possível que várias sessões estejam abertas na mesma estação, tanto fisicamente quanto através da rede. É interessante saber quais usuários estão logados, somente se houver comunicação com eles através do envio de mensagens.
tty: representa um terminal.
pts/: representa um console virtual em um ambiente gráfico com o número seguinte representando a instância do console virtual (0, 1, 2...)
A opção -r também mostra o nível de execução (ver capítulo "inicialização").
No Linux, a árvore de arquivos é uma árvore invertida, chamada árvore de hierarquia única, cuja raiz é diretório /.
O diretório atual é o diretório onde o usuário está localizado.
O diretório de conexão é o diretório de trabalho associado ao usuário. Os diretórios de login são, por padrão, armazenados no diretório /home.
Quando o usuário faz login, o diretório atual se torna o diretório de login.
Um caminho absoluto faz referência a um arquivo a partir de root por atravessar toda a árvore no nível do arquivo:
/home/groupA/alice/file
O caminho relativo faz referência a esse mesmo arquivo ao atravessar a árvore toda a partir do diretório atual:
../alice/file
No exemplo acima, o ".." faz referência ao diretório pai do diretório atual.
Um diretório, mesmo estando vazio, necessariamente irá conter no mínimo duas referências:
.: referência a ele próprio.
..: referência ao diretório pai do diretório atual.
Um caminho relativo pode iniciar com ./ ou ../. Quando o caminho relativo se refere a um subdiretório ou arquivo no diretório atual, então o ./ é muitas vezes omitido. Mencionar o primeiro ./ na árvore só é necessário para rodar um arquivo executável.
Erros no caminho indicado podem causar muitos problemas: criar diretórios ou arquivos no local incorreto, exclusões não intencionais, etc. Portanto, é altamente recomendado o uso do auto-completar ao inserir caminhos de diretório e/ou arquivo.
No exemplo a seguir, queremos informar a localização do arquivo myfile a partir do diretório do bob.
Através de um caminho absoluto, o diretório atual não interessa. Iniciamos no root e vamos descendo para os diretórios home, groupA, alice e finalmente o arquivo myfile: /home/groupA/alice/myfile.
Através de um caminho relativo, nosso ponto de partida é o diretório atual /home/groupA/bob, voltamos um nível usando .. (ex., dentro do diretório groupA), descemos então no diretório alice, e finalmente o arquivo myfile file: ../alice/myfile.
O comando pwd (Print Working Directory) mostra o caminho absoluto do diretório atual.
$pwd
/home/rockstar
Para usar um caminho relativo para fazer referência a um arquivo ou diretório, ou usar o comando cd para ir para outro diretório, você precisa saber seu local na árvore de arquivos.
Dependendo do tipo de shell e dos diferentes parâmetros de seu arquivo de configuração, o prompt de terminal (também conhecido como o prompt de comando) irá exibir o caminho absoluto ou relativo do diretório atual.
Apresenta todos os arquivos, incluindo aqueles que estiverem ocultos. Arquivos ocultos no Linux são todos aqueles que tem um . no início do nome.
-i
Exibe números inode.
-l
Use um formato de lista longa, ou seja, cada linha exibe informações de formato longo para um arquivo ou diretório.
O comando ls, contudo, possui muitas opções (veja o man):
Opção
Informação
-d
Exibe informação sobre um diretório ao invés de listar seu conteúdo.
-g
Como a opção -l, mas não lista o proprietário.
-h
Apresenta tamanho de arquivos no formato mais apropriado (byte, kilobyte, megabyte, gigabyte, ...). h significa Humanamente Legível. Precisa ser usado com opção -l.
-s
Exibe o tamanho alocado de cada arquivo, em blocos. No sistema operacional GNU/Linux, o "bloco" é a menor unidade de armazenamento no sistema de arquivos, um bloco equivale a 4096Bytes.
-A
Exibe todos os arquivos no diretório, exceto . e ..
-R
Exibe o conteúdo de subdiretórios recursivamente.
-F
Exibe o tipo dos arquivos. Lista / para diretório, * para executáveis, @ para link simbólico, e nada para arquivo de texto.
-X
Ordena arquivos de acordo com suas extensões.
Descrição das colunas geradas ao executar o comando ls -lia:
Número de subdiretórios (. e .. inclusos). Para um arquivo, representa o número de links rígidos e 1 representa a si mesmo.
rockstar
Usuário proprietário.
rockstar
Grupo proprietário.
4096
Para arquivos, mostra o tamanho do arquivo. Para diretórios, mostra o valor fixo de 4096 bytes ocupados pelo nome do arquivo. Para calcular o tamanho total de um diretório, use du -sh rockstar/
25 oct. 08:10
Data de última alteração.
rockstar
Nome do arquivo (ou diretório).
Nota
Aliases são frequentemente configurados em distribuições comuns.
Esse é o caso do alias ll:
alias ll='ls -l --color=auto'
O comando ls tem muitas opções. Aqui estão alguns exemplos avançados de utilização:
Lista os arquivos em /etc ordenados pela última modificação:
Lista os arquivos arquivos maiores que 1 megabyte, mas menores de 1 gigabyte em /var. O exemplo aqui usa comandos avançados de grep com expressões regulares. Os novatos não precisam se preocupar, haverá um tutorial especial para introduzir essas expressões regulares no futuro.
O comando touch muda o timestamp de um arquivo ou cria um arquivo vazio caso ele não exista.
touch[-tdata]arquivo
Exemplo:
$touch/home/rockstar/myfile
Opção
Informação
-t data
Altera a data da última modificação do arquivo com a data especificada.
Formato de data: [AAAA]MMJJhhmm[ss]
Dica
O comando touch é utilizado principalmente para criar um arquivo vazio, mas ele pode ser útil para backups incrementais ou diferenciais, por exemplo. Na verdade, o único efeito em executar o touch em um arquivo será forçá-lo a ser salvo no próximo backup.
Qualquer exclusão de arquivo ou diretório é definitiva.
Opções
Informações
-f
Não pede confirmação para excluir.
-i
Pede confirmação para excluir.
-r
Exclui um diretório e seus subdiretórios recursivamente.
Nota
Por padrão o comando rm não pede confirmação ao deletar arquivos. No entanto, com uma distribuição Red Hat/Rocky, rm pede a confirmação da exclusão porque o comando rm é um alias do comando rm -i. Não estranhe se em outra distribuição, como Debian por exemplo, você não obtiver uma confirmação antes da exclusão.
Deletando uma pasta com o comando rm, estando a pasta vazia ou não, exigirá a adição da opção -r.
O fim das opções é informado para o shell através de barras duplas --.
No exemplo:
$>-hard-hard# Para criar um arquivo vazio chamado -hard-hard
hard-hard
[CTRL+C]Tointerruptthecreationofthefile
$rm-f---hard-hard
O nome do arquivo hard-hard começa com um -. Sem o uso do -- o shell teria interpretado o -d em -hard-hard como uma opção.
Usando a tecla ENTER, a navegação é linha a linha. Usando a tecla SPACE, a navegação é página por página. /texto permite a você procurar ocorrência do texto no arquivo.
O comando tac faz quase o oposto do comando cat. Exibe o conteúdo de um arquivo iniciando pelo final (que é particularmente interessante para a leitura de logs!).
Exemplo: Exibe um arquivo de log mostrando a última linha primeiro:
Com a opção -f, a mudança de informação do arquivo será exibida sem parar, a menos que o usuário saia do estado de monitoramento com CTRL + C. Esta opção é muito usada para acompanhar os arquivos de log (os logs) em tempo real.
Sem a opção -n, o comando tail mostra as últimas 10 linhas do arquivo.
O comando sort classifica as linhas de um arquivo.
Ele permite que você ordene o resultado de um comando ou o conteúdo de um arquivo em uma determinada ordem, numericamente, alfabeticamente, por tamanho (KB, MB, GB) ou em ordem decrescente.
Especifica as colunas a serem separadas. Você pode especificar várias colunas.
-n
Faz uma ordenação numérica.
-o arquivo
Salva a classificação no arquivo especificado.
-t
Especifica um delimitador, que requer que o conteúdo do arquivo correspondente tenha colunas delimitadas, caso contrário, elas não poderão ser ordenadas corretamente.
-r
Inverte a ordem do resultado. Usado em conjunto com a opção -n para classificar em ordem do maior para o menor.
-u
Remove as duplicidades após a classificação. Equivalente a sort arquivo | uniq.
O comando sort classifica o arquivo apenas na tela. O arquivo não é modificado pela classificação. Para gravar a classificação, utilize a opção -o ou um redirecionamento de saída >.
Por padrão, os números são classificados de acordo com seus caracteres. Assim, "110" estará antes de "20", que por sua vez virá antes do "3". A opção -n deve ser especificada para que os blocos de caracteres numéricos sejam classificados pelos seus valores.
O comando sort inverte a ordem dos resultados com a opção -r:
Neste exemplo, o comando sort irá classificar o conteúdo do arquivo /etc/passwd desta vez do maior uid (identificador de usuário) para o menor.
Alguns exemplos avançados de uso do comando sort:
Embaralhar valores
O comando sort também permite que você embaralhe valores com a opção -R:
$sort-R/etc/passwd
Classificando endereços IP
Um administrador de sistema é rapidamente confrontado com o processamento de endereços IP a partir dos logs de seus serviços, como SMTP, VSFTP ou Apache. Esses endereços são normalmente extraídos com o comando cut.
Aqui está um exemplo com o arquivo dns-client.txt:
É possível usar a opção -exec do comando find para executar um comando em cada linha de resultado:
$find/tmp-name*.txt-execrm-f{}\;
O comando anterior pesquisa por todos os arquivos no diretório /tmp com *.txt no nome e exclui eles.
Entenda a opção -exec
No exemplo acima, o comando find vai construir uma string representando o comando a ser executado.
Se o comando find encontrar três arquivos chamados log1.txt, log2.txt e log3.txt, então o comando find construirá a string substituindo as chaves em rm -f {} \; com um dos resultados da busca, e repetir para cada resultado.
O caractere ; é um caractere especial de shell que deve ser protegido por um \ para evitar que ele seja interpretado precocemente pelo comando find (e não no -exec).
Dica
$ find /tmp -name *.txt -delete faz a mesma coisa.
O comando grep retorna a linha completa contendo a string que você está procurando.
* O caractere especial ^ é usado para procurar uma string no início de uma linha.
* O caractere especial $ procura uma string no final de uma linha.
$grep-w"^root"/etc/passwd
Nota
Este comando é muito poderoso e é altamente recomendável consultar seu manual. Ele tem muitas variações.
É possível pesquisar por uma string em uma árvore de arquivo com a opção -R.
Meta-caracteres substituem um ou mais caracteres (ou até mesmo uma ausência de caracteres) em uma pesquisa. Estes meta-caracteres também são conhecidos como curingas.
Eles podem ser combinados.
O caractere * substitui uma string composta por qualquer caractere. O caractere * também pode representar uma ausência de caractere.
Meta-caracteres permitem pesquisas mais complexas substituindo toda ou parte de uma palavra. Simplesmente substitua os desconhecidos por esses caracteres especiais.
O personagem ? substitui um único caractere, qualquer que seja.
Nos sistemas UNIX e Linux, existem três fluxos padrão. Eles permitem que programas, através da biblioteca stdio.h, insiram ou extraiam informações.
Esses fluxos são chamados de canal X ou descritor de arquivos X.
Por padrão:
o teclado é o dispositivo de entrada para o canal 0, chamado stdin;
a tela é o dispositivo de saída dos canais 1 e 2, chamados stdout e stderr.
O stderr recebe os fluxos de erro retornados por um comando. Os demais fluxos são direcionados para o stdout.
Esses fluxos apontam para arquivos periféricos, mas como em UNIX/Linux tudo é um arquivo, fluxos de E/S podem ser facilmente desviados para outros arquivos. Este princípio é a força do console.
É possível redirecionar o fluxo de entrada a partir de outro arquivo com os caracteres < ou <<. O comando lerá o arquivo em vez do teclado:
$ftp-inserverftp<<ftp-commands.txt
Nota
Só é possível manipular o redirecionamento de entrada com comandos que requerem entrada via teclado.
O redirecionamento de entrada também pode ser usado para simular uma interação do usuário. O comando vai ler o fluxo de entrada até que ele encontre a palavra-chave definida após o redirecionamento de entrada.
Este recurso é usado para comandos interativos em scripts:
$ftp-inserverftp<< ENDuser alice passwordput filebyeEND
A palavra-chave END pode ser substituída por qualquer palavra.
$ftp-inserverftp<< STOPuser alice passwordput filebyeSTOP
O shell encerra o comando ftp quando ele recebe uma linha contendo a palavra-chave.
Atenção
A palavra-chave final, aqui END ou STOP, deve ser a única palavra na linha e deve estar no início da linha.
O redirecionamento de entrada padrão é pouco usado porque a maioria dos comandos aceita um nome de arquivo como argumento.
O comando wc pode ser usado assim:
$wc-l.bash_profile
27.bash_profile# o número de linhas, seguido pelo nome do arquivo
$wc-l<.bash_profile
27# retorna apenas o número de linhas
A saída padrão pode ser redirecionada para outros arquivos usando os caracteres > ou >>.
O redirecionamento simples > sobrescreve o conteúdo do arquivo de saída:
$date+%F>arquivo_de_data
Quando o comando >> é usado, indica que o resultado de saída do comando é adicionado ao final do conteúdo do arquivo.
$date+%F>>arquivo_de_data
Em ambos os casos, o arquivo é criado automaticamente caso não exista.
A saída de erro padrão também pode ser redirecionada para outro arquivo. Desta vez será necessário especificar o número do canal (que pode ser omitido para os canais 0 e 1):
Redirecionamento de 2 saídas para um único arquivo:
$ls-R/>>log_file2>&1
Redirecionamento de stderr para um "poço sem fundo" (/dev/null):
$ls-R/2>>/dev/null
Quando ambos os fluxos são redirecionados, nenhuma informação é mostrada na tela. Para redirecionar o fluxo mantendo a exibição em tela, você precisará utilizar o comando tee.
Um pipe é um mecanismo que permite você interligar a saída padrão do primeiro comando com a entrada padrão do segundo comando.
A comunicação é uni direcional e é feita com o símbolo |. O pipe | pode ser obtido pressionando as teclas SHIFT + | simultaneamente.
Todos os dados enviados pelo controle à esquerda do pipe através do canal de saída padrão são enviados para o canal de entrada padrão do controle à direita.
Os comandos usados particularmente após um pipe são filtros.
Exemplos:
Exibir somente o início:
$ls-lia/|head
Exibir somente o final:
$ls-lia/|tail
Classificar o resultado:
$ls-lia/|sort
Contar o número de palavras / caracteres:
$ls-lia/|wc
Pesquisar uma sequência de caracteres no resultado:
Os apelidos são definidos apenas temporariamente, durante a sessão do usuário.
Para uso permanente, eles devem ser criados:
no arquivo .bashrc do diretório de login do usuário;
no arquivo /etc/bashrc para todos os usuários.
Atenção
É preciso ter um cuidado especial quando se utilizam aliases que podem ser potencialmente perigosos! Por exemplo, um alias configurado sem o conhecimento do administrador:
aliascd='rm -Rf'
O comando unalias permite que você exclua os alias.
Para apagar um único alias:
$unaliasll
Para apagar todos os alias:
$unalias-a
Para desativar um alias temporariamente, o comando é \<alias name>.
Por exemplo, se fizermos:
$typels
ela deve retornar o seguinte:
lsisanaliasto«ls-rt»
Agora que sabemos disso, podemos ver os resultados de usar o alias ou desativá-lo uma vez com o \, executando o seguinte:
$lsfile*# classifica pela data
file3.txtfile2.txtfile1.txt
$\lsfile*# classifica pelo nome
file1.txtfile2.txtfile3.txt
Colore o resultado do comando grep: alias grep='grep --color=auto'
função mcd
É comum criar uma pasta e então entrar nela: mcd() { mkdir -p "$1"; cd "$1"; }
função cls
Entra em uma pasta e lista seu conteúdo: cls() { cd "$1"; ls; }
função backup
Cria uma cópia de backup de um arquivo: backup() { cp "$1"{,.bak}; }
função extract
Descompacta qualquer tipo de arquivo:
extract(){if[-f$1];thencase$1in*.tar.bz2)tarxjf$1;;*.tar.gz)tarxzf$1;;*.bz2)bunzip2$1;;*.rar)unrare$1;;*.gz)gunzip$1;;*.tar)tarxf$1;;*.tbz2)tarxjf$1;;*.tgz)tarxzf$1;;*.zip)unzip$1;;*.Z)uncompress$1;;*.7z)7zx$1;;*)echo"'$1' cannot be extracted via extract()";;esacelseecho"'$1' is not a valid file"fi}
Se o comando alias cmount retornar o seguinte: alias cmount="mount | column -t"
Então podemos usar cmount para mostrar todas pastas montadas do sistema em colunas: [root]# cmount
que retornaria nossos pontos de montagem no seguinte formato: