O que mais cai
| Parte do tópico | Importância | O que a banca cobra |
|---|---|---|
| Unix | Média | Origem, núcleo e shell, ideia de que tudo é arquivo, pipes, POSIX e variantes |
| Linux | Alta | Árvore de diretórios, comandos, permissões, links, processos e usuários |
| Scripts em Unix e Linux | Alta | Shebang, variáveis, parâmetros especiais, aspas, testes, laços e cron |
| Distribuições Linux | Média | Famílias Debian e Red Hat, pacotes, gerenciadores e modelos de lançamento |
Do que trata o tópico
Este tópico ensina a família de sistemas operacionais que roda a maior parte dos servidores do mundo: o Unix, criado nos anos 1970, e o Linux, o sistema livre que segue o mesmo modelo. A apostila mostra como esses sistemas se organizam, os comandos que a prova pede, o sistema de permissões, os scripts do shell que automatizam tarefas e as distribuições, que são os pacotes completos que o usuário instala.
Base de referência
- POSIX.1 (IEEE Std 1003.1), edição de 2024: padrão que define a interface comum dos sistemas do tipo Unix (chamadas de sistema, shell e utilitários).
- FHS 3.0 (Filesystem Hierarchy Standard), da Linux Foundation: padrão que define a árvore de diretórios do Linux.
Conteúdo
Unix
Nos anos 1960, cada fabricante de computador tinha o seu próprio sistema operacional, e um programa escrito para uma máquina não rodava em outra. O Unix nasceu em 1969 nos Laboratórios Bell, da AT&T, criado por Ken Thompson e Dennis Ritchie, como um sistema simples para várias pessoas usarem o mesmo computador. Em 1973, o Unix foi reescrito na linguagem C, que Ritchie criou, e isso mudou a história do sistema.
Antes disso, os sistemas eram escritos em linguagem de montagem (assembly), presa a um processador. Com o Unix em C, bastava ter um compilador C para a nova máquina e recompilar o sistema. Essa qualidade é a portabilidade, e ela explica por que o Unix se espalhou por universidades e empresas. A AT&T licenciou o código para universidades, e daí saíram as variantes.
Características do Unix. O Unix é multiusuário, porque várias pessoas usam o mesmo sistema ao mesmo tempo, cada uma com a sua conta, os seus arquivos e as suas permissões. Ele é multitarefa, porque executa vários processos ao mesmo tempo, com o núcleo dividindo o processador entre eles. Ele é portável, por ser escrito em C. Ele também tem um sistema de arquivos hierárquico, uma árvore única que começa na raiz.
Arquitetura em camadas. O Unix tem três camadas principais. O núcleo (kernel) controla o hardware, gerencia memória, processos, arquivos e dispositivos e é a única parte com acesso direto ao hardware. O shell é o interpretador de comandos: ele lê o que o usuário digita, interpreta e pede ao núcleo que execute. Os utilitários são os programas pequenos que fazem cada tarefa (listar, copiar, buscar texto, ordenar).
O shell não é o núcleo. Essa troca é a confusão mais comum sobre a arquitetura: o shell é um programa comum, que roda como qualquer outro processo e pode ser trocado pelo usuário. Os programas pedem serviços ao núcleo por meio das chamadas de sistema (system calls), como abrir um arquivo, criar um processo ou ler do teclado.
- O usuário digita o comando no terminal
- O shell lê a linha e separa comando e argumentos
- O comando é interno do shell?SimO próprio shell executaNãoO shell cria um processo e carrega o programa
- O programa pede serviços ao núcleo por chamadas de sistema
- O núcleo acessa o hardware e devolve o resultado
- O shell mostra o prompt de novo
Tudo é arquivo. No Unix, quase tudo aparece como um arquivo: o documento de texto, o diretório, o disco, o terminal, a impressora e até o canal entre dois processos. Os dispositivos ficam no diretório /dev, e um programa lê o disco ou o terminal com as mesmas operações que usa para ler um arquivo comum. Por isso as mesmas ferramentas servem para muitos fins.
Filosofia Unix. A filosofia Unix pede programas pequenos, que fazem uma coisa só e bem feita, e que se combinam entre si. A combinação usa o pipe (barra vertical, |), que liga a saída de um comando à entrada do comando seguinte. Cada programa lê texto e escreve texto, e por isso qualquer saída pode alimentar outro programa.
Entrada, saída e redirecionamento. Todo processo nasce com três canais abertos. A entrada padrão (stdin, descritor 0) vem do teclado; a saída padrão (stdout, descritor 1) vai para a tela; a saída de erro (stderr, descritor 2) também vai para a tela, mas por um canal separado. O redirecionamento troca o destino desses canais:
comando > arquivograva a saída padrão no arquivo e apaga o conteúdo anterior.comando >> arquivoacrescenta a saída ao fim do arquivo, sem apagar.comando < arquivousa o arquivo como entrada padrão.comando 2> erros.txtgrava só as mensagens de erro no arquivo.comando > tudo.txt 2>&1grava a saída e os erros no mesmo arquivo.comando1 | comando2entrega a saída do primeiro como entrada do segundo.
O arquivo especial /dev/null descarta tudo o que recebe. O comando ls /pasta 2> /dev/null mostra a listagem e esconde as mensagens de erro.
Exemplo resolvido: o arquivo servidores.txt tem uma linha por servidor, com nome, setor e salário separados por dois-pontos. O objetivo é contar quantos servidores há em cada setor.
ana:ti:7500
bruno:rh:5200
carla:ti:8100
davi:rh:4900
elis:ti:6100
cut -d: -f2 servidores.txt | sort | uniq -c
cut -d: -f2usa o dois-pontos como separador e pega o 2º campo de cada linha: ti, rh, ti, rh, ti.sortordena as linhas: rh, rh, ti, ti, ti.uniq -cjunta as linhas iguais vizinhas e conta cada grupo.- Resultado:
2 rhe3 ti.
O sort antes do uniq é necessário, porque o uniq só junta linhas iguais que estão uma ao lado da outra. Sem o sort, a saída teria cinco grupos de uma linha cada.
POSIX. Com tantas variantes, os programas pararam de rodar de uma variante para outra. O POSIX (Portable Operating System Interface) é o padrão do IEEE que define a interface comum: as chamadas de sistema, o comportamento do shell e dos utilitários. Um sistema compatível com POSIX roda os mesmos scripts e compila os mesmos programas com pouca ou nenhuma mudança.
Variantes do Unix. As variantes se dividem em dois grandes ramos históricos. O System V é o ramo da AT&T, e dele vêm o Solaris (Sun, depois Oracle), o AIX (IBM) e o HP-UX (HP). O BSD (Berkeley Software Distribution) é o ramo da Universidade da Califórnia em Berkeley, e dele vêm o FreeBSD, o OpenBSD e o NetBSD. O macOS, da Apple, tem base em BSD e tem a certificação oficial UNIX.
O nome UNIX, em maiúsculas, é marca registrada, e só usa o nome o sistema certificado pelo dono da marca (The Open Group). Os sistemas que seguem o modelo sem certificação são chamados de tipo Unix (Unix-like). O Linux é o exemplo principal: ele não descende do código da AT&T e foi escrito do zero, mas segue o mesmo modelo e o padrão POSIX.
Na prática, um órgão público migra um sistema de folha de pagamento de um servidor Solaris para um servidor Linux. Os scripts do shell que seguem o POSIX rodam sem mudança, porque os dois sistemas aceitam os mesmos comandos básicos e a mesma sintaxe. Já um script que usa uma opção própria do Solaris precisa de ajuste.
A diferença para o conceito vizinho: Unix é a família de sistemas e o padrão de projeto; Linux é um núcleo tipo Unix, livre, criado depois. O shell é o interpretador de comandos, e o núcleo é o gerente do hardware. O erro comum é dizer que o Linux é uma versão do Unix da AT&T ou que o shell faz parte do núcleo.
No Unix, o shell é o componente do núcleo que tem acesso direto ao hardware e executa as chamadas de sistema, e por isso cada usuário precisa usar o mesmo shell definido pelo administrador.
Comentário:
Regra: o shell é um programa comum, fora do núcleo, que interpreta comandos e pede serviços ao núcleo; cada usuário pode ter o seu shell.
A afirmação erra em o componente do núcleo que tem acesso direto ao hardware e executa as chamadas de sistema: só o núcleo acessa o hardware, e o shell faz pedidos a ele. A afirmação também erra em cada usuário precisa usar o mesmo shell definido pelo administrador: o shell de cada conta é configurável, e o usuário pode trocar o seu (sh, bash, ksh, zsh).
Resultado: errado.
Sobre a família Unix e os sistemas do tipo Unix, assinale a alternativa correta.
- A) O Linux descende do código-fonte original da AT&T e por isso usa o nome UNIX sem certificação.
- B) A reescrita do Unix em linguagem C tornou o sistema portável, porque bastava um compilador C para levar o sistema a outra máquina.
- C) O FreeBSD e o OpenBSD pertencem ao ramo System V, desenvolvido pela AT&T.
- D) No redirecionamento, o operador de duas setas apaga o arquivo de destino antes de gravar a saída.
- E) O descritor 2 representa a entrada padrão, que vem do teclado.
Comentário:
A) Errada.
Regra: o Linux foi escrito do zero, segue o modelo Unix e o padrão POSIX, e é um sistema tipo Unix, sem a marca UNIX.
A alternativa erra em descende do código-fonte original da AT&T e por isso usa o nome UNIX sem certificação: o Linux não usa código da AT&T, e o nome UNIX exige certificação.
B) Certa.
Regra: o Unix escrito em C pode ser recompilado para outra máquina, o que é a portabilidade.
Antes do C, o sistema era escrito em assembly, preso a um processador. Com o C, a troca de máquina pedia só um compilador novo.
C) Errada.
Regra: FreeBSD, OpenBSD e NetBSD vêm do ramo BSD, da Universidade da Califórnia em Berkeley.
A alternativa erra em pertencem ao ramo System V, desenvolvido pela AT&T: do System V vêm Solaris, AIX e HP-UX.
D) Errada.
Regra: o operador de uma seta (>) apaga e grava; o operador de duas setas (>>) acrescenta ao fim do arquivo.
A alternativa erra em o operador de duas setas apaga o arquivo de destino antes de gravar a saída: quem apaga é o operador de uma seta.
E) Errada.
Regra: o descritor 0 é a entrada padrão, o 1 é a saída padrão e o 2 é a saída de erro.
A alternativa erra em representa a entrada padrão, que vem do teclado: o descritor 2 é a saída de erro.
Resultado: alternativa B.
Como a banca cobra: a banca troca as funções do núcleo e do shell, pergunta o ramo de cada variante e pede o efeito de um redirecionamento ou de um pipe. A afirmação de que o Linux é um Unix certificado ou derivado da AT&T aparece com frequência.
Linux
Em 1991, o estudante finlandês Linus Torvalds escreveu um núcleo de sistema operacional para o seu computador pessoal e publicou o código para quem quisesse estudar e melhorar. Esse núcleo é o Linux. Ao mesmo tempo, o projeto GNU, criado por Richard Stallman em 1983, já tinha quase tudo de um sistema tipo Unix livre (compilador, shell bash, utilitários), mas faltava o núcleo. A junção dos dois formou um sistema completo, que por isso também é chamado de GNU/Linux.
O núcleo Linux é distribuído pela licença GPL (GNU General Public License), na versão 2. A GPL é uma licença de software livre: ela permite usar, estudar, alterar e redistribuir o programa, desde que a versão alterada e redistribuída mantenha a mesma licença e o código-fonte aberto. Esse efeito é chamado de copyleft. Software livre não quer dizer software grátis: uma empresa pode cobrar pela distribuição ou pelo suporte, desde que respeite a licença.
Núcleo monolítico modular. O núcleo Linux é monolítico, isto é, os gerenciadores de memória, de processos, de arquivos e os controladores de dispositivo (drivers) rodam todos no espaço do núcleo, num só programa. Ele também é modular, porque aceita carregar e descarregar partes (os módulos, como um driver novo) com o sistema em funcionamento. Os comandos lsmod (lista os módulos carregados) e modprobe (carrega um módulo) cuidam disso. O núcleo monolítico não é o mesmo que o micronúcleo, que deixa a maior parte dos serviços fora do núcleo.
Árvore de diretórios. O Linux tem uma árvore única, que começa na raiz (/). Não há letras de unidade, como no Windows: um disco, um pen drive ou uma partição aparecem como um diretório da árvore, depois de montados (comando mount). O padrão FHS define o papel de cada diretório:
| Diretório | O que guarda |
|---|---|
/bin e /sbin |
Comandos essenciais; o /sbin traz os de administração |
/boot |
Núcleo e arquivos do carregador de inicialização |
/dev |
Arquivos que representam os dispositivos |
/etc |
Arquivos de configuração do sistema |
/home |
Diretórios pessoais dos usuários comuns |
/root |
Diretório pessoal do administrador (root) |
/lib |
Bibliotecas compartilhadas e módulos do núcleo |
/tmp |
Arquivos temporários, que qualquer usuário pode criar |
/usr |
Programas e bibliotecas dos usuários, só leitura em uso normal |
/var |
Dados que mudam: registros (logs), filas, caches |
/proc |
Sistema de arquivos virtual com dados dos processos e do núcleo |
/mnt e /media |
Pontos de montagem: o /media para mídias removíveis |
/opt |
Programas adicionais, instalados fora do gerenciador de pacotes |
Os registros do sistema ficam em /var/log. O /proc não ocupa espaço em disco: o núcleo gera o conteúdo na hora da leitura, e o arquivo /proc/cpuinfo mostra os dados do processador. O diretório /root não é a raiz: a raiz é o /, e o /root é só a pasta pessoal do administrador.
Caminhos. O caminho absoluto começa na raiz (/home/ana/relatorio.txt) e vale de qualquer lugar. O caminho relativo começa no diretório atual (docs/relatorio.txt). O ponto (.) é o diretório atual, os dois pontos (..) são o diretório pai e o til (~) é o diretório pessoal do usuário. Arquivos cujo nome começa com ponto (.bashrc) são ocultos e só aparecem com ls -a.
Comandos de arquivos e diretórios. O Linux diferencia maiúsculas de minúsculas: Relatorio.txt e relatorio.txt são dois arquivos diferentes, e o comando LS não existe. A tabela reúne os comandos básicos:
| Comando | O que faz |
|---|---|
pwd |
Mostra o diretório atual |
ls -l |
Lista com detalhes: tipo, permissões, dono, tamanho, data |
ls -a |
Lista incluindo os ocultos |
cd |
Muda de diretório; cd sozinho volta ao diretório pessoal |
mkdir -p |
Cria diretório, com os pais que faltarem |
rmdir |
Remove diretório vazio |
rm -r |
Remove diretório com todo o conteúdo |
cp |
Copia; com -r, copia diretórios |
mv |
Move ou renomeia |
touch |
Cria arquivo vazio ou atualiza a data |
cat |
Mostra o conteúdo inteiro ou junta arquivos |
less e more |
Mostram o conteúdo página por página |
head e tail |
Mostram o início e o fim; tail -f acompanha o arquivo |
grep |
Busca linhas com um padrão de texto |
find |
Busca arquivos por nome, tipo, tamanho ou data |
wc -l |
Conta linhas |
man |
Abre o manual de um comando |
O rm não manda o arquivo para uma lixeira: a remoção é definitiva. O rmdir só remove diretório vazio, e para remover um diretório com conteúdo o comando é rm -r. O grep busca dentro dos arquivos (o conteúdo), e o find busca os arquivos (pelo nome e por outras propriedades); essa troca cai muito.
Usuários e grupos. Cada usuário tem um número de identificação, o UID, e o administrador, chamado root, tem UID 0. O root pode tudo no sistema, e por isso o uso diário é feito com conta comum. As contas ficam em /etc/passwd, as senhas criptografadas ficam em /etc/shadow, que só o root lê, e os grupos ficam em /etc/group.
O comando su troca de usuário e pede a senha do usuário de destino. O comando sudo executa um só comando como root e pede a senha do próprio usuário, desde que ele esteja autorizado no arquivo /etc/sudoers. Os comandos useradd, usermod e userdel criam, alteram e removem contas, e o comando passwd troca a senha.
Permissões. Cada arquivo tem um dono (usuário), um grupo e três conjuntos de permissões: do dono (u, de user), do grupo (g, de group) e dos outros (o, de others). Cada conjunto tem três permissões: leitura (r, de read), escrita (w, de write) e execução (x, de execute). O comando ls -l mostra tudo isso no início da linha.
-rwxr-x--- 1 ana ti 2048 out 15 09:00 relatorio.sh
drwxr-xr-x 2 ana ti 4096 out 15 09:00 docs
O primeiro caractere é o tipo: - para arquivo comum, d para diretório e l para link simbólico. Os nove seguintes são as permissões, em três grupos de três: dono, grupo e outros. Depois vêm o número de links, o dono (ana), o grupo (ti), o tamanho, a data e o nome.
No diretório, as permissões mudam de sentido. A leitura (r) permite listar os nomes dos arquivos; a escrita (w) permite criar, apagar e renomear arquivos dentro dele; a execução (x) permite entrar no diretório com cd e acessar os arquivos. Por isso quem tem escrita no diretório pode apagar um arquivo dele, mesmo sem permissão de escrita no próprio arquivo.
Notação octal. Cada permissão tem um valor: leitura vale 4, escrita vale 2 e execução vale 1. A soma dá um dígito de 0 a 7 para cada conjunto, e três dígitos descrevem o arquivo inteiro, na ordem dono, grupo e outros.
Exemplo resolvido: converter as permissões rwxr-x--- do arquivo relatorio.sh para octal e montar o comando chmod.
- Dono
rwx: 4 + 2 + 1 = 7. - Grupo
r-x: 4 + 0 + 1 = 5. - Outros
---: 0 + 0 + 0 = 0. - Resultado: 750, e o comando é
chmod 750 relatorio.sh.
O caminho inverso também cai. O valor 640 dá 6 = 4 + 2 (rw-) ao dono, 4 (r--) ao grupo e 0 (---) aos outros, isto é, rw-r-----. O valor 755 dá rwxr-xr-x, o padrão de programas e diretórios.
Notação simbólica. O chmod também aceita letras: quem (u, g, o ou a, de all, todos), a operação (+ acrescenta, - retira, = define exatamente) e a permissão. O comando chmod u+x script.sh dá execução ao dono, e o comando chmod go-w dados.txt retira a escrita do grupo e dos outros. A notação simbólica muda só o que é citado, e a octal define tudo de uma vez.
Exemplo resolvido: o arquivo notas.txt tem rw-rw-r-- e recebe o comando chmod u+x,g-w,o=r notas.txt.
- Dono:
rw-mais execução virarwx(7). - Grupo:
rw-menos escrita virar--(4). - Outros:
=rdefine só leitura,r--(4). - Resultado:
rwxr--r--, isto é, 744.
Dono e grupo. O comando chown muda o dono (e o grupo, na forma chown ana:ti arquivo), e o comando chgrp muda só o grupo. Em regra, só o root muda o dono de um arquivo.
Máscara (umask). Quando um arquivo novo nasce, o sistema parte de uma permissão máxima e retira o que a umask manda. A permissão máxima é 666 para arquivos (sem execução) e 777 para diretórios. A umask indica as permissões que saem.
Exemplo resolvido: a umask é 027. Calcular as permissões de um arquivo novo e de um diretório novo.
- Arquivo: o 666 perde o 0, o 2 e o 7 de cada posição. Dono 6 sem nada fica 6; grupo 6 sem escrita fica 4; outros 6 sem tudo fica 0. Resultado: 640 (
rw-r-----). - Diretório: o 777 perde o mesmo. Dono 7; grupo 7 sem escrita fica 5; outros 0. Resultado: 750 (
rwxr-x---).
Com a umask comum de 022, o arquivo nasce com 644 e o diretório com 755. A conta correta é retirar bits, e não subtrair os números: a umask 033 tira escrita e execução do grupo e dos outros, e o arquivo nasce com 644, e não com 633.
Permissões especiais. Há três bits especiais. O SUID (set user ID), num executável, faz o programa rodar com os poderes do dono do arquivo, e não de quem o executa: o comando passwd pertence ao root e tem SUID, e por isso um usuário comum consegue gravar a nova senha em /etc/shadow. O SGID (set group ID) faz o programa rodar com o grupo do arquivo e, num diretório, faz os arquivos novos herdarem o grupo do diretório. O sticky bit, num diretório, só deixa apagar um arquivo o dono dele, o dono do diretório ou o root.
Na listagem, o SUID aparece como s no lugar do x do dono, o SGID como s no lugar do x do grupo e o sticky bit como t no lugar do x dos outros. Em octal, os três ganham um quarto dígito à esquerda: SUID vale 4, SGID vale 2 e sticky vale 1. O diretório /tmp tem drwxrwxrwt (1777): todos escrevem nele, mas ninguém apaga o arquivo dos outros.
Links. Um link físico (hard link), criado com ln origem nome, é um segundo nome para o mesmo arquivo: os dois nomes apontam para o mesmo inode, a estrutura que guarda os dados e os atributos do arquivo. O arquivo só some do disco quando o último nome é apagado. O link físico não atravessa sistemas de arquivos diferentes e, em regra, não aponta para diretório.
Um link simbólico (symbolic link), criado com ln -s origem nome, é um arquivo pequeno que guarda o caminho do outro, como um atalho. Ele tem inode próprio, pode apontar para diretório e para outro sistema de arquivos, mas fica quebrado se o arquivo original for apagado. Na listagem, o link simbólico começa com l.
Processos. Cada programa em execução é um processo, com um número de identificação, o PID. O primeiro processo do sistema, o init ou o systemd, tem PID 1 e é o ancestral dos outros. O comando ps aux lista os processos, e o top mostra os processos em tempo real, com o uso de processador e de memória.
O comando kill envia um sinal a um processo pelo PID. Sem opção, o kill envia o sinal 15 (SIGTERM), que pede ao processo que termine e deixa ele fechar os arquivos. O comando kill -9 envia o SIGKILL, que encerra o processo na hora, sem chance de reação. O atalho Ctrl+C envia o sinal 2 (SIGINT) ao programa em primeiro plano, e o comando killall envia o sinal pelo nome do programa.
Um comando terminado em & roda em segundo plano e libera o terminal. O comando jobs lista as tarefas do terminal, o fg traz uma tarefa para o primeiro plano e o bg retoma em segundo plano uma tarefa parada com Ctrl+Z. O comando nohup mantém o processo vivo depois que o usuário sai do terminal.
Outros comandos de administração. O df -h mostra o espaço livre de cada sistema de arquivos montado, e o du -sh mostra quanto um diretório ocupa. O free -h mostra a memória usada e livre. O tar junta arquivos num só pacote: tar -czvf backup.tar.gz docs cria o pacote compactado com gzip, e tar -xzvf backup.tar.gz extrai. O uname -r mostra a versão do núcleo.
Inicialização e serviços. O computador liga e roda o firmware (BIOS ou UEFI), que chama o carregador de inicialização, em geral o GRUB. O GRUB carrega o núcleo, o núcleo monta a raiz e inicia o processo de PID 1. Nas distribuições atuais, esse processo é o systemd, que sobe os serviços; o comando systemctl inicia, para e consulta os serviços (systemctl status sshd).
- O firmware BIOS ou UEFI testa o hardware
- O firmware chama o carregador GRUB
- O GRUB carrega o núcleo na memória
- O núcleo detecta o hardware e monta a raiz
- O núcleo inicia o processo de PID 1
- O systemd sobe os serviços
- O sistema mostra a tela de login
Na prática, a servidora Bia, do setor de TI de uma prefeitura, precisa que só ela edite o script de backup, que o grupo ti possa ler e executar o script e que os outros usuários não vejam nada. Ela usa chown bia:ti backup.sh e depois chmod 750 backup.sh. Para ver se o serviço de banco de dados está ativo depois de reiniciar o servidor, ela usa systemctl status com o nome do serviço.
A diferença para o conceito vizinho: link físico é outro nome para o mesmo inode, e link simbólico é um atalho com inode próprio. O su troca de usuário com a senha do destino, e o sudo executa um comando como root com a senha do próprio usuário. O erro comum é calcular a umask por subtração simples e achar que o kill sem opção encerra o processo à força.
No Linux, o comando chmod 640 relatorio.txt dá ao dono leitura e escrita, dá ao grupo apenas leitura e retira todas as permissões dos demais usuários.
Comentário:
Conta: 6 = 4 + 2 (leitura e escrita) para o dono, 4 (leitura) para o grupo e 0 (nenhuma) para os outros.
A afirmação descreve corretamente o resultado rw-r-----. O dígito 0 nos outros retira a leitura, a escrita e a execução.
Resultado: certo.
-rwsr-xr-x 1 root root 68208 mar 10 09:00 /usr/bin/passwd
drwxrwxrwt 15 root root 4096 out 15 08:00 /tmp
lrwxrwxrwx 1 ana ti 18 out 15 08:30 atalho -> /home/ana/dados
Considere a listagem acima, obtida com o comando ls -l num servidor Linux. Assinale a alternativa correta.
- A) O arquivo atalho é um link físico, porque divide o mesmo inode com o diretório de destino.
- B) Um usuário comum que executa o passwd roda o programa com os poderes do próprio usuário, e não do root.
- C) No /tmp, qualquer usuário pode apagar qualquer arquivo, porque os outros têm permissão de escrita.
- D) O /tmp tem o sticky bit, e por isso cada usuário só apaga, nesse diretório, os arquivos de que é dono.
- E) O passwd tem o sticky bit, indicado pela letra s na posição de execução do dono.
Comentário:
A) Errada.
Regra: a letra l no início indica link simbólico, que tem inode próprio e guarda o caminho do destino.
A alternativa erra em é um link físico, porque divide o mesmo inode com o diretório de destino: o link físico não aparece com l e, em regra, não aponta para diretório.
B) Errada.
Regra: com o SUID, o programa roda com os poderes do dono do arquivo.
A alternativa erra em roda o programa com os poderes do próprio usuário, e não do root: o passwd tem dono root e SUID, e por isso roda com os poderes do root.
C) Errada.
Regra: o sticky bit no diretório só deixa apagar o arquivo o dono dele, o dono do diretório ou o root.
A alternativa erra em qualquer usuário pode apagar qualquer arquivo: o t no fim da permissão do /tmp indica o sticky bit, que impede essa remoção.
D) Certa.
Regra: o t no lugar do x dos outros indica o sticky bit, que limita a remoção ao dono do arquivo, ao dono do diretório e ao root.
Todos escrevem no /tmp, mas o sticky bit protege o arquivo de cada um contra a remoção pelos outros.
E) Errada.
Regra: o s na posição de execução do dono indica o SUID; o sticky bit aparece como t na posição dos outros.
A alternativa erra em tem o sticky bit, indicado pela letra s na posição de execução do dono: o s do dono é o SUID.
Resultado: alternativa D.
Um administrador de servidor Linux precisa encerrar um processo travado. Antes, ele tenta um encerramento que deixe o processo fechar os arquivos abertos e, se isso falhar, quer encerrar o processo na hora. Assinale a alternativa que traz a sequência correta.
- A) Primeiro kill com o PID, sem opção, que envia o SIGTERM; depois kill -9 com o PID, que envia o SIGKILL.
- B) Primeiro kill -9 com o PID, que pede ao processo que termine; depois kill sem opção, que encerra à força.
- C) Primeiro kill -2 com o PID, que encerra à força; depois kill -15 com o PID, que pede o término.
- D) Primeiro killall com o PID, que envia o SIGKILL; depois ps aux, que encerra os processos restantes.
- E) Primeiro top com o PID, que envia o SIGTERM; depois kill sem opção, que envia o SIGKILL.
Comentário:
A) Certa.
Regra: o kill sem opção envia o sinal 15 (SIGTERM), que pede o término; o kill -9 envia o SIGKILL, que encerra na hora.
A sequência começa pelo pedido educado e termina pela ordem que o processo não pode ignorar.
B) Errada.
Regra: o sinal 9 (SIGKILL) encerra na hora, e o sinal 15 (SIGTERM) pede o término.
A alternativa erra em Primeiro kill -9 com o PID, que pede ao processo que termine: o sinal 9 não pede, ele encerra à força, e a ordem está invertida.
C) Errada.
Regra: o sinal 2 (SIGINT) é o do Ctrl+C, uma interrupção que o programa pode tratar, e não um encerramento à força.
A alternativa erra em kill -2 com o PID, que encerra à força: o encerramento à força é o sinal 9.
D) Errada.
Regra: o killall envia o sinal pelo nome do programa, e o ps só lista processos.
A alternativa erra em killall com o PID, que envia o SIGKILL e em ps aux, que encerra os processos restantes: o killall usa o nome, envia o SIGTERM sem opção, e o ps não encerra nada.
E) Errada.
Regra: o top mostra os processos em tempo real, e o kill sem opção envia o SIGTERM.
A alternativa erra em top com o PID, que envia o SIGTERM e em kill sem opção, que envia o SIGKILL: o top é um monitor, e o kill sem opção envia o sinal 15.
Resultado: alternativa A.
Como a banca cobra: a banca dá uma permissão em letras e pede o octal (ou o contrário), pergunta o diretório de cada tipo de arquivo, troca grep e find, su e sudo, link físico e simbólico, e o sinal 9 e o 15. A leitura da listagem do ls -l, com SUID e sticky bit, é cobrada com frequência.
Scripts em Unix e Linux
Um administrador que faz backup todo dia digita os mesmos comandos toda manhã, e um erro de digitação pode estragar o trabalho. O script de shell resolve esse problema: é um arquivo de texto com uma sequência de comandos que o shell executa em ordem, como se o usuário digitasse cada um. O script aceita variáveis, decisões e repetições, e por isso é uma linguagem de programação simples.
Shebang e execução. A primeira linha do script indica o interpretador, com os caracteres cerquilha e exclamação seguidos do caminho do shell, como #!/bin/bash. Essa linha é a shebang. Para executar o script pelo nome, ele precisa da permissão de execução (chmod +x backup.sh) e é chamado com o caminho, como ./backup.sh, porque o diretório atual em geral não está na lista de busca de comandos (a variável PATH).
O script também roda sem a permissão de execução, quando é passado como argumento ao shell: bash backup.sh. O comando source backup.sh (ou um ponto seguido do nome) executa o script no shell atual, e não num shell novo; por isso as variáveis criadas pelo script continuam valendo depois dele. A linha que começa com cerquilha, fora a shebang, é comentário e não é executada.
Variáveis. A variável é criada com o nome, o sinal de igual e o valor, sem espaços em volta do igual: nome=Ana. Com espaço (nome = Ana), o shell entende nome como um comando, e dá erro. Para usar o valor, o script escreve um cifrão antes do nome. Todas as variáveis do shell guardam texto; a conta aritmética usa a forma de duplos parênteses precedida de cifrão.
Uma variável criada no script só existe naquele shell. O comando export torna a variável visível para os programas que o script chama, e as variáveis de ambiente comuns são PATH (lista de diretórios onde o shell procura os comandos), HOME (diretório pessoal) e USER (nome do usuário).
Parâmetros especiais. O script recebe argumentos na linha de comando, e o shell guarda cada um num parâmetro. No código, cada parâmetro é escrito com cifrão antes do símbolo, como mostra o quadro:
$0 nome do script
$1 primeiro argumento ($2 é o segundo, e assim por diante)
$# quantidade de argumentos
$@ todos os argumentos, cada um separado
$? código de saída do último comando
$$ PID do shell que executa o script
O parâmetro especial que guarda o código de saída é o mais cobrado. Todo comando termina com um código de saída (exit status): 0 indica sucesso, e qualquer valor de 1 a 255 indica erro. O comando exit encerra o script com o código indicado, como exit 1. O 0 como sucesso é o contrário do costume de outras linguagens, em que 0 é falso.
Aspas. O shell trata cada tipo de aspas de um jeito. As aspas simples guardam o texto literal: nada dentro delas é substituído, nem a variável. As aspas duplas substituem as variáveis e os comandos, mas mantêm os espaços e impedem que o texto se parta em várias palavras. A substituição de comando, escrita com cifrão e parênteses ou com crases, troca o comando pela saída dele: a variável hoje recebe a data quando o script atribui a ela a substituição do comando date.
Testes e decisões. A estrutura if executa um bloco quando um comando termina com código 0. O comando de teste mais comum é o colchete ([ ... ], que é o mesmo comando test), com espaço depois do colchete de abertura e antes do de fechamento. O bloco termina com fi, que é o if ao contrário. A estrutura case escolhe entre vários padrões e termina com esac.
Os operadores de teste mudam conforme o tipo de dado:
| Operador | Testa | Exemplo de uso |
|---|---|---|
-eq, -ne |
Números iguais, diferentes | idade igual a 18 |
-lt, -le |
Menor, menor ou igual | nota menor que 6 |
-gt, -ge |
Maior, maior ou igual | total maior que 10 |
= e != |
Textos iguais, diferentes | resposta igual a sim |
-z, -n |
Texto vazio, não vazio | nome vazio |
-f, -d, -e |
Arquivo comum, diretório, existe | o arquivo existe |
-r, -w, -x |
Pode ler, gravar, executar | o script é executável |
O sinal = compara texto, e o -eq compara número. O sinal > dentro do colchete simples não compara número: ele é lido como redirecionamento e cria um arquivo.
Operadores && e ||. O operador && executa o segundo comando só se o primeiro der certo (código 0). O operador || executa o segundo só se o primeiro falhar. O comando mkdir dados && cd dados só entra no diretório se ele foi criado, e o comando ping -c1 servidor || echo "fora do ar" só mostra o aviso se o ping falhar. O ponto e vírgula (;) executa os dois comandos em sequência, sem olhar o resultado.
Laços. O laço for repete o bloco para cada item de uma lista. O laço while repete enquanto a condição dá código 0, e o laço until repete enquanto a condição falha. Os três têm o corpo entre do e done. O comando read lê uma linha do teclado e guarda numa variável.
- O shell executa o comando de teste
- O shell guarda o código de saída do teste
- O código de saída é 0?SimO shell executa o bloco do thenNãoO shell executa o bloco do else, se houver
- O shell continua depois do fi
Exemplo resolvido: o script soma.sh abaixo soma os argumentos recebidos e diz se o total é alto ou baixo. Ele é executado com ./soma.sh 3 4 5.
#!/bin/bash
total=0
for n in "$@"; do
total=$((total + n))
done
echo "Argumentos: $#"
echo "Soma: $total"
if [ "$total" -gt 10 ]; then
echo "alto"
else
echo "baixo"
fi
- A variável
totalcomeça com 0. - O laço
forpercorre todos os argumentos, um de cada vez: 3, 4 e 5. - A cada volta, a conta aritmética soma o argumento ao total: 0 + 3 = 3; 3 + 4 = 7; 7 + 5 = 12.
- A primeira linha impressa traz a quantidade de argumentos:
Argumentos: 3. - A segunda linha traz a soma:
Soma: 12. - O teste
-gt 10compara 12 com 10 como números; 12 é maior, o teste termina com código 0 e o script imprimealto.
Agendamento com cron. O cron é o serviço que executa comandos em horários marcados. Cada usuário edita a sua tabela com crontab -e e lista com crontab -l. Cada linha tem cinco campos de tempo e o comando, nesta ordem: minuto (0 a 59), hora (0 a 23), dia do mês (1 a 31), mês (1 a 12) e dia da semana (0 a 7, em que 0 e 7 são domingo).
30 2 * * 1-5 /home/bia/backup.sh
0 */6 * * * /home/bia/limpa.sh
A primeira linha roda o backup às 2h30, de segunda a sexta. A segunda roda a limpeza no minuto 0 de cada 6 horas (0h, 6h, 12h e 18h). O asterisco quer dizer "qualquer valor", o hífen marca um intervalo e a barra marca o passo. O comando at agenda um comando para rodar uma vez só, e o cron agenda a repetição.
Na prática, a servidora Bia escreve um script que compacta a pasta de relatórios com tar, grava a saída num arquivo de registro com >> e termina com exit 1 se o tar falhar, testando o código de saída. Ela dá permissão de execução com chmod 750 e agenda o script no cron para as 2h30 dos dias úteis. Se a cópia falhar, o código de saída diferente de 0 aparece no registro, e ela vê o problema na manhã seguinte.
A diferença para o conceito vizinho: executar com ./script.sh ou bash script.sh cria um shell novo, e as variáveis somem no fim; executar com source roda no shell atual. As aspas simples guardam o texto literal, e as duplas substituem as variáveis. O erro comum é pôr espaço em volta do igual na criação da variável e achar que o código de saída 0 indica erro.
Num script em bash, o código de saída 0 indica que o último comando falhou, e o operador && executa o segundo comando apenas quando o primeiro termina com código diferente de 0.
Comentário:
Regra: o código de saída 0 indica sucesso, e o operador && executa o segundo comando só quando o primeiro termina com código 0.
A afirmação erra em o código de saída 0 indica que o último comando falhou: o 0 indica sucesso. Ela também erra em apenas quando o primeiro termina com código diferente de 0: esse é o comportamento do operador ||.
Resultado: errado.
#!/bin/bash
cont=0
for arq in a.txt b.log c.txt d.txt; do
case "$arq" in
*.txt) cont=$((cont + 1)) ;;
esac
done
echo "txt: $cont"
nome="prova"
echo 'nome' "$nome"
Considere o script acima, executado num sistema Linux com o bash. Assinale a alternativa que traz as duas linhas que o script imprime, na ordem.
- A) txt: 4 e nome prova.
- B) txt: 3 e prova prova.
- C) txt: 4 e nome nome.
- D) txt: 1 e nome prova.
- E) txt: 3 e nome prova.
Comentário:
A) Errada.
Conta: o padrão do case aceita só os nomes que terminam em .txt: a.txt, c.txt e d.txt, que dão 3.
A alternativa erra em txt: 4: o b.log não termina em .txt e não soma.
B) Errada.
Regra: dentro de aspas simples, o texto fica literal, e a palavra nome sai como está.
A alternativa erra em prova prova: o primeiro argumento do último echo está em aspas simples e sem cifrão, e sai como a palavra nome.
C) Errada.
Regra: dentro de aspas duplas, a variável precedida de cifrão é trocada pelo valor.
A alternativa erra em txt: 4 e em nome nome: a contagem é 3, e o segundo argumento do último echo traz o valor da variável, prova.
D) Errada.
Conta: a variável cont soma 1 a cada nome terminado em .txt, e há três desses nomes na lista.
A alternativa erra em txt: 1: o laço passa pelos quatro nomes e soma três vezes.
E) Certa.
Conta: a.txt, c.txt e d.txt somam 1 cada, e 0 + 1 + 1 + 1 = 3; o último echo imprime a palavra literal e o valor da variável.
A primeira linha é txt: 3. A segunda junta a palavra nome, das aspas simples, com o valor prova, das aspas duplas.
Resultado: alternativa E.
Na tabela do cron, a linha que começa com os campos 0 18 * * 5 executa o comando todas as sextas-feiras às 18h, no minuto 0.
Comentário:
Regra: os cinco campos do cron são minuto, hora, dia do mês, mês e dia da semana, e o dia da semana 5 é a sexta-feira.
O minuto é 0, a hora é 18, o dia do mês e o mês são qualquer valor e o dia da semana é 5. A linha roda o comando às 18h de toda sexta-feira.
Resultado: certo.
Como a banca cobra: a banca mostra um script curto e pede a saída, pergunta o significado dos parâmetros especiais e do código de saída, troca aspas simples e duplas, -eq e =, && e ||, e pede a leitura de uma linha do cron.
Distribuições Linux
O núcleo Linux sozinho não serve ao usuário: falta o shell, os utilitários, o instalador, a interface gráfica e os programas. Uma distribuição Linux (distro) é o pacote completo que junta o núcleo Linux, as ferramentas GNU, um gerenciador de pacotes, um instalador, os programas e, em geral, um ambiente gráfico. Todas usam o mesmo núcleo, e o que muda entre elas é a escolha dos programas, o formato de pacote, o ritmo de atualização e o público.
Pacotes e gerenciadores. O pacote é um arquivo que traz um programa pronto para instalar, com a lista das dependências, isto é, os outros pacotes de que ele precisa. O gerenciador de pacotes baixa os pacotes de repositórios (servidores com os programas aprovados pela distribuição), resolve as dependências, instala, atualiza e remove. Há duas camadas: a ferramenta de baixo nível instala um arquivo de pacote local e não baixa dependências; a ferramenta de alto nível usa os repositórios e resolve as dependências.
Família Debian. O Debian é uma distribuição mantida por uma comunidade de voluntários, conhecida pela estabilidade. Os pacotes têm a extensão .deb, a ferramenta de baixo nível é o dpkg e a de alto nível é o apt (com o apt-get, mais antigo). Da família Debian vêm o Ubuntu, mantido pela empresa Canonical, o Linux Mint, baseado no Ubuntu, e o Kali Linux, voltado a testes de segurança.
O Ubuntu lança versões de suporte de longo prazo (LTS, Long Term Support) a cada dois anos, com cinco anos de suporte padrão, e versões intermediárias com suporte curto. Os órgãos públicos usam a versão LTS nos servidores, porque ela recebe correções por mais tempo.
Família Red Hat. O Red Hat Enterprise Linux (RHEL) é a distribuição comercial da empresa Red Hat, vendida por assinatura com suporte. Os pacotes têm a extensão .rpm, a ferramenta de baixo nível é o rpm e a de alto nível é o dnf, que substituiu o yum. O Fedora é a distribuição comunitária patrocinada pela Red Hat, onde as novidades aparecem antes de chegar ao RHEL.
O CentOS Linux era uma recompilação gratuita do RHEL e foi descontinuado; deu lugar ao CentOS Stream, que fica um passo à frente do RHEL. O Rocky Linux e o AlmaLinux assumiram o papel de alternativas gratuitas compatíveis com o RHEL, e o Oracle Linux também segue o RHEL. A família SUSE (openSUSE e SUSE Linux Enterprise) também usa pacotes .rpm, mas com o gerenciador zypper e a ferramenta de configuração YaST.
Outras distribuições. O Arch Linux é minimalista: o usuário monta o sistema peça por peça, e o gerenciador é o pacman. O Gentoo compila os programas a partir do código-fonte, com o sistema Portage (comando emerge), para ajustar cada programa à máquina. O Slackware é uma das distribuições mais antigas ainda mantidas e segue um modelo simples, perto do Unix tradicional. O Alpine Linux é muito pequeno, usa o gerenciador apk e é comum em contêineres.
Exemplo resolvido: instalar o servidor web nginx e atualizar o sistema num servidor Ubuntu e num servidor Rocky Linux.
- Ubuntu (família Debian):
sudo apt updateatualiza a lista de pacotes dos repositórios. - Ubuntu:
sudo apt install nginxbaixa e instala o nginx com as dependências. - Ubuntu:
sudo apt upgradeinstala as versões novas dos pacotes já instalados. - Rocky Linux (família Red Hat):
sudo dnf install nginxinstala o nginx com as dependências; odnfjá consulta os repositórios na hora. - Rocky Linux:
sudo dnf upgradeatualiza os pacotes instalados. - Para um arquivo baixado à parte, o Ubuntu usa
sudo dpkg -i pacote.debe o Rocky usasudo rpm -ivh pacote.rpm; nenhum dos dois resolve as dependências sozinho.
No Debian e no Ubuntu, o apt update só renova a lista e não instala nada; quem instala as versões novas é o apt upgrade. Essa troca é frequente.
Modelos de lançamento. No lançamento fixo (fixed release), a distribuição publica versões numeradas, congela os programas de cada versão e só manda correções até a versão seguinte: Debian, Ubuntu, RHEL e Rocky seguem esse modelo. No lançamento contínuo (rolling release), não há versão nova: o sistema recebe as atualizações sem parar, e a instalação está sempre na última versão de cada programa. O Arch Linux e o openSUSE Tumbleweed seguem o modelo contínuo.
O lançamento fixo dá estabilidade, e por isso domina nos servidores. O lançamento contínuo traz as novidades primeiro, com mais risco de uma atualização quebrar algo.
Ambientes gráficos. A interface gráfica não faz parte do núcleo. O servidor gráfico (o X11, chamado de X Window System, ou o Wayland, mais novo) desenha as janelas, e o ambiente de área de trabalho dá a cara do sistema: GNOME (padrão do Ubuntu e do Fedora), KDE Plasma, Xfce e LXQt (leves, para máquinas antigas), Cinnamon e MATE (do Linux Mint). Uma mesma distribuição aceita vários ambientes, e um servidor costuma rodar sem nenhum.
Mídia live e usos do núcleo. Muitas distribuições oferecem a mídia live: o sistema roda direto do pen drive ou do DVD, sem instalar nada no disco, o que serve para testar a distribuição ou recuperar arquivos de um computador com defeito. O núcleo Linux também está fora dos computadores de mesa: o Android usa o núcleo Linux, e a maior parte dos servidores e dos supercomputadores roda distribuições Linux.
Na prática, a equipe de TI de um tribunal escolhe o sistema para os servidores de banco de dados e quer suporte pago do fabricante. A escolha natural é o RHEL, com contrato de suporte. Se o tribunal não quer pagar a assinatura e quer compatibilidade com o RHEL, ele usa o Rocky Linux ou o AlmaLinux, com os mesmos comandos dnf e rpm.
A diferença para o conceito vizinho: o núcleo é o mesmo em todas as distribuições, e o que separa as famílias é o formato de pacote e o gerenciador (.deb com dpkg e apt; .rpm com rpm e dnf). O erro comum é ligar o Ubuntu à família Red Hat ou achar que o Fedora é a versão paga do RHEL.
As distribuições Ubuntu e Fedora usam núcleos diferentes do Linux, e a principal diferença entre elas é que o Ubuntu usa pacotes .rpm gerenciados pelo dnf, enquanto o Fedora usa pacotes .deb gerenciados pelo apt.
Comentário:
Regra: todas as distribuições usam o núcleo Linux; o Ubuntu, da família Debian, usa .deb com dpkg e apt, e o Fedora, da família Red Hat, usa .rpm com rpm e dnf.
A afirmação erra em usam núcleos diferentes do Linux: o núcleo é o mesmo, em versões que podem variar. Ela também erra em o Ubuntu usa pacotes .rpm gerenciados pelo dnf, enquanto o Fedora usa pacotes .deb gerenciados pelo apt: os formatos e os gerenciadores estão trocados.
Resultado: errado.
Um órgão quer padronizar os servidores numa distribuição gratuita, compatível com o Red Hat Enterprise Linux, com versões numeradas e estáveis. Assinale a alternativa que traz uma escolha adequada e uma informação correta sobre ela.
- A) Arch Linux, que segue o lançamento fixo e usa o gerenciador dnf.
- B) Debian, que é compatível com o RHEL e usa pacotes .rpm.
- C) Rocky Linux, que segue o RHEL e usa os comandos dnf e rpm.
- D) Gentoo, que segue o RHEL e instala pacotes binários prontos com o apt.
- E) Fedora, que é a versão paga com suporte do RHEL e segue o lançamento contínuo.
Comentário:
A) Errada.
Regra: o Arch Linux segue o lançamento contínuo e usa o gerenciador pacman.
A alternativa erra em segue o lançamento fixo e usa o gerenciador dnf: o Arch é contínuo, e o dnf é da família Red Hat.
B) Errada.
Regra: o Debian é a base da família Debian e usa pacotes .deb, com dpkg e apt.
A alternativa erra em é compatível com o RHEL e usa pacotes .rpm: o Debian não segue o RHEL e não usa .rpm.
C) Certa.
Regra: o Rocky Linux é uma distribuição gratuita compatível com o RHEL, de lançamento fixo, com dnf e rpm.
O Rocky atende aos três pedidos: é gratuito, segue o RHEL e tem versões numeradas.
D) Errada.
Regra: o Gentoo compila os programas a partir do código-fonte, com o Portage (emerge).
A alternativa erra em segue o RHEL e instala pacotes binários prontos com o apt: o Gentoo não segue o RHEL, compila do código-fonte e não usa o apt.
E) Errada.
Regra: o Fedora é a distribuição comunitária e gratuita patrocinada pela Red Hat, onde as novidades aparecem antes de chegar ao RHEL.
A alternativa erra em é a versão paga com suporte do RHEL e segue o lançamento contínuo: o Fedora é gratuito, e o Fedora tem versões numeradas.
Resultado: alternativa C.
Como a banca cobra: a banca pede a família de cada distribuição, o formato de pacote e o gerenciador de cada família, a diferença entre apt update e apt upgrade, e o modelo de lançamento do Arch e do Debian.
- Linux e Unix
- Unix
- Núcleo, shell e utilitários
- Tudo é arquivo
- Pipes e redirecionamento
- POSIX
- Ramos System V e BSD
- Linux
- Núcleo monolítico modular
- GNU e licença GPL
- Árvore de diretórios FHS
- Comandos de arquivos
- Permissões rwx e octal
- Umask e bits especiais
- Links físico e simbólico
- Processos e sinais
- Inicialização com systemd
- Scripts
- Shebang e execução
- Variáveis e parâmetros especiais
- Código de saída
- Aspas simples e duplas
- Testes, if e case
- Laços for e while
- Agendamento com cron
- Distribuições
- Família Debian
- Família Red Hat
- SUSE, Arch, Gentoo, Alpine
- Lançamento fixo e contínuo
- Ambientes gráficos
- Unix
Quadros e comparações
A tabela compara as famílias de distribuições pelo pacote e pelos gerenciadores.
| Família | Distribuições | Pacote e baixo nível | Alto nível |
|---|---|---|---|
| Debian | Debian, Ubuntu, Linux Mint, Kali | .deb com dpkg | apt e apt-get |
| Red Hat | RHEL, Fedora, CentOS Stream, Rocky, AlmaLinux | .rpm com rpm | dnf, antes yum |
| SUSE | openSUSE, SUSE Linux Enterprise | .rpm com rpm | zypper |
| Arch | Arch Linux | Pacote próprio | pacman |
| Gentoo | Gentoo | Código-fonte | emerge (Portage) |
A tabela compara o link físico e o link simbólico.
| Característica | Link físico | Link simbólico |
|---|---|---|
| Comando | ln origem nome | ln -s origem nome |
| Inode | O mesmo do original | Inode próprio |
| Aponta para diretório | Não, em regra | Sim |
| Outro sistema de arquivos | Não | Sim |
| Original apagado | Os dados continuam | O link fica quebrado |
A tabela compara as permissões especiais.
| Bit | Valor octal | Na listagem | Efeito |
|---|---|---|---|
| SUID | 4 | s no x do dono | Executável roda com os poderes do dono |
| SGID | 2 | s no x do grupo | Roda com o grupo; no diretório, herda o grupo |
| Sticky | 1 | t no x dos outros | No diretório, só o dono apaga o arquivo |
A tabela compara comandos que a prova troca.
| Comando | Faz | Não confundir com |
|---|---|---|
| grep | Busca texto dentro dos arquivos | find, que busca os arquivos |
| su | Troca de usuário com a senha do destino | sudo, que executa um comando como root |
| kill sem opção | Envia o sinal 15 e pede o término | kill -9, que encerra na hora |
| apt update | Renova a lista dos repositórios | apt upgrade, que instala as versões novas |
| cron | Repete o comando no horário marcado | at, que roda uma vez só |
Para decorar
- Permissões: leitura 4, escrita 2, execução 1; ordem dono, grupo, outros.
- Base da umask: 666 para arquivo e 777 para diretório; a umask retira bits.
- Umask 022: arquivo 644 e diretório 755.
- Bits especiais: SUID 4, SGID 2, sticky 1; o /tmp tem 1777.
- Root: UID 0; o processo init ou systemd tem PID 1.
- Descritores: 0 entrada, 1 saída, 2 erro.
- Sinais: 15 SIGTERM (padrão do kill), 9 SIGKILL, 2 SIGINT (Ctrl+C).
- Código de saída: 0 é sucesso; de 1 a 255 é erro.
- Cron: minuto, hora, dia do mês, mês, dia da semana; domingo é 0 ou 7.
- Fim de bloco no script: if termina em fi, case em esac, laço em done.
- Pacotes: Debian usa .deb, dpkg e apt; Red Hat usa .rpm, rpm e dnf.
- Ubuntu LTS: a cada 2 anos, com 5 anos de suporte padrão.
Pegadinhas
| # | Errado | Certo |
|---|---|---|
| 1 | O shell é a parte do núcleo que acessa o hardware. | O shell é um programa fora do núcleo que interpreta comandos. |
| 2 | O Linux descende do código da AT&T e é um UNIX certificado. | O Linux foi escrito do zero e é um sistema tipo Unix. |
| 3 | O operador >> apaga o arquivo e grava a saída. | O >> acrescenta ao fim; quem apaga e grava é o >. |
| 4 | O diretório /root é a raiz do sistema. | A raiz é o /; o /root é a pasta pessoal do administrador. |
| 5 | O find busca um texto dentro dos arquivos. | O grep busca texto dentro dos arquivos; o find busca arquivos. |
| 6 | Com umask 033, o arquivo nasce com 633. | A umask retira bits; o arquivo nasce com 644. |
| 7 | O kill sem opção encerra o processo à força. | Sem opção, o kill envia o sinal 15, que pede o término. |
| 8 | O link simbólico divide o inode com o original. | Quem divide o inode é o link físico; o simbólico tem inode próprio. |
| 9 | No script, o código de saída 0 indica erro. | O código 0 indica sucesso; de 1 a 255, erro. |
| 10 | Dentro de aspas simples, o shell troca a variável pelo valor. | Aspas simples guardam o texto literal; as duplas substituem. |
| 11 | O Ubuntu é da família Red Hat e usa pacotes .rpm. | O Ubuntu é da família Debian e usa .deb, dpkg e apt. |
| 12 | O apt update instala as versões novas dos pacotes. | O apt update renova a lista; o apt upgrade instala as versões novas. |
Fontes e data
- [1] POSIX.1 (IEEE Std 1003.1), edição de 2024, interface padrão dos sistemas do tipo Unix.
- [2] FHS 3.0 (Filesystem Hierarchy Standard), da Linux Foundation.
- [3] Conhecimento consolidado de livro didático de sistemas operacionais (Unix, Linux, shell e distribuições).
Texto conferido em 15/10/2026.