Instituto Federal de Educação, Ciência e Tecnologia do Paraná MINISTÉRIO DAS COMUNICAÇÕES SECRETARIA EXECUTIVA COORDENAÇÃO GERAL DE ACOMPANHAMENTO DE PROJETOS ESPECIAIS Elaborado por Marcos Laureano [email protected] CGPE/SE-MC Brasília-DF, Maio de 2009 Sumário 1 Caracterı́sticas do Sistemas Unix/Linux 1.1 Usuários . . . . . . . . . . . . . . . . 1.2 Comandos . . . . . . . . . . . . . . . 1.3 Principais diretórios . . . . . . . . . . 1.4 O diretório HOME . . . . . . . . . . 1.5 Interpretador de Comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 9 9 10 11 11 2 Comandos Básicos 2.1 Iniciando uma sessão . . . . . . . . . . . . . . . 2.2 Comando exit . . . . . . . . . . . . . . . . . . . 2.2.1 Atividades sugeridas . . . . . . . . . . . 2.3 Obtendo HELP no Sistema - Páginas de Manual 2.3.1 Atividades sugeridas . . . . . . . . . . . 2.4 Comando passwd . . . . . . . . . . . . . . . . . 2.4.1 Atividades sugeridas . . . . . . . . . . . 2.5 Comando expr . . . . . . . . . . . . . . . . . . . 2.5.1 Atividades sugeridas . . . . . . . . . . . 2.6 Caminho de arquivos . . . . . . . . . . . . . . . 2.7 Comandos básicos . . . . . . . . . . . . . . . . . 2.8 Diretórios Especiais “.” e “..” . . . . . . . . . . 2.8.1 Atividades sugeridas . . . . . . . . . . . 2.9 Atributos de Arquivos . . . . . . . . . . . . . . 2.9.1 Atividades sugeridas . . . . . . . . . . . 2.10 Comandos avançados . . . . . . . . . . . . . . . 2.11 Informações em arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 13 13 13 14 15 16 16 16 17 17 17 20 20 20 21 21 22 3 Permissões em arquivos 3.1 Definições básicas . . . . . . 3.2 Consultando permissões . . 3.3 Comando chmod . . . . . . 3.3.1 Modo Simbólico . . . 3.3.2 Modo Octal . . . . . 3.4 O comando umask . . . . . 3.5 Os comandos chown e chgrp 3.6 O comando newgrp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 27 27 29 29 31 31 33 33 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sumário 3.7 Atividades sugeridas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 4 Lista de exercı́cios - 1a. Lista 35 5 Editor VI 5.1 Movimentação do Cursor . . 5.2 Controle de tela . . . . . . . 5.3 Controle de palavras . . . . 5.4 Comandos de busca . . . . . 5.5 Comandos de cancelamento 5.6 Comandos de inserção . . . 5.7 Comandos de mudança . . . 5.8 Comandos gerais . . . . . . 5.9 Comandos no modo ex . . . 5.10 Comandos de configuração . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 38 39 39 39 39 40 40 40 40 41 6 Sistemas de Arquivos 6.1 Partições . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 Estratégias de Particionamento . . . . . . . . . . . . . . . . . . 6.3 Segurança de Arquivos e Sistemas de Arquivos . . . . . . . . . . 6.3.1 Permissões de Arquivos . . . . . . . . . . . . . . . . . . . 6.3.2 Integridade de Arquivos . . . . . . . . . . . . . . . . . . 6.3.3 Cavalos de Tróia . . . . . . . . . . . . . . . . . . . . . . 6.3.4 Sistemas de Arquivo Criptografados . . . . . . . . . . . . 6.4 Criando uma partição - Comando fdisk . . . . . . . . . . . . . . 6.5 Partição EXT2 (Linux Native) . . . . . . . . . . . . . . . . . . . 6.5.1 Criando um sistema de arquivos EXT2 em uma partição 6.5.2 Criando um sistema de arquivos EXT2 em um arquivo . 6.6 Journaling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.7 Partição EXT3 (Linux Native) . . . . . . . . . . . . . . . . . . . 6.7.1 Criando um sistema de arquivos EXT3 em uma partição 6.8 Nomeando uma partição de disco - comando e2label . . . . . . . 6.9 Detalhes de uma Partição - comando dumpe2fs . . . . . . . . . 6.10 Criando sistema de arquivos Swap em uma partição . . . . . . . 6.11 Pontos de Montagem . . . . . . . . . . . . . . . . . . . . . . . . 6.11.1 Identificação de discos e partições em sistemas Linux . . 6.12 Montando (acessando) uma partição de disco - Comando mount 6.13 Arquivo fstab . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.14 Desmontando uma partição de disco - Comando umount . . . . 6.15 Exercı́cios sugeridos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 42 42 44 44 45 46 46 47 49 50 50 51 51 52 52 53 53 54 54 55 56 57 57 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Gerência de Processos 58 7.1 Entradas e saı́das padrão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 3 Sumário 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 7.10 7.11 7.12 7.13 7.14 7.15 Redirecionamento para arquivos . . . . . . . . . . . . . . Redirecionamento usando pipes . . . . . . . . . . . . . . Prática Sugerida . . . . . . . . . . . . . . . . . . . . . . Filtros . . . . . . . . . . . . . . . . . . . . . . . . . . . . Prática sugerida . . . . . . . . . . . . . . . . . . . . . . . Programas e processos . . . . . . . . . . . . . . . . . . . Comandos ps e pstree . . . . . . . . . . . . . . . . . . . . Mudando prioridade processos - Comandos nice e renice . Execução de Comandos em Background e Foreground . . 7.10.1 Caractere & . . . . . . . . . . . . . . . . . . . . . 7.10.2 Comando jobs . . . . . . . . . . . . . . . . . . . . Suspendendo processos . . . . . . . . . . . . . . . . . . . 7.11.1 Comandos bg e fg . . . . . . . . . . . . . . . . . . Comando nohup . . . . . . . . . . . . . . . . . . . . . . . Comando kill . . . . . . . . . . . . . . . . . . . . . . . . Os comandos at e batch . . . . . . . . . . . . . . . . . . Agendando programas via crontab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 61 62 63 68 68 68 72 72 72 73 73 74 75 75 77 77 8 Lista de exercı́cios - 2a. Lista 79 9 Administração de Usuários 9.1 Verificando informações do usuário . . . . . . . . . . . 9.2 Tornando-se outro usuário - Comando su . . . . . . . . 9.3 O comando sudo . . . . . . . . . . . . . . . . . . . . . 9.4 Arquivo passwd e group . . . . . . . . . . . . . . . . . 9.5 Adicionando grupos - comando groupadd . . . . . . . . 9.6 Eliminando grupos - Comando groupdel . . . . . . . . 9.7 Adicionando usuários - Comando useradd . . . . . . . . 9.8 Alterando a senha do usuário - comando passwd . . . . 9.9 Eliminando usuários - Comando userdel . . . . . . . . . 9.10 Modificando o perfil de um usuário - comando usermod 9.11 Exemplo Script automático . . . . . . . . . . . . . . . 9.12 Atividades sugeridas . . . . . . . . . . . . . . . . . . . 9.13 Controle de quotas . . . . . . . . . . . . . . . . . . . . 9.13.1 Configuração de cotas para usuários . . . . . . . 9.14 Configuração do BASH-shell . . . . . . . . . . . . . . . 81 81 81 82 83 84 85 86 88 88 89 90 91 91 91 93 10 Lista de exercı́cios - 3a. Lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 11 Programação Shell 95 11.1 Variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 11.2 Estrutura geral de um script em BASH-Shell . . . . . . . . . . . . . . . . . . . . 97 11.3 Parâmetros de entrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 4 Sumário 11.4 Controle de fluxo . . . . . . . . . . . . . . 11.4.1 Outros Exemplos . . . . . . . . . . 11.5 Operadores lógicos e aritméticos . . . . . . 11.6 Operadores de teste em arquivos e strings 11.7 Expansão de variáveis . . . . . . . . . . . 11.8 Mais exemplos de script . . . . . . . . . . 11.9 Atividades sugeridas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 102 103 104 107 107 111 12 Comandos Básicos 112 12.1 Comandos Iniciais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 12.2 Comandos de Administração de Sistemas e Redes . . . . . . . . . . . . . . . . . 119 5 Lista de Figuras 1.1 Interpretador de Comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.1 Exemplo de execução do comando man . . . . . . . . . . . . . . . . . . . . . . . 15 7.1 7.2 7.3 Saı́das do Sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Saı́das do Sistema ligadas ao terminal . . . . . . . . . . . . . . . . . . . . . . . . 59 Redirecionamento com pipes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 6 Lista de Tabelas 12.1 Comandos Básicos - Armazenamento . . . . . . . . . . . . . . . . . . . . . . . . 12.2 Comandos Básicos - Comparações . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3 Comandos Básicos - Comunicação . . . . . . . . . . . . . . . . . . . . . . . . . . 12.4 Comandos Básicos - Diversos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.5 Comandos Básicos - Gerenciamento de arquivos . . . . . . . . . . . . . . . . . . 12.6 Comandos Básicos - Impressão . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.7 Comandos Básicos - Manutenção de Programas . . . . . . . . . . . . . . . . . . 12.8 Comandos Básicos - Pesquisa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.9 Comandos Básicos - Processamento de Textos . . . . . . . . . . . . . . . . . . . 12.10Comandos Básicos - Programação . . . . . . . . . . . . . . . . . . . . . . . . . . 12.11Comandos Básicos - Programação Shell . . . . . . . . . . . . . . . . . . . . . . . 12.12Comandos Básicos - Status do Sistema . . . . . . . . . . . . . . . . . . . . . . . 12.13Comandos de Administração/Redes - Correio . . . . . . . . . . . . . . . . . . . 12.14Comandos de Administração/Redes - Daemons . . . . . . . . . . . . . . . . . . 12.15Comandos de Administração/Redes - Hardware . . . . . . . . . . . . . . . . . . 12.16Comandos de Administração/Redes - Informações de host . . . . . . . . . . . . 12.17Comandos de Administração/Redes - Instalação . . . . . . . . . . . . . . . . . . 12.18Comandos de Administração/Redes - Relógio . . . . . . . . . . . . . . . . . . . 12.19Comandos de Administração/Redes - Sistema de Arquivos . . . . . . . . . . . . 12.20Comandos de Administração/Redes - Gerenciamento de kernel . . . . . . . . . . 12.21Comandos de Administração/Redes - Interligação em rede . . . . . . . . . . . . 12.22Comandos de Administração/Redes - Impressão . . . . . . . . . . . . . . . . . . 12.23Comandos de Administração/Redes - Iniciando e parando o sistema . . . . . . . 12.24Comandos de Administração/Redes - Atividade do Sistema e Gerenciamento de processos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.25Comandos de Administração/Redes - Usuários . . . . . . . . . . . . . . . . . . . 12.26Comandos de Administração/Redes - Diversos . . . . . . . . . . . . . . . . . . . 12.27Comandos de Administração/Redes - TCP/IP . . . . . . . . . . . . . . . . . . . 12.28Comandos de Administração/Redes - TCP/IP . . . . . . . . . . . . . . . . . . . 7 112 112 113 113 114 115 115 116 116 117 117 118 119 120 121 121 121 122 123 124 124 125 125 125 126 127 127 128 1 Caracterı́sticas do Sistemas Unix/Linux O sistema operacionaisl Unix/Linux possui as seguintes caracerı́sticas: • Interativo - O usuário requisita os comandos e obtém os resultados de sua execução através do terminal. • Multitarefa - Um único usuário pode requisitar que sejam efetuados vários comandos ao mesmo tempo em seu terminal. É responsabilidade do sistema operacional controlar estas execuções paralelas. Quando um usuário executa mais de um comando ao mesmo tempo, geralmente é somente um que necessita a interação com o usuário. Os demais comandos executados são na sua maioria comandos que não exigem a atenção do usuário, sendo tarefas demoradas. Quando isto ocorre, dizemos que os programas que o usuário está executando sem a interação ficam em background. O programa que o usuário está executando e interagindo fica em foreground. • Multiusuário - O sistema operacional pode controlar o acesso ao sistema através de vários terminais, virtuais ou reais, cada um pertencendo a um usuário. O Unix/Linux aceita as requisições de comandos de cada um dos usuários e gera as filas de controle e prioridades para que haja uma distribuição correta dos recursos de hardware necessários a cada usuário. Devido a caracterı́stica de ser um sistema multiusuário, o sistema operacional implementa um sistema de segurança visando impedir o acesso aos arquivos e diretórios de um usuário por outro. No módulo sobre permissões veremos como se pode liberar ou restringir o acesso entre usuários. Alguns termos que serão muito utilizados nas explicações e textos devem ser conhecidos, pois toda a bibliografia e documentação se utilizam deles. Estes termos fazem parte do jargão do Unix e Linux, são eles: • Shell - É o termo para definir o interpretador de comandos. O shell nada mais é que um programa que recebe os comandos do usuário e ativa o sistema operacional. Ele faz o controle do terminal, tanto na entrada como na saı́da. Existem várias opções de shell para o usuário, cada um com determinadas caracterı́sticas e facilidades. Dentre os mais conhecidos podemos citar: bash, sh, rsh, csh e ksh. • Kernel - É como é chamado o núcleo do sistema Unix e Linux. Este núcleo faz o gerenciamento direto dos dispositivos de E/S (device drivers), gerenciamento de memória e controle do uso da CPU pelos vários processos do sistema. 8 CAPÍTULO 1. CARACTERÍSTICAS DO SISTEMAS UNIX/LINUX • Comando - Um comando Unix/Linux nada mais é que um arquivo (programa executável) guardado em um diretório especı́fico do sistema. Portanto quando o usuário executa um comando, ele simplesmente está rodando um programa como qualquer outro do sistema. • Processo - É um conceito básico do sistema. Toda vez que se executa um programa/comando é gerado um processo no sistema. Todo gerenciamento é feito sobre este processo. Os processos são, portanto, comandos/programas em execução. Todo processo é identificado por um número chamado process id (PID). Este ID é único no sistema durante a execução do processo, portanto pode e deve ser usado para identificação do processo em caso de necessidade. 1.1 Usuários Dentro do sistema existem dois tipos de usuários: normal e super-usuário. O usuário comum é aquele que tem acesso limitado somente a seus dados e arquivos. Se tentar acessar dados de outro usuário, o sistema, dependendo das permissões configuradas, não deixará, emitindo uma mensagem de erro. O super-usuário ou conta root é uma conta com poderes supremos sobre toda a máquina. Com ela pode-se acessar qualquer arquivo que se encontra na máquina, removê-lo, mudá-lo de lugar, etc. O esquema de permissão e segurança do Unix/Linux não se aplica ao super-usuário. Existem também certos comandos que só podem ser executados quando o usuário tem permissão de super-usuário. Estes comandos geralmente servem para a manutenção do sistema e não devem ser deixados à disposição de usuários comuns devido à complexidade e perigo do mal uso destes comandos. 1.2 Comandos Formato geral de um comando: comando [opções] [argumentos] • Comando - Comando ou programa a ser executado. • Opções - Modificadores do comando (opcional). • Argumentos - Define o objeto a ser afetado pelo comando (opcional). A maioria dos comandos Unix/Linux possuem a sintaxe compatı́vel ao formato acima. Temos o nome do comando, seguido de opções e argumentos. As opções, quando colocadas, devem sempre preceder os argumentos. Observar que os caracteres separadores dos campos da linha de comando são o espaço em branco e o <TAB>. Um outro detalhe, muito importante, é o fato de que o Unix/Linux 9 CAPÍTULO 1. CARACTERÍSTICAS DO SISTEMAS UNIX/LINUX faz distinção entre os caracteres maiúsculos e minúsculos. Portanto, para o Unix/Linux, Ls é diferente de ls. Quase sempre as opções dos comandos são precedidas pelo caractere “-” (menos) ou “+” (mais) e podem entrar em qualquer ordem e posição na linha de comando, mas sempre antes dos argumentos (há poucas exceções). Na maioria das vezes as opções são representadas por letras, podendo-se agrupar uma série de letras em uma única opção. Por exemplo, as opções “-w -l -c” do comando wc podem ser escritas como “-wlc”. Existem também opções que são mutuamente exclusivas, não podendo aparecer ao mesmo tempo em um comando. O terceiro tipo de opção que pode existir em um comando, é a opção que exige logo após, um argumento especı́fico. Neste caso, quase sempre esta opção é colocada separada, precedida por “-” ou “+” e seguida de seu argumento Caso ela seja colocada juntamente com as demais opções, ela deve ser a última da lista. Um detalhe que gera muita confusão para o iniciante do sistema Unix/Linux é o fato de que as opções variam de comando para comando, tornando-se difı́cil uma memorização das mesmas. Se isto acontecer com você, não se preocupe, pois poucas pessoas sabem todas as opções de todos os comandos. Os argumentos definem os objetos sobre os quais o comando será aplicado. Temos como exemplos de argumentos: arquivos, periféricos, etc. 1.3 Principais diretórios Os diretórios de um sistema de arquivos têm uma estrutura pré-definida, com poucas variações. A seguir ilustramos os principais: • /home: raiz dos diretórios home dos usuários. • /boot: arquivos de boot (kernel do sistema, etc) • /var: arquivos variáveis, áreas de spool (impressão, e-mail, news), arquivos de log • /etc: arquivos de configuração dos serviços • /usr: aplicações voltadas aos usuários • /tmp: arquivos temporários • /mnt: montagem de diretórios compartilhados temporários • /bin: aplicações de base para o sistema • /dev: arquivos de acesso aos dispositivos fı́sicos e conexões de rede • /lib: bibliotecas básicas do sistema 10 CAPÍTULO 1. CARACTERÍSTICAS DO SISTEMAS UNIX/LINUX 1.4 O diretório HOME Cada usuário possui um diretório especial, chamado “diretório home” (casa), onde são armazenados: • arquivos e diretórios pessoais de trabalho • e-mails já lidos (folders pessoais) • arquivos de configuração individuais • configuração das aplicações usadas O diretório home do usuário é o seu local de inı́cio de sessão de trabalho (via shell ou gráfica). O usuário possui plenos poderes de acesso ao seu diretório home (e seus sub-diretórios), e normalmente não pode criar arquivos fora dele. O diretório home de cada usuário é normalmente inacessı́vel aos outros usuários, mas isso pode ser controlado pelo administrador do sistema (root). 1.5 Interpretador de Comandos Também conhecido como shell. É o programa responsável em interpretar as instruções enviadas pelo usuário e seus programas ao sistema operacional (o kernel). Ele que executa comandos lidos do dispositivo de entrada padrão (teclado) ou de um arquivo executável. É a principal ligação entre o usuário, os programas e o kernel. O Unix/Linux possui diversos tipos de interpretadores de comandos, entre eles podemos destacar o bash, ash, csh, tcsh, sh, etc. Entre eles o mais usado é o bash (no Linux). O interpretador de comandos do DOS, por exemplo, é o command.com. Os comandos podem ser enviados de duas maneiras para o interpretador: interativa e nãointerativa: • Interativa - Os comandos são digitados no aviso de comando e passados ao interpretador de comandos um a um. Neste modo, o computador depende do usuário para executar uma tarefa, ou próximo comando. • Não-interativa - São usados arquivos de comandos criados pelo usuário (scripts) para o computador executar os comandos na ordem encontrada no arquivo. Neste modo, o computador executa os comandos do arquivo um por um e dependendo do término do comando, o script pode checar qual será o próximo comando que será executado e dar continuidade ao processamento. Este sistema é útil quando temos que digitar por várias vezes seguidas um mesmo comando ou para compilar algum programa complexo. O shell bash possui ainda outra caracterı́stica interessante: A complementação dos nomes. Isto é feito pressionando-se a tecla <TAB>. Por exemplo, se digitar “ls tes” e pressionar <TAB>, o bash localizará todos os arquivos que iniciam com “tes” e completará o restante do 11 CAPÍTULO 1. CARACTERÍSTICAS DO SISTEMAS UNIX/LINUX Figura 1.1: Interpretador de Comandos nome. Caso a complementação de nomes encontre mais do que uma expressão que satisfaça a pesquisa, ou nenhuma, é emitido um beep. A complementação de nomes funciona sem problemas para comandos internos. Exemplos: • ech (pressione <TAB>) • ls /vm(pressione <TAB>) 12 2 Comandos Básicos 2.1 Iniciando uma sessão O acesso ao sistema é feito através de uma conta previamente cadastrada no sistema pelo administrador do sistema. Sem esta conta não é possı́vel o acesso ao sistema. Esta conta é chamada user name ou login name. O nome da conta deve ser uma string de até 8 caracteres e deve ser único em cada máquina. Junto com a conta, é atribuı́da uma senha de acesso. Esta senha é que garante que não se faça nenhum acesso indevido aos dados de determinado usuário. A manutenção desta senha e de sua validade é de responsabilidade única do usuário. Uma vez acertadas a conta e a senha, o sistema apresentará um prompt indicando que ele está apto a receber comandos do usuário. Neste ponto dizemos que estamos com uma sessão aberta. 2.2 Comando exit O comando exit deve ser utilizado para encerrar uma sessão de trabalho, quando utilizado o modo texto, terminando a conexão com o usuário. O sistema volta a pedir uma nova conta. Quando se está utilizando terminal no modo gráfico, o comando exit fecha o terminal mas não finaliza a conexão. Entenda por ambiente gráfico os gerenciadores de tela disponı́veis nos sistemas Unix/Linux, tais como: Gnome, KDE, XFCE entre outros. Um fato importante a relatar é que a sessão (dependendo do shell) pode terminar se for digitado um <CTRL> D, pois este caractere significa fim de arquivo ou fim da entrada de dados. 2.2.1 Atividades sugeridas 1. Verifique se o login ao sistema está correto. 13 CAPÍTULO 2. COMANDOS BÁSICOS 2.3 Obtendo HELP no Sistema - Páginas de Manual As páginas de manual acompanham todos os sistemas Unix/Linux. Elas trazem uma descrição básica do comando/programa e detalhes sobre o funcionamento de opção. Uma página de manual é visualizada na forma de texto único com rolagem vertical. Também documenta parâmetros usados em alguns arquivos de configuração. A utilização da página de manual é simples, digite: man [opç~ oes] [seç~ ao] [tı́tulo] Onde seção indica ao comando qual a seção do manual que será aberta, se omitido, mostra a primeira seção sobre o comando encontrada (em ordem crescente) e tı́tulo é o nome do comando ou arquivo que se está buscando. Cada seção da página de manual contém explicações sobre uma determinada parte do sistema. As seções são organizadas em diretórios separados e localizadas no diretório /usr/man. Os programas e arquivos são classificados nas seguintes seções: 1. Programas executáveis ou comandos internos (comandos do shell); 2. Chamadas do sistema (funções oferecidas pelo kernel); 3. Chamadas de Bibliotecas (funções dentro de bibliotecas do sistema); 4. Arquivos especiais (normalmente encontrados no diretório /dev); 5. Formatos de arquivos e convenções (/etc/inittab, por exemplo).; 6. Jogos; 7. Pacotes de macros e convenções (por exemplo, man); 8. Comandos de Administração do sistema (normalmente usados pelo root); 9. Rotinas do kernel (não padrões). Na figura 2.1 é visto a execução do comando man ls. Um detalhe deve ser observado, a página de manual é divido em algumas partes comuns: • NAME - Nome do comando com breve descrição. • SYNOPSIS - Sintaxe do comando com opções e argumentos. • DESCRIPTION - Descrição detalhada do comando. • SEE ALSO - Na grande maioria dos casos um comando está ligado a execução de diversos outros comandos. Nesta parte do manual são colocados todos os comandos citados no texto acima ou que têm alguma relação com o comando. O manual é composto de outras partes menos importantes. Outro detalhe, o número da seção sempre aparece entre parêntese “( )” logo após o nome do comando. No nosso exemplo, aparece LS(1). 14 CAPÍTULO 2. COMANDOS BÁSICOS Figura 2.1: Exemplo de execução do comando man A documentação de um programa também pode ser encontrada em 2 ou mais categorias, como é o caso do comando printf que é documentado na seção 1 (comando do shell ) e 3 (função de biblioteca). Por este motivo é necessário digitar man 3 printf para ler a página sobre o formato do arquivo, porque o comando man procura a página de manual nas seções em ordem crescente e a digitação do comando man printf abriria a seção 1. A opção -k faz com que o comando man apresente diversas opções de busca em função da palavra informada. Por exemplo, o comando man -k bash produz o seguinte resultado: bash (1) bash-builtins (7) bashbug (1) builtins (7) rbash (1) - GNU Bourne-Again SHell bash built-in commands, see bash(1) report a bug in bash bash built-in commands, see bash(1) restricted bash, see bash(1) 2.3.1 Atividades sugeridas 1. Qual a função do comando wc ? Quais são suas opções e o que representa cada uma delas ? Quais argumentos este comando aceita ? 2. Qual a função da opção -u do comando date ? 15 CAPÍTULO 2. COMANDOS BÁSICOS 3. Quais são as informações constantes do arquivo passwd ? 4. Qual é o comando correlato ao comando mesg ? 2.4 Comando passwd Para se efetuar a troca de senha, inicialmente o comando pede, por medida de segurança, que seja digitada a senha atual da conta. Em seguida pede que seja digitada a nova senha. Por último, pede que seja digitada novamente a nova senha para verificação. Em todas estas etapas as senhas digitadas não são apresentadas na tela por medida de segurança. A senha só será trocada se a senha atual conferir com a cadastrada no sistema e a senha nova for digitada igual na confirmação. Algumas regras para criação de senhas: • A senha deve ter no mı́nimo 6 caracteres. • A senha deve ter no mı́nimo duas letras maiúsculas e/ou duas letras minúsculas e pelo menos um dı́gito ou caractere especial. • São aceitos somente os caracteres ASCII padrão de códigos 0 a 127. • A senha deve diferenciar do nome da conta. • A nova senha deve diferenciar da senha velha em pelo menos três caracteres. 2.4.1 Atividades sugeridas 1. Altere a sua senha para “cha”. O que aconteceu? 2. Altere a sua senha para “abacaxi”. O que aconteceu? 3. Altere a sua senha para “abacaxi#”. Tente alterar a senha para “abacate#”. O que aconteceu? 4. Deixe sua senha alterada para uma outra senha que atenda aos requisitos de segurança vistos. 2.5 Comando expr O uso comum do expr no terminal é para fazer-se cálculos simples de adição, subtração, divisão inteira e multiplicação. Ele apresenta a restrição de que se deve sempre colocar uma barra invertida antes de algumas operações ou parênteses (exceto + e -) para que o shell não interprete estes caracteres. Exemplo: expr 14 + \( 10 \* 4 \) irá produzir o resultado 54. 16 CAPÍTULO 2. COMANDOS BÁSICOS 2.5.1 Atividades sugeridas 1. Qual é o resultado de ( 30 - 5 ) * 789 ? 2. Qual é o resultado de ( 20 / 4 ) * 15 + 4 ? 2.6 Caminho de arquivos Sempre que precisamos localizar um arquivo para qualquer operação (ler, gravar, remover, criar, etc.) o sistema operacional deve conhecer em que ponto do sistema de arquivos ele se encontra. Isto é feito através da especificação de um caminho antes do nome do arquivo. Este caminho, chamado de path, pode ser indicado de duas maneiras: • Absoluto - O caminho absoluto sempre começa com uma barra (“/”). Este caminho dá a localização do arquivo desde o diretório raiz do sistema. O sistema operacional, começa pela raiz e vai seguindo os diretórios indicados até o último. • Relativo - A procura de um arquivo através de um caminho relativo começa no próprio diretório atual da sessão. 2.7 Comandos básicos Os comandos a seguir implementam operações básicas em arquivos: • ls: listar o conteúdo do diretório corrente (ou de um diretório dado). marcos@laureano:~$ ls -l total 96 drwxr-xr-x 2 root root drwxr-xr-x 3 root root lrwxrwxrwx 1 root root drwxr-xr-x 12 root root drwxr-xr-x 121 root root drwxr-xr-x 3 root root drwxr-xr-x 2 root root lrwxrwxrwx 1 root root drwxr-xr-x 16 root root drwxr-xr-x 4 root root lrwxrwxrwx 1 root root drwx-----2 root root drwxr-xr-x 5 root root drwxr-xr-x 2 root root drwxr-xr-x 2 root root / 4096 4096 11 14080 12288 4096 4096 33 12288 4096 4 16384 4096 4096 4096 2008-02-28 2008-02-28 2008-02-27 2008-03-22 2008-03-23 2008-02-27 2007-10-15 2008-02-27 2008-02-28 2008-02-28 2008-02-27 2008-02-27 2008-03-22 2007-10-08 2007-10-15 17 09:52 22:28 15:18 22:13 00:06 15:26 21:16 15:50 22:00 22:00 15:18 15:17 22:13 07:39 21:16 bin boot cdrom -> media/cdrom dev etc home initrd initrd.img -> boot/initrd.img-2.6.2 lib lib32 lib64 -> /lib lost+found media mnt opt CAPÍTULO 2. COMANDOS BÁSICOS dr-xr-xr-x 143 root root drwxr-xr-x 11 root root drwxr-xr-x 2 root root drwxr-xr-x 2 root root drwxr-xr-x 12 root root drwxrwxrwt 13 root root drwxr-xr-x 12 root root drwxr-xr-x 16 root root lrwxrwxrwx 1 root root 0 4096 4096 4096 0 4096 4096 4096 30 2008-03-22 2008-03-03 2008-03-03 2007-10-15 2008-03-22 2008-03-23 2008-02-28 2008-02-29 2008-02-27 17:28 14:33 14:36 21:16 17:28 00:10 11:46 17:03 15:50 proc root sbin srv sys tmp usr var vmlinuz -> boot/vmlinuz-2.6.22-14-g • rm: O comando rm serve para eliminar um arquivo do sistema de arquivos. Ele só fará a remoção de diretórios se for especificada a opção -r. Com esta opção todo o diretório é excluı́do, inclusive todos os seus subdiretórios, indiferente se o mesmo possui ou não arquivos. • mv: O comando mv permite a movimentação de um arquivo ou diretório de um local no sistema para outro. Possui três formas básicas: A primeira forma permite que se mude o nome do arquivo origem para o nome do arquivo destino (mesmo diretório); A segunda forma do comando faz a movimentação de todos os arquivos especificados para o diretório informado como destino e a terceira forma é similar a primeira, mas em vez de arquivo é utilizado diretórios. • cp: O comando cp permite a cópia de arquivos e diretórios. Existem três formas básicas do comando: cópia de arquivos para arquivos, cópia de arquivos para diretórios e cópia de diretórios. • cat: apresentar o conteúdo de arquivos. • more: visualizar o conteúdo de arquivos (paginado). • ln: O comando ln faz uma ligação (link ) de um arquivo existente com um novo nome. Podemos assumir que com este comando são criados dois nomes para se referenciar ao mesmo conjunto de dados. O mais correto é trabalhar com links simbólicos , através do comando ln -s. A funcionalidade principal do link, ou seja, de se ter mais de um nome para o mesmo conjunto de dados continua a mesma, sendo que o link simbólico difere somente na implementação interna. Em vez de as duas entradas no diretório possuı́rem o mesmo inode, no link simbólico um arquivo aponta para o outro e este aponta para os dados. Esta implementação permite que se faça links simbólicos para arquivos que residem em sistema de arquivos diferentes (discos diferentes). • head: O comando head mostra na tela as primeiras linhas ou caracteres dos arquivos especificados como argumento. marcos@laureano:~$ head /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh 18 CAPÍTULO 2. COMANDOS BÁSICOS sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh • tail: Este comando mostra a última parte de um arquivo, contado em blocos, caracteres ou linha. Quando não se coloque nenhuma opção, o comando assumirá que se está se pedindo em linhas. marcos@laureano:~$ tail /etc/passwd dhcp:x:100:101::/nonexistent:/bin/false syslog:x:101:102::/home/syslog:/bin/false klog:x:102:103::/home/klog:/bin/false messagebus:x:103:109::/var/run/dbus:/bin/false hplip:x:104:7:HPLIP system user,,,:/var/run/hplip:/bin/false avahi-autoipd:x:105:113:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false avahi:x:106:114:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false haldaemon:x:107:116:Hardware abstraction layer,,,:/home/haldaemon:/bin/false gdm:x:108:118:Gnome Display Manager:/var/lib/gdm:/bin/false marcos:x:1000:1000:Marcos Laureano,,,:/home/marcos:/bin/bash • wc: O comando wc faz a contagem das linhas, palavras e caracteres de todos os arquivos fornecidos como parâmetros. marcos@laureano:~$ wc /etc/passwd 28 44 1294 /etc/passwd Os comandos usados para navegação na árvore de diretórios são similares aos usados em outros sistemas operacionais: • pwd : indica qual o diretório corrente do shell. • cd : troca de diretório: • cd dir : muda para o diretório dir. • cd .. : muda para o diretório pai imediatamente superior. • cd -: volta para o último diretório visitado. • cd : volta ao diretório HOME. • mkdir dir: criação do diretório dir. • rmdir dir: remoção do diretório dir. 19 CAPÍTULO 2. COMANDOS BÁSICOS 2.8 Diretórios Especiais “.” e “..” Toda vez que um diretório é criado, sempre são criadas duas entradas no mesmo. Uma entrada, com o nome de “.” , referencia-se ao próprio diretório criado. A outra entrada, com o nome de “..”, é uma referência ao diretório anterior, ou diretório pai, na estrutura do sistema de arquivos. Estes dois arquivos podem ser usados para compor qualquer caminho, relativo ou absoluto, dentro dos comandos do Unix/Linux, e visam a facilitar a digitação de comandos. Normalmente eles não aparecem na relação de arquivos pois o sistema esconde todos os arquivos que começam com um ponto em seu nome. Para que se liste estas duas entradas devemos usar a opção “-a” do comando ls. 2.8.1 Atividades sugeridas 1. Se posicione no diretório /tmp. 2. O que acontecerá se for digitado neste diretório o comando ls -l .. ? Explique. 3. Quais as 2 possı́veis formas de se posicionar no diretório /etc a partir do diretório /tmp ? 2.9 Atributos de Arquivos Qualquer arquivo no sistema operacional nada mais é do que uma seqüência de bytes, armazenados em um dispositivo de acesso direto (disco), que possui certos atributos. Estes atributos são manipulados pelo sistema operacional sempre que for realizado um acesso sobre o arquivo. Os atributos são: • Tipo - Indica se um arquivo armazenado no sistema de arquivos é um arquivo propriamente dito ou um diretório. Também é utilizado para diferenciar outros tipos de arquivos dentro do sistema de arquivos. Estes tipos podem ser: – – – – d: Um diretório -: Arquivo normal de dados l: Arquivo ligado simbolicamente (simbolic link) c: Arquivo especial de controle de dispositivos orientados a caractere (device file). No sistema estes arquivos ficam debaixo do diretório /dev. – b: Arquivo especial de controle de dispositivos orientados a bloco – p: Arquivo pipe com nome • Permissões - O atributo permissão, também conhecido como mode, ou modo de arquivo, indica qual o tipo de acesso que um usuário pode fazer sobre o arquivo. 20 CAPÍTULO 2. COMANDOS BÁSICOS • Links - Indica de quantas maneiras (nomes) este arquivo está sendo referenciado. • Dono (owner) - Neste campo é colocada a identificação do usuário (user ID) a que pertence o arquivo. • Grupo (group) - Neste campo é colocada a identificação do grupo (group ID) a que pertence o arquivo. Este campo e o anterior, junto com as permissões é que vão liberar ou impedir o acesso do arquivo por outra pessoa que não seja o dono. • Tamanho - Tamanho do arquivo. • Nome - Nome do arquivo. Quando se usa o sistema de arquivos longo, o nome de um arquivo pode ter até um máximo de 255 caracteres quaisquer. 2.9.1 Atividades sugeridas 1. Utilizando o comando ls -la verifique os atributos dos arquivos de seu diretório home. 2. Quais arquivos são diretórios? 2.10 Comandos avançados Os comandos abaixo são muito úteis na manipulação de arquivos: • grep: permite procurar strings dentro de arquivos de texto. Exemplos: – Procurar todas as linhas contendo ’tcsh’ em /etc/passwd: grep tcsh /etc/passwd – Procurar todas as linhas que não contenham tcsh em /etc/passwd: grep -v tcsh /etc/passwd • find: permite encontrar arquivos que satisfaçam certas caracterı́sticas. É possı́vel fazer-se conjunções com os comandos de seleção através dos argumentos -a para conjunção “e” e -o para a conjunção “ou”. Pode-se também agrupar mais de um critério através da colocação de parênteses. Os parênteses devem ser precedidos por uma barra invertida e devem ser colocados precedidos e sucedidos por um ou mais caracteres em branco. Vejamos alguns exemplos de procura: – Procurar todas as entradas *txt dentro do diretório /usr: find /usr -name ’*txt’ -print – Procurar todas as entradas *ab* ou *cd* (maı́usculas ou minúsculas) presentes em /opt:find /opt -iname ’*ab*’ -or -iname ’*cd*’ – Procurar todas as entradas acessadas a mais de 3 dias em /etc: find /etc -atime +3 – Procurar todas as entradas modificadas a menos de 2 dias em /etc que tenham mais de 5 Kbytes de tamanho:find /etc -mtime -2 -and -size +5k 21 CAPÍTULO 2. COMANDOS BÁSICOS – Procurar todos os diretórios dentro de /opt cujo grupo tenha acesso em escrita:find /opt -type d -perm +g+w • touch: atualizar a data de um arquivo • diff : comparar dois arquivos, mostrando as diferenças entre eles. Para maiores informações sobre as opções disponı́veis para esses comandos, consulte as páginas de manual do sistema. 2.11 Informações em arquivos Vários comandos permitem obter maiores informações sobre arquivos e sistemas de arquivos. Eis os principais: • stat: detalhes sobre um arquivo ou diretório (i-nodes). marcos@laureano:~$ stat /bin/ls File: ‘/bin/ls’ Size: 89824 Blocks: 184 IO Block: 4096 Device: 804h/2052d Inode: 4725785 Links: 1 Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( Access: 2008-03-22 23:42:12.000000000 -0300 Modify: 2007-09-28 19:06:14.000000000 -0300 Change: 2008-02-27 15:18:18.000000000 -0300 arquivo comum 0/ root) • file : identificar o conteúdo de um arquivo, analisando-o. marcos@laureano:~$ file /etc/* /etc/acpi: directory /etc/adduser.conf: ASCII English text /etc/adjtime: ASCII text /etc/aliases: ASCII text /etc/alternatives: directory /etc/anacrontab: ASCII text /etc/apm: directory /etc/apparmor: directory /etc/apparmor.d: directory /etc/apport: directory /etc/apt: directory /etc/at.deny: writable, regular file, no read permission /etc/avahi: directory /etc/bash.bashrc: ASCII English text /etc/bash_completion: ASCII Pascal program text /etc/bash_completion.d: directory 22 CAPÍTULO 2. COMANDOS BÁSICOS /etc/belocs: /etc/bindresvport.blacklist: (continua...) directory ASCII English text • whereis : indica onde estão os binários, fontes e páginas de manual de um comando dado. marcos@laureano:~$ whereis ls ls: /bin/ls /usr/share/man/man1/ls.1.gz • which : indica o caminho completo para o comando dado. marcos@laureano:~$ which vim /usr/bin/vim • du : indica o espaço usado em disco pelos arquivos ou diretórios dados. marcos@laureano:/home$ du -h /root 8,0K /root/.wireshark 8,0K /root/.config/gtk-2.0 12K /root/.config 196K /root/.synaptic/log 204K /root/.synaptic 4,0K /root/.mozilla 4,0K /root/.gconf 4,0K /root/.gconfd 4,0K /root/.gnome2_private 4,0K /root/.gnome2/accels 4,0K /root/.gnome2/network-admin-locations 20K /root/.gnome2 4,0K /root/.wapi 288K /root • df : informações sobre os sistemas de arquivos disponı́veis na máquina e sua ocupação. marcos@laureano:/home$ df -h Sist. Arq. Tam Usad Disp Uso% Montado em /dev/sda4 38G 5,2G 31G 15% / varrun 2,0G 88K 2,0G 1% /var/run varlock 2,0G 4,0K 2,0G 1% /var/lock udev 2,0G 96K 2,0G 1% /dev devshm 2,0G 0 2,0G 0% /dev/shm lrm 2,0G 38M 1,9G 2% /lib/modules/2.6.22-14-generic/volatile /dev/sda1 41G 6,3G 34G 16% /media/sda1 /dev/sda2 71G 32G 39G 46% /media/sda2 • tree : apresenta na tela uma estrutura de diretórios, com ou sem os arquivos. 23 CAPÍTULO 2. COMANDOS BÁSICOS marcos@laureano:/$ tree -d -L 1 /etc /etc |-- NetworkManager |-- X11 |-- acpi |-- alternatives |-- apm |-- apparmor |-- apparmor.d |-- apport |-- apt |-- avahi |-- bash_completion.d |-- belocs |-- bluetooth |-- bonobo-activation |-- brltty |-- calendar |-- chatscripts |-- compizconfig |-- console-setup |-- console-tools |-- cron.d |-- cron.daily |-- cron.hourly |-- cron.monthly |-- cron.weekly |-- cups |-- dbus-1 |-- default |-- defoma |-- devfs |-- dhcp3 |-- dictionaries-common |-- discover.d |-- dpkg |-- emacs |-- esound |-- event.d |-- firefox |-- fonts |-- foomatic 24 CAPÍTULO 2. COMANDOS BÁSICOS |-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-- gamin gconf gdm gimp gnome gnome-app-install gnome-system-tools gnome-vfs-2.0 groff grub.d gtk-2.0 hal hotplug hp init.d initramfs-tools iproute2 java jvm.d laptop-mode ld.so.conf.d ldap libgda-3.0 libpaper.d logcheck logrotate.d lsb-base menu menu-methods modprobe.d modutils mono mysql ndiswrapper network openoffice opt pam.d pango pcmcia perl power 25 CAPÍTULO 2. COMANDOS BÁSICOS |-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-‘-- ppp pulse purple python python2.5 rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rcS.d readahead resolvconf samba sane.d scim security sgml skel smartmontools sound ssh ssl terminfo tex4ht texmf tidy udev update-notifier vim w3m wpa_supplicant xdg xml 118 directories 26 3 Permissões em arquivos 3.1 Definições básicas O Unix/Linux possui um sistema de controle de acesso ao sistema de arquivos seguindo o paradigma de Listas de Controle de Acesso (ACL - Access Control Lists). A cada arquivo ou diretório são associados: • Um usuário proprietário (owner ). Normalmente é quem criou o arquivo. • Um grupo proprietário. Normalmente é o grupo primário de quem criou o arquivo, mas este pode mudá-lo para outro grupo do qual ele também faça parte. • Permissões de acesso definidas para o usuário, o grupo e outros usuários (terceiros). As permissões definidas para os arquivos são: • Leitura: permitindo acesso ao conteúdo do arquivo. • Escrita: permitindo modificar o conteúdo do arquivo. • Execução: permitindo executar o arquivo (caso seja um executável ou script). As permissões definidas para os diretórios são similares: • Leitura: permitindo acesso ao conteúdo do diretório (listar os arquivos presentes). • Escrita: permitindo modificar o conteúdo do diretório (criar ou apagar arquivos). • Execução: permitindo entrar no diretório, ou atravessá-lo. Pode-se afirmar que um arquivo é protegido contra leituras ou modificações por suas próprias permissões, e contra apagamentos ou renomeações pelas permissões do diretório onde ele se encontra. 3.2 Consultando permissões As permissões de acesso a arquivos e diretórios podem ser consultadas através de uma listagem de diretório longa, usando o comando ls -l. Uma listagem tı́pica deste comando seria: 27 CAPÍTULO 3. PERMISSÕES EM ARQUIVOS marcos@laureano:/etc/apt$ ls -l total 32 drwxr-xr-x 2 root root 4096 2008-02-27 -rw------- 1 root root 0 2007-10-15 -rw-r--r-- 1 root root 1323 2008-03-27 drwxr-xr-x 2 root root 4096 2007-10-15 -rw-r--r-- 1 root root 4203 2008-02-27 -rw------- 1 root root 1200 2007-10-15 -rw-r--r-- 1 root root 2393 2007-10-15 -rw-r--r-- 1 root root 2381 2007-10-15 15:50 21:18 10:36 18:44 15:49 21:18 21:19 21:18 apt.conf.d secring.gpg sources.list sources.list.d sources.list.old trustdb.gpg trusted.gpg trusted.gpg~ Vamos analisar melhor os caracteres das colunas iniciais da listagem de diretório apresentada acima. As entradas de diretório em um sistema UNIX têm seu tipo indicado pelo primeiro caractere da listagem de diretório longa. Os tipos de entradas mais freqüentes são: • -: arquivo normal • d: diretório • l: link simbólico (atalho) • b: dispositivo (mapeado em /dev) orientado a blocos (como os discos rı́gidos) • c: dispositivo (mapeado em /dev) orientado a caracteres (como modens e portas seriais) • s: socket mapeado em arquivo (para comunicação entre processos) • p: FIFO ou Named Pipe (outro meio de comunicação entre processos) Os demais caracteres representam os direitos de acesso do usuário (user ), do grupo (group) e de terceiros (others), em grupos de três caracteres: • r: permissão de leitura (read ). • w: permissão de escrita (write). • x: permissão de execução (eXecute). • -: indica que o respectivo direito está negado. • S: bits SUID e SGID setados (veremos mais tarde). Vejamos um exemplo: -rw-r----- 1 laureano users 4956 mar 26 20:34 descricao.html A linha de listagem acima indica que: • A entrada corresponde a um arquivo normal (o primeiro caractere é “-”) • O proprietário do arquivo descricao.html é o usuário laureano. • O proprietário possui direito de leitura e escrita sobre o arquivo, mas não de execução. • O arquivo também está ligado ao grupo users. 28 CAPÍTULO 3. PERMISSÕES EM ARQUIVOS • O grupo possui apenas direito de leitura sobre o arquivo. • Outros usuários (terceiros) não possuem nenhum direito de acesso ao arquivo. 3.3 Comando chmod Este comando permite alterar as permissões dos arquivos e diretórios. Somente o proprietário de um arquivo pode alterar suas permissões, mesmo que o grupo ou outros possuam direitos de escrita sobre o arquivo. O comando chmod tem a seguinte sintaxe: chmod [opç~ oes] permiss~ oes arquivo(s) A definição das permissões pode ser feita de forma simbólica ou octal. A forma simbólica é a mais simples e por isso a mais usada por iniciantes. A forma octal é, no entanto, mais empregada, sobretudo em scripts antigos. 3.3.1 Modo Simbólico Neste texto vamos nos restringir à forma simbólica. As permissões na forma simbólica têm a seguinte sintaxe: [u g o a] [+ - =] [r w x u g o X] As letras do primeiro grupo indicam de quem as permissões devem ser alteradas: • u: o usuário, proprietário do arquivo. • g: o grupo proprietário do arquivo. • o: outros (terceiros) • a : todos (all ) Os sı́mbolos do segundo grupo indicam como os direitos devem ser alterados: • +: os direitos indicados devem ser adicionados • -: os direitos indicados devem ser suprimidos • =: os direitos devem ser ajustados ao valor indicado • r: permissão de leitura • w: permissão de escrita • x: permissão de execução (ou acesso ao diretório) • u: usar as permissões atribuı́das ao usuário proprietário • g: usar as permissões atribuı́das ao grupo proprietário • o: usar as permissões atribuı́das a outros 29 CAPÍTULO 3. PERMISSÕES EM ARQUIVOS Vejamos alguns exemplos: • chmod o-w *.c: retira de terceiros a permissão de escrita sobre todos os arquivos C no diretório corrente. marcos@laureano: ls -l -rw-rw-rw- 1 laureano -rwxrwxrwx 1 laureano prof prof 523 2321 Mar 27 Mar 25 08:51 main.c 09:37 funct.c 523 2321 Mar 27 Mar 25 08:51 main.c 09:37 funct.c marcos@laureano: chmod o-w *.c marcos@laureano: ls -l -rw-rw-r-- 1 laureano -rwxrwxr-x 1 laureano prof prof • chmod go-rwx ~/*: retira do grupo e de terceiros todas as permissões (leitura, escrita, execução) sobre todos os arquivos do diretório home. marcos@laureano: ls -l -rw-rw-rw- 1 laureano -rwxrwxrwx 1 laureano -rw-r--r-- 1 laureano prof 523 prof 2321 prof 75643 Mar 27 Mar 25 Mar 27 08:51 main.c 09:37 funct.c 08:56 main.o Mar 27 Mar 25 Mar 27 08:51 main.c 09:37 funct.c 08:56 main.o marcos@laureano: chmod go-rwx ~/* marcos@laureano: ls -l -rw------- 1 laureano -rwx------ 1 laureano -rw------- 1 laureano prof 523 prof 2321 prof 75643 • chmod u+w,go=r *.txt: dá ao usuário permissão de escrita e ajusta ao grupo e outros somente permissão de leitura sobre os arquivos *.txt do diretório corrente. Observe que as permissões podem ser agrupadas usando vı́rgulas: marcos@laureano: ls -l -r--rw-rw- 1 laureano -rwxrwxrw- 1 laureano prof 2386 prof 12875 Mar 27 Mar 25 08:51 readme.txt 09:37 instal.txt Mar 27 Mar 25 08:51 readme.txt 09:37 instal.txt marcos@laureano: chmod u+w,go=r *.txt marcos@laureano: ls -l -rw-r--r-- 1 laureano -rwxr--r-- 1 laureano prof 2386 prof 12875 O comando chmod possui uma opção interessante (-R), que permite atribuir permissões de maneira recursiva, ou seja, nos conteúdos dos sub-diretórios. Assim, a melhor maneira de 30 CAPÍTULO 3. PERMISSÕES EM ARQUIVOS proteger seu diretório home dos olhares indiscretos de membros do seu grupo e de terceiros é executar o seguinte comando: chmod -R go-rwx ~ 3.3.2 Modo Octal O uso do comando chmod em modo octal é similar ao modo simbólico, embora mais difı́cil. As expressões de permissão são substituı́das por valores octais representando as permissões desejadas. Assim, se desejarmos atribuir as permissões rwxr-x--- a um arquivo teste.c, devemos fazer: r w x 1 1 1 7 r - x 1 0 1 5 - - 0 0 0 0 chmod 750 teste.c express~ ao simbólica em valores binários em octal o comando a executar A definição binária leva aos seguintes valores: • r=4 • w=2 • x=1 Isto quer dizer o valor 7 (rwx) é obtido pela soma de r + w + 1 (4 + 2 + 1), o valor 5 (r-x) é obtido pela de r + x (4 + 1) e finalmente o valor 0 (—) indica que não houve nenhuma soma. A definição de permissões em modo octal é bem menos flexı́vel que a notação simbólica, mas ainda muito usada, por ser aceita em todos os sistemas Unix/Linux, mesmo os mais antigos. Além disso, sua compreensão é importante para o uso do comando umask. Observação: Cada número do conjunto octal, indica o perfil de um dos atributos (usuário, grupo ou terceiros) do arquivo está sendo modificado. O uso do formato octal é similar ao uso do formato simbólico ajustado. Exemplo: chmod 750 teste.c é idêntico à chmod u=rwx,g=rx,o= teste.c. 3.4 O comando umask O comando umask permite definir uma máscara padrão de permissões para a criação de novos arquivos e diretórios. A sintaxe desse comando usa a notação octal, para definir as permissões a suprimir nos novos arquivos e diretórios, a partir das permissões máximas. Vejamos um exemplo: 31 CAPÍTULO 3. PERMISSÕES EM ARQUIVOS r w x - - 0 0 0 0 r - x - w 0 1 0 2 - - - permiss~ oes r w x permiss~ oes 1 1 1 permiss~ oes 7 máscara em desejadas para os novos arquivos a suprimir a suprimir em binário octal Assim, o comando umask 027 permite definir a máscara desejada (rwxr-x---). Normalmente esse comando é usado nos arquivos de configuração do shell, e nos scripts de instalação de aplicações. Uma forma definir a máscara de criação de arquivos é seguir o seguinte racicı́onio: • Para que um arquivo fique com a permissão 750: 7 7 7 - 7 5 0 -------0 2 7 • Para que um arquivo fique com a permissão 640: 7 7 7 - 6 4 0 -------1 3 7 • Para que um arquivo fique com a permissão 666: 7 7 7 - 6 6 6 -------2 2 2 Ou seja, pega-se o valor que seria usado no comando chmod, subtrai-se o este valor de 777 e o resultado é utilizado no comando umask. Observações: • O valor do umask será utilizando somente na criação de novos arquivos. Arquivos já existentes não terão sua permissão modificada. • Por mais que defina no comando umask a permissão de execução, arquivos regulares jamais serão criados com esta permissão ativa. Esta permissão será habilitada somente para a criação de novos diretórios. Esta é uma medida de precaução do sistema operacional, pois senão, todos os novos arquivos criados seriam executáveis. 32 CAPÍTULO 3. PERMISSÕES EM ARQUIVOS 3.5 Os comandos chown e chgrp O comando chown permite a mudança do usuário proprietário de um arquivo. Somente o super-usuário pode fazê-lo. O comando chgrp permite a permite a mudança do grupo proprietário de um arquivo. Somente o super-usuário (root) e o usuário proprietário do arquivo podem fazê-lo. O proprietário só pode mudá-lo para um grupo ao qual ele também pertença. Exemplos: marcos@laureano: ls -l drw------- 2 laureano prof 0 Mar 27 08:51 dir1 marcos@laureano: chown joao dir1 (somente como root) marcos@laureano: ls -l drw------- 2 joao Mar 27 prof 0 marcos@laureano: chgrp labin dir1 marcos@laureano: ls -l drw------- 2 joao labin 0 08:51 dir1 (somente como root ou usuário joao) Mar 27 08:51 dir1 Estas restrições podem variar de sistema para sistema (configuração padrão do sistema). Por exemplo, o sistema HP-UX até a versão 10.2 permitia que arquivos fossem doados, por usuários comuns, para qualquer usuário e grupo. 3.6 O comando newgrp Permite ao usuário mudar seu grupo principal para outro grupo ao qual ele também pertença (somente para usuários que pertençam a mais de um grupo). Todos os arquivos e diretórios criados a partir dessa mudança pertencerão ao novo grupo, e não mais ao grupo primário do usuário. Por exemplo: marcos@laureano: mkdir dir1 marcos@laureano: ls -l drw------- 2 laureano prof 0 Mar 27 marcos@laureano: newgrp ladis marcos@laureano: mkdir dir2 33 08:51 dir1 CAPÍTULO 3. PERMISSÕES EM ARQUIVOS marcos@laureano: ls -l drw------- 2 laureano drw------- 2 laureano prof ladis 0 0 Mar 27 Mar 27 08:51 dir1 08:52 dir2 Para voltar ao grupo primário basta executar exit. Para saber a quais o grupo primário e secundário do usuário basta executar o comando id. 3.7 Atividades sugeridas 1. Você conseguiria mudar o nome de seu próprio diretório home ? Por que ? 2. Crie um arquivo teste com os direitos de acesso rw-rw-rw-, e indique como usar o comando chmod para alterar seus direitos de acesso para: • • • • rw-rw-r-r-xr-xr-x rw-r--r-r-------- 3. Execute o comando umask para que novos arquivos criados no sistema tenham as permissões de acesso definidas a seguir, e teste as máscaras definidas criando novos arquivos (comando touch) e diretórios (comando mkdir). Finalmente, explique por que razão as permissões dos arquivos não coincidem com as esperadas, mas as dos diretórios sim. • • • • rw-rw-r-r-xr-xr-x rw-r--r-r-------- 4. Crie dois diretórios d1 e d2, com permissões respectivas r--r--r-- e r-xr-xr-x, e compare as possibilidades de acesso em ambos. É possı́vel listar o conteúdo de ambos, estando fora deles ? É possı́vel entrar em ambos ? 34 4 Lista de exercı́cios - 1a. Lista A resolução dos exercı́cios faz parte da avaliação da disciplina. Para as respostas dos exercı́cios, basta colocar o comando utilizado. Antes de executar cada comando, você deverá anotar o resultado do comando pwd. Exemplo: Liste o conteúdo do diretório /etc. marcos@laureano:~$ pwd /home/marcos marcos@laureano:~$ ls /etc <resultado do comando ls> marcos@laureano:~$ cd /etc marcos@laureano:/etc$ pwd /etc marcos@laureano:/etc$ ls <resultado do comando ls> Como pode ser observado, existe várias respostas possı́veis para o mesmo exercı́cio. Somente é possı́vel determinar se o comando está correto, se soubermos em qual diretório você se encontra antes da execução de cada comando. 1. Crie os seguintes diretórios abaixo do seu diretório home. Utilize no máximo 3 comandos (veja a opção -p do comando mkdir. Digite o comando find . dentro do diretório provas para verificar se você criou corretamente a estrutura de diretórios. O comando tree também pode ser utilizado. provas |-- dira | |-- tst1 | ‘-- tst2 |-- dirb |-- dirc ‘-- find 35 CAPÍTULO 4. LISTA DE EXERCÍCIOS - 1A. LISTA 2. Copie o arquivo passwd que está abaixo do /etc para o diretório tst1. 3. Crie os arquivos A1, A2 e A3 embaixo dos diretórios dira, dirb e dirc respectivamente. Utilize o minı́mo de comandos possı́vel. 4. Deixe o arquivo A2 com a mesma data e hora do arquivo /etc/passwd (veja o comando touch). 5. Qual o comando para trazer as respostas para o seguintes problemas matemáticos e relacionais ? Anote as respostas também. • • • • • (5 * 10) + 10 * 7 5>6 5<6 5=5 10 + 20 + ( 30 * 5 ) - 50 6. Apague o diretório dirb. 7. Como faço para verificar a taxa de ocupação do sistema de arquivos onde se encontra o arquivo A3. 8. Crie os arquivos B1, B2, B3, B4, e B5 embaixo do diretório provas. 9. Renomeie o arquivo B1 para C1 e B3 para C3. 10. Copie todo o diretório dira (inclusive os arquivos embaixo dele) para debaixo do diretório provas com o nome de direxrc. 11. Mova o diretório ts1 que está dentro do diretório direxrc para o diretório provas. 12. Quanto espaço o seu diretório home está ocupando até o momento ? 13. Imprima a primeiras 15 linhas do arquivo passwd (veja o comando head. 14. Imprima as últimas 5 linhas do arquivo passwd (veja o comando tail. 15. Quantos caracteres tem o arquivo passwd. 16. Com um único comando, copie todos os arquivos que tenham 1 no fim do nome e que estejam embaixo do diretório home para o diretório find. 17. Mude a permissão do arquivo A3 para todos no sistema conseguirem ler. É possı́vel ? Explique. 18. Anote a permissão atual antes de executar o comando. Mude a permissão do arquivo C3 para todos no sistema conseguirem ler e gravar no arquivo. Utilize a forma numérica e a forma mnemônica. 19. Configure o sistema para que todos os arquivos criados a partir deste momento tenham as seguintes permissões: total para usuário, leitura e execução para o grupo e execução para os outros. 36 CAPÍTULO 4. LISTA DE EXERCÍCIOS - 1A. LISTA 20. Crie um arquivo chamado ARQLIXO embaixo do diretório provas e verifique se as permissões de criação de arquivo estão funcionamento conforme você configurou (veja novamente a explicação sobre o comando umask para te ajudar na resposta). 21. Crie um diretório chamado DIRLIXO embaixo do diretório provas e verifique se as permissões de criação de arquivo estão funcionamento conforme você configurou. 22. Qual a diferença dos dois comandos anteriores ? 37 5 Editor VI Por mais que não usemos editores, eles fazem parte do dia-a-dia de quem trabalha com informática. Sempre iremos necessitar emitir relatórios, documentar programas, escrever códigos de programas... Portanto, é essencial que saibamos como usar um editor de texto que esteja disponı́vel no sistema. Existem alguns editores de textos disponı́veis para Unix/Linux, porém o mais usado (e normalmente o que sempre está disponı́vel) é o vi ou vim. Como qualquer editor de textos, o aprendizado é essencialmente decorativo, sendo que somente a prática garantirá o aprendizado real. Não há a necessidade de decorar os comandos do vi, porém segue abaixo uma tabela para consulta caso seja necessário. Para se entrar no vi: marcos@laureano:~$ vi arquivo O vi trabalha em 2 modos: comando e operação Ao entrar no vi, estamos trabalhando no modo de comando. 5.1 Movimentação do Cursor • j - desce uma linha • k - sobe uma linha • h - cursor para esquerda • l - cursor para direita • <ENTER> - desce uma linha para primeiro caractere não branco • 0 - retorna para inı́cio da linha • $ - movimenta cursor para final da linha Claro que nas versões mais atuais é possı́vel utilizar as setas do teclado normalmente. 38 CAPÍTULO 5. EDITOR VI 5.2 Controle de tela • ^U - meia tela para cima • ^D- meia tela para baixo • ^B - uma tela para cima • ^F - uma tela para baixo • ^L - refaz a tela 5.3 Controle de palavras • w - move o cursor para próxima palavra • b - move o cursor para palavra anterior • e - move o cursor para final da palavra • dw - apaga a palavra • cw - troca a palavra 5.4 Comandos de busca • /string - procura o string no texto ”para frente” • ? string - procura o string no texto ”para trás” • n - repete a última busca para próxima ocorrência • N - repete a última busca para ocorrência anterior 5.5 Comandos de cancelamento • x - apaga o caracter sob o cursor • X - apaga o caracter anterior ao cursor • dd - apaga uma linha • D - apaga a linha a partir do cursor • J - apaga o ¡CR¿ do final da linha, juntando a linha de baixo com a de cima 39 CAPÍTULO 5. EDITOR VI 5.6 Comandos de inserção • a - insere após o cursor • A - insere no final da linha • i - insere antes do cursor • I - insere no inı́cio da linha • p - recupera o buffer e o insere após a linha corrente • P - recupera o buffer e o insere antes a linha corrente ¡ESC¿ - encerra o modo de inserção 5.7 Comandos de mudança • cc - permite a troca de toda a linha • C - permite a troca a partir do cursor até o final da linha • s - mudança de um caracter • S - mudança de toda a linha • r - muda o caracter corrente pelo novo caracter • R - permite escrever em cima do texto 5.8 Comandos gerais • d objeto - apaga objeto • c objeto - permite a mudança no objeto • u - desfaz o último comando • U - recupera a linha corrente • y objeto - armazena o objeto na memória temporária • Y - armazena a linha na memória temporária • ZZ - grava o arquivo e encerra a sessão vi 5.9 Comandos no modo ex • :w - grava o arquivo • :wq - grava o arquivo e encerra a edição no vi 40 CAPÍTULO 5. EDITOR VI • :q - encerra a edição quando não houve alteração • :q! - abandona a edição • :num - o cursor se desloca para linha num • :!comando - executa o comando no shell 5.10 Comandos de configuração • :set opção - configura o vi para opção desejada • :set - mostra a configuração do vi (resumida) • :set all - mostra a configuração completa do vi Utilizando o set pode-se configurar o vi com as caracterı́sticas adequadas à aplicação de cada usuário, por exemplo: – set number - liga a numeração de linhas – set showmode - apresenta o modo de utilização do vi (”Insert mode”, ”Append mode”ou ”Replace mode”) • :map - mostra a configuração de teclado do vi • :map <tecla> comando_vi - associa a <tecla> ao comando vi Os comandos set e map para que fiquem sempre válidos, podem ser colocados no arquivo de configuração do vi .exrc, no seu diretório home. Esse arquivo é lido toda vez que se abre uma sessão. Todos comandos do vi podem ser precedidos por um número, indicando o número de repetições do mesmo comando. Exemplo: 10j - movimenta o cursor 10 linhas para baixo 41 6 Sistemas de Arquivos É criado durante a formatação da partição de disco. Após a formatação toda a estrutura para leitura/gravação de arquivos e diretórios pelo sistema operacional estará pronta para ser usada. Normalmente este passo é feito durante a instalação do sistema operacional 1 . Cada sistema de arquivos tem uma caracterı́stica em particular, mas seu propósito é o mesmo: Oferecer ao sistema operacional a estrutura necessária para ler/gravar os arquivos/diretórios. 6.1 Partições São divisões existentes no disco rı́gido que marcam onde começa onde termina um sistema de arquivos. Por causa destas divisões, pode-se usar mais de um sistema operacional no mesmo computador (como o Linux, Windows e DOS), ou dividir o disco rı́gido em uma ou mais partes para ser usado por um único sistema operacional. Para gravar os dados, o disco rı́gido deve ser primeiro particionado (usando o fdisk), escolher o tipo da partição (Linux Native, Linux Swap, etc) e depois aquela partição deve ser formatada com o mkfs. Depois de criada e formatada, a partição será identificada como um dispositivo no diretório /dev e deverá ser montada para permitir seu uso no sistema. Uma partição de disco não interfere em outras partições existentes, por este motivo é possı́vel usar o Windows, Linux e qualquer outro sistema operacional no mesmo disco. Para particionar (dividir) o disco rı́gido em uma ou mais partes é necessário o uso de um programa de particionamento. Os programas mais conhecidos para particionamento de discos no Unix/Linux são fdisk, cfdisk e o GParted. 6.2 Estratégias de Particionamento Um dos aspectos que devem ser incluı́dos no planejamento da instalação é como será feito o particionamento do(s) disco(s) do sistema. Embora isso dependa basicamente da utilização 1 Parte do material aqui apresentado foi retirado do Guia Foca Linux e da Conectiva. 42 CAPÍTULO 6. SISTEMAS DE ARQUIVOS pretendida para o sistema, existem alguns fatores que devem ser levados em consideração no momento de decidir como o disco deve ser particionado. Um princı́pio básico é dividir o disco em várias partições em vez de usar uma única partição ocupando o disco inteiro. Isto é recomendável por diversas razões: • Um usuário ou um programa mal-comportado pode lotar uma partição na qual tenha permissão de escrita (áreas temporárias e de armazenamento de logs são suscetı́veis a este problema). Se os programas do sistema estiverem em outra partição eles provavelmente não serão afetados, evitando que o sistema trave. • Caso uma partição seja corrompida por alguma razão, as outras partições provavelmente não serão afetadas. • Em alguns sistemas (notadamente sistemas Unix), é possı́vel definir algumas caracterı́sticas individuais para cada partição. Por exemplo, algumas partições podem ser usadas em modo read-only, o que é útil para partições que contenham binários que são modificados com pouca freqüência. • Em alguns casos a existência de várias partições permite múltiplas operações de disco em paralelo e/ou o uso de otimizações individuais para cada partição, o que pode aumentar significativamente o desempenho do sistema. • O uso de várias partições geralmente facilita o procedimento de backup do sistema, pois simplifica funções como: – Copiar partições inteiras de uma só vez; – Excluir partições individuais do procedimento; – Fazer backups em intervalos diferentes para cada partição. As partições especı́ficas que devem ser criadas variam de sistema para sistema, não existindo uma regra que possa ser sempre seguida. Entretanto, recomenda-se avaliar a conveniência da criação de partições separadas para as áreas onde são armazenados itens como: • programas do sistema operacional; • dados dos usuários; • logs; • arquivos temporários; • filas de envio e recepção de e-mails (servidores SMTP); • filas de impressão (servidores de impressão); • repositórios de arquivos (servidores FTP); • páginas Web (servidores HTTP). Note que a lista acima não é exaustiva, podendo existir outras áreas do sistema que mereçam uma partição separada. Da mesma forma, existem itens dentre os acima que não se aplicam 43 CAPÍTULO 6. SISTEMAS DE ARQUIVOS a determinados casos. Consulte a documentação do seu sistema operacional para ver se ela contém recomendações a respeito do particionamento adequado dos discos. As partições devem ser dimensionadas de acordo com os requisitos de cada sistema. Em muitos casos, o tamanho ocupado pelo sistema operacional é fornecido na sua documentação, o que pode auxiliar na determinação do tamanho de algumas partições. Qualquer que seja a estrutura de particionamento escolhida é recomendável que você tenha pelo menos um esboço dela por escrito antes de começar a instalação. Isto agiliza o processo de instalação e reduz a probabilidade de que se faça uma determinada escolha sem que as suas conseqüências sejam adequadamente previstas. 6.3 Segurança de Arquivos e Sistemas de Arquivos É inútil dotar o sistema de ferramentas de criptografia e autenticação, se o mesmo grava seus dados de forma não segura, em arquivos que possam ser indevidamente acessados. Neste contexto, o Sistema de Arquivos tem especial importância, pois é ele que responde pelo acesso e os direitos de acesso que os usuários têm sobre os arquivos. 6.3.1 Permissões de Arquivos Além dos atributos básicos que um arquivo pode ter (read, write e execute), existem dois outros atributos de extrema relevância para a segurança, que são: • SUID: Este atributo, quando definido em um arquivo, indica que este, caso seja um executável ou um script, quando do momento de sua execução, terá o seu userid atribuı́do de acordo com o userid de quem é o proprietário do arquivo, ao invés de quem o executa. Este tipo de privilégio é especialmente perigoso, pois um arquivo cujo dono seja o root, com SUID setado e que possa ser executado por qualquer usuário, independente de quem o execute, terá os privilégios de um processo do próprio root. • SGID: Este atributo, quando setado em um arquivo, similarmente ao SUID, fará com que o processo herde os privilégios do grupo do proprietário do arquivo. Apesar de muitas versões/distribuições do Unix/Linux, por padrão, ajustarem as permissões dos arquivos especiais do sistema, é sempre aconselhável tomar certos cuidados: • Em todos os arquivos de log do sistema, como por exemplo, o arquivo /var/log/messages e /var/log/secure, ajustar suas permissões para 600 (-rw------), o que significa que apenas root poderá ler e gravar nestes arquivos. Isto porque nestes arquivos podem aparecer informações sobre possı́veis erros no sistema, que podem vir a ser explorados pelo atacante. 44 CAPÍTULO 6. SISTEMAS DE ARQUIVOS • Verificar também se os arquivos de configuração do sistema (geralmente situados no diretório /etc) possui o atributo de gravação definido apenas para root (644). • Existe um atributo pouco conhecido, que na verdade diz respeito apenas ao sistema de arquivos do Linux, que permite que um arquivo nunca possa ser modificado/apagado. Este atributo pode ser setado e removido apenas pelo root e pode ser uma forma interessante de reforçar a segurança de arquivos crı́ticos. Isto pode ser feito através da linha de comando chattr +i arquivo. • Como root, verificar a PATH e certificar-se de que realmente esteja executando o programa que deseja, no local que este deveria estar. Há, na maioria das listas de bugs de segurança, relatos sobre incidentes onde root inadvertidamente executa programas maliciosos do usuário, pensando serem programas do sistema. • Procurar por arquivos que possuam os SUID ou SGID setados; eles podem ser fonte potencial de problemas. Para fazer isto, execute o comando find / -type f \( -perm -04000 -o -perm -02000 \), que irá listar todos os arquivos com algum destes privilégios setados. • Arquivos e diretórios que podem ser gravados por qualquer usuário (atributo w setado para outros) são um considerável ponto de vulnerabilidade. Executar um comando find / -perm -2 -print e verificar se esta permissão realmente é necessária para estes arquivos. • Antes de mudar a permissão de qualquer arquivo do sistema, primeiro tenha certeza de que você sabe o que está fazendo. Nunca mude as permissões de um arquivo para tornar seu trabalho mais fácil. Sempre determine porque aquele arquivo tem aquelas permissões, antes de mudá-las. 6.3.2 Integridade de Arquivos Um dilema ao qual vivem submetidos os administradores de sistema é o de saber se os arquivos do sistema não foram indevidamente alterados. Uma forma de tentar detectar a possı́vel ação de um intruso é através da utilização de ferramentas como o Tripwire. Este pacote lê um arquivo de configuração que indica quais arquivos e diretórios devem ser monitorados, e então acompanha as modificações sobre estes. Para cada arquivo/diretório especificado, o Tripwire calcula um checksum deste e com isto verifica se o arquivo sofreu qualquer tipo de alteração, reportando os resultados. Há a possibilidade de se escolher entre diferentes algoritmos de assinatura digital, alguns bastante robustos criptograficamente. O Tripwire cria uma base de dados contendo os checksums dos arquivos monitorados, e é extremamente aconselhável que este arquivo fique numa mı́dia que não possa ser corrompida por um invasor. Desta forma, aconselha-se que a base de dados, ou seja, armazenada numa 45 CAPÍTULO 6. SISTEMAS DE ARQUIVOS mı́dia removı́vel, que deve ser removido e guardado em local seguro, ou num meio do tipo write-once (uma única gravação, como os CDR’s tradicionais). É aconselhável que o Tripwire seja periodicamente executado, e para tanto se pode colocar o comando para execução na crontab do sistema. O comando md5sum também poder ser utilizado para este propósito: marcos@laureano:~$ md5sum /etc/hosts /etc/apt/sources.list /etc/network/interfaces 83f8abf1d36c9df53e2e8aa12148397e /etc/hosts 0d5ad540ee41fc3ec4b38046defe5ded /etc/apt/sources.list b30b8bd1110e83cd81b8b5939e218137 /etc/network/interfaces 6.3.3 Cavalos de Tróia O nome Cavalo de Tróia vem da história que justamente narra como soldados, escondidos dentro de um cavalo de madeira que foi supostamente dado de presente, conseguiram entrar na cidade de Tróia para invadi-la. Da mesma forma, muitas vezes quando um usuário faz o download de um programa qualquer na Internet pode estar, inadvertidamente, trazendo junto um sério risco para a segurança do sistema. Muitos invasores divulgam na Internet programas que trazem dentro de si comandos que deliberadamente podem danificar o sistema, apagando arquivos ou alterando configurações. Podem ainda enviar para alguém@algumlugar o arquivo de senhas ou outras informações sigilosas. Este tipo de programa é que normalmente chamamos de Cavalo de Tróia. Para evitar este tipo de risco, sempre vale seguir algumas regras: • Quando for fazer o download de algum software crı́tico, principalmente aqueles que serão utilizados por root, procurar utilizar um site confiável e conhecido publicamente. Sempre evitar utilizar caches, ou mesmo copiar arquivos de áreas de usuários comuns. • Muitos sites, como o caso da Red Hat, junto de seus arquivos também fornecem checksums MD5 ou assinaturas PGP, que podem ser verificadas para comprovar a autenticidade/integridade dos arquivos. • Apenas executar como root as tarefas mais importantes, e que somente podem ser executadas por root. Um erro comum é usar root para tarefas comuns, como editar um trabalho ou mesmo entrar num chat. Inclusive vale citar que muitas versões de clientes IRC eram Cavalos de Tróia, de modo que alguém como root, que inadvertidamente usasse um destes programas, estaria expondo todo o sistema a um potencial ataque. 6.3.4 Sistemas de Arquivo Criptografados Num caso extremo de segurança, onde o próprio acesso ao disco rı́gido não é garantido, pode ser interessante criptografar os dados contidos no sistema de arquivos. Para tanto existe, para 46 CAPÍTULO 6. SISTEMAS DE ARQUIVOS o Linux, o Cryptographic File System (CFS), que usa um servidor NFS rodando na máquina local para armazenar os arquivos criptografados. Uma outra versão mais sofisticada do CFS é o TCFS (Transparent Cryptographic File System), que faz o mesmo que o CFS, mas de forma transparente, sendo integrado ao próprio sistema de arquivos do Linux. 6.4 Criando uma partição - Comando fdisk O fdisk é um comando do Unix/Linux para criar partições, sua operação é um pouco complicada no inı́cio, pois sua interface é pouca amigável. Toda a navegação é feita através de comandos simples. Sua sintaxe é: fdisk [opç~ oes] [dispositivo] Um exemplo: • Iniciando e verificando o help marcos@laureano:~$fdisk /dev/sda O númeor de cilindros para este disco está configurado para 19457. N~ ao existe nada de errado, mas isto é maior que 1024, e pode em certas configuraç~ oes causar problemas com: 1) programas que executam em tempo de inicializaç~ ao (vers~ oes velhas do LILO) 2) inicializaç~ ao e programas de particionamento de outros OSs (p.ex., DOS FDISK, OS/2 FDISK) Comando (m para ajuda): m Comando - aç~ ao a alterna a opç~ ao "inicializável" b edita rótulo BSD no disco c alterna a opç~ ao "compatibilidade" d exclui uma partiç~ ao l lista os tipos de partiç~ ao conhecidos m mostra este menu n cria uma nova partiç~ ao o cria uma nova tabela de partiç~ oes DOS vazia p mostra a tabela de partiç~ oes q sai sem salvar as alteraç~ oes s cria um novo rótulo de disco Sun vazio t altera a identificaç~ ao da partiç~ ao para o sistema u altera as unidades das entradas mostradas v verifica a tabela de partiç~ oes 47 CAPÍTULO 6. SISTEMAS DE ARQUIVOS w x grava a tabela no disco e sai funcionalidade adicional (somente para usuários avançados) Comando (m para ajuda): • Listar partições ativas no sistema marcos@laureano:~$ sudo fdisk -l /dev/sda Disco /dev/sda: 160.0 GB, 160041885696 bytes 255 heads, 63 sectors/track, 19457 cylinders Units = cilindros of 16065 * 512 = 8225280 bytes Disk identifier: 0x18000000 Dispositivo Boot Inı́cio Fim Blocos Id Sistema /dev/sda1 * 1 5222 41945683+ /dev/sda2 5223 14360 73400985 /dev/sda3 14361 14425 522112+ /dev/sda4 14426 19457 40419540 7 7 82 83 HPFS ou NTFS HPFS ou NTFS Linux swap / Solaris Linux Segue abaixo um passo a passo para criar-se 3 partições Linux com o fdisk, o /boot, uma de troca e a partição raiz, num disco com o Windows já instalado. O exemplo é de um disco de 6Gb, com 32Mb de RAM e o windows ocupando 5Gb. • Já no fdisk, apertando-se p, aparece: Disk /tmp/hda: 255 heads, 63 sectors, 784 cylinders Units = cylinders of 16065 * 512 bytes Device Boot Start End Blocks Id /tmp/hda1 * 1 641 5148801 System b Win95 Fat32 • Então temos uma partição FAT com 5Gb e +ou- 1Gb sobrando. Para criar a partição do /boot com 5Mb: – – – – aperte n - para definir uma partição nova aperte p - para definir uma partição primária aperte 2 - para definir a partição primária de número 2 aperte 642 - para definir o primeiro cilindro da partição (que é o primeiro cilindro disponı́vel*, neste caso o 642) – aperte +5M - para definir o tamanho de 5Mb – aperte p - para conferir a criação • Para criar a partição de troca (swap) de 64Mb: – aperte n - para definir uma partição nova 48 CAPÍTULO 6. SISTEMAS DE ARQUIVOS – – – – aperte aperte aperte aperte p - para definir uma partição primária 3 - para definir a partição primária de número 3 ??? - sendo ???, o primeiro cilindro disponı́vel* +64M - para definir o tamanho de 64Mb • Agora precisamos dizer que seu tipo é Linux Swap. – – – – aperte aperte aperte aperte t - para indicar a mudança de tipo 3 - para mudar o tipo da partição 3 82 - para definir o tipo Swap p - para conferir a criação e o tipo • Para criar a partição raiz (/) com o restante do espaço em disco: – – – – – aperte n - para definir uma partição nova aperte p - para definir uma partição primária aperte 4 - para definir a partição primária de número 4 aperte ??? - sendo ???, o primeiro cilindro disponı́vel* aperte 784 - para definir esta partição como ocupante até o fim do disco (último cilindro, neste caso, 784) – aperte p - para conferir a criação e o tipo • Seu particionamento ficará mais ou menos assim: Disk /tmp/hda: 255 heads, 63 sectors, 784 cylinders Units = cylinders of 16065 * 512 bytes Device Boot Start /tmp/hda1 /tmp/hda2 /tmp/hda3 /tmp/hda4 * 1 642 ??? ??? End 641 ??? ??? 784 Blocks Id 5148801 5240 68704 1043615 b 83 82 83 System Win95 Linux Linux Linux Fat32 native swap native • Confira se tudo está certo, e depois aperte w para gravar a tabela de partições e sair do fdisk. 6.5 Partição EXT2 (Linux Native) A partição EXT2 é o tipo usado para criar o sistema de arquivos Linux Native usado para armazenar o sistema de arquivos EXT2 (após a formatação) e permitir o armazenamento de dados. 49 CAPÍTULO 6. SISTEMAS DE ARQUIVOS Este tipo de partição é normalmente identificado pelo código 83 nos programas de particionamento de disco. Note que também é possı́vel criar um sistema de arquivos EXT2 em um arquivo (ao invés de uma partição) que poderá ser montado e acessado normalmente pelo sistema de arquivos. Logo que foi inventado, Linux utilizava o sistema de arquivos Minix (e conseqüentemente uma partição Minix) para o armazenamento de arquivos. Com a evolução do desenvolvimento, foi criado o padrão EXT (Extended Filesystem) e logo evoluiu para o EXT2 (Second Extended Filesystem) que ainda é usado atualmente. 6.5.1 Criando um sistema de arquivos EXT2 em uma partição O utilitário usado para formatar uma partição EXT2 é o mkfs.ext2. Após terminar este passo, seu sistema de arquivos EXT2 estará pronto para ser usado. Após particionar seu disco rı́gido e criar uma (ou várias) partições EXT2, use o comando: mkfs.ext2 /dev/hda? Onde a ? em hda? significa o número da partição que será formatada. A identificação da partição é mostrada durante o particionamento do disco, anote se for o caso. hda é o primeiro disco rı́gido IDE, hdb é o segundo disco rı́gido IDE. Discos SCSI são identificados por sda?, sdb?, etc.. Algumas opções são úteis ao mkfs.ext2: • -c - Procura blocos danificados na partição antes de criar o sistema de arquivos. • -L NOME - Coloca um nome (label) no sistema de arquivos. • -b NUM - Define o tamanho do bloco, em bytes. Agora para acessar a partição deverá ser usado o comando: mount /dev/hda? /mnt -t ext2 6.5.2 Criando um sistema de arquivos EXT2 em um arquivo É possı́vel criar um sistema de arquivos EXT2 em um arquivo que poderá ser montado e acessado normalmente como se fosse uma partição normal. Isto é possı́vel por causa do recurso loop oferecido pelo kernel do Linux. Os dispositivos de loop estão disponı́veis no diretório /dev com o nome loop?. Isto é possı́vel usando o comando dd e o mkfs.ext2. Veja passo a passo como criar o sistema de arquivos EXT2 em um arquivo: Use o comando dd if=/dev/zero of=/tmp/arquivo-ext2 bs=1024 count=10000 para criar um arquivo arquivo-ext2 vazio de 10Mb de tamanho em /tmp. Você pode modificar os parâmetros de of para escolher onde o arquivo será criado, o tamanho do arquivo poderá ser modificado através de count. 50 CAPÍTULO 6. SISTEMAS DE ARQUIVOS Formate o arquivo com mkfs.ext2 /tmp/arquivo-ext2. Ele primeiro dirá que o arquivo arquivo-ext2 não é um dispositivo de bloco especial (uma partição de disco) e perguntará se deve continuar, responda com y. O sistema de arquivos EXT2 será criado em /tmp/arquivo-ext2 e estará pronto para ser usado. Monte o arquivo arquivo-ext2 com o comando: mount /tmp/arquivo-ext2 /mnt -o loop. A opção -o loop com o comando mount, fará o kernel gerenciar automaticamente os dispositivos de loop. Confira se o sistema de arquivos EXT2 em arquivo-ext2 foi realmente montado no sistema de arquivos digitando df -T. Como foi criado um sistema de arquivos EXT2 em arquivo-ext2, você poderá usar todos os recursos da partição EXT2 normal, como permissões de arquivos e diretórios, links simbólicos, etc. 6.6 Journaling O sistema de journaling grava qualquer operação que será feita no disco em uma área especial chamada journal, assim se acontecer algum problema durante a operação de disco, ele pode voltar ao estado anterior do arquivo, ou finalizar a operação. Desta forma, o journal acrescenta ao sistema de arquivos o suporte a alta disponibilidade e maior tolerância a falhas. Após uma falha de energia, por exemplo, o journal é analisado durante a montagem do sistema de arquivos e todas as operações que estavam sendo feitas no disco são verificadas. Dependendo do estado da operação, elas podem ser desfeitas ou finalizadas. O retorno do servidor é praticamente imediato (sem precisar a enorme espera da execução do fsck em partições maiores que 10Gb), garantindo o rápido retorno dos serviços da máquina. Outra situação que pode ser evitada é com inconsistências no sistema de arquivos do servidor após a situação acima, fazendo o servidor ficar em estado single user e esperando pela intervenção do administrador. 6.7 Partição EXT3 (Linux Native) O sistema de arquivos ext3 faz parte da nova geração extended file system do Linux, sendo que seu maior benefı́cio é o suporte a journaling. O uso deste sistema de arquivos comparado ao ext2, na maioria dos casos, melhora o desempenho do sistema de arquivos através da gravação seqüencial dos dados na área de metadados e acesso mhash a sua árvore de diretórios. 51 CAPÍTULO 6. SISTEMAS DE ARQUIVOS A estrutura da partição ext3 é semelhante a ext2, o journaling é feito em um arquivo chamado journal que fica oculto pelo código ext3 na partição (desta forma ele não poderá ser apagado, comprometendo o funcionamento do sistema). A estrutura idêntica da partição ext3 com a ext2 torna mais fácil manutenção do sistema, já que todas as ferramentas para recuperação ext2 funcionarão sem problemas. 6.7.1 Criando um sistema de arquivos EXT3 em uma partição Para criar uma partição ext3, utilize o comando mkfs.ext3 ou o mkfs.ext2 junto com a opção -j. As opções usadas pelo mkfs.ext3 são idênticas a do mkfs.ext2. A única vantagem desta ferramenta comparada ao mkfs.ext2 é que a opção -j é automaticamente adicionada a linha de comando para criar um sistema de arquivos com journal. Se você é daqueles que querem ter um controle maior sobre o tamanho do arquivo de journal, use a opção -J [tam] (onde tamanho é o tamanho em Megabytes). Quando uma partição ext3 é criada, o arquivo journal é criado no raı́z da partição, sendo usado para gravar os metadados das transações de journaling. A estrutura da partição ext2 não difere em nada da ext3, a não ser este arquivo e a opção has journal que é passada a partição. Por exemplo, para criar uma partição ext3 em /dev/hda1: mkfs.ext3 /dev/hda1 ou mkfs.ext2 -j /dev/hda1 Basta agora montar a partição com o comando mount /dev/hda1 /teste -t ext3 para montar a partição em /teste. Após, modifique o /etc/fstab para montar a partição como ext3 quando o Linux for iniciado. Caso o suporte à ext3 tenha sido compilado no kernel, ele tentará detectar e montar a partição como ext3, caso contrário, ele usará ext2. Sua partição agora está montada como ext3, para conferir digite: df -T. Quando criar um sistema de arquivos ext3 em uma partição raı́z (/), tenha certeza de incluir o suporte a ext3 embutido no kernel, caso contrário à partição será montada como ext2. 6.8 Nomeando uma partição de disco - comando e2label O comando e2label é usado para esta função. Sua sintaxe: e2label [dispositivo] [nome] Onde: • dispositivo - Partição que terá o nome modificado • nome - Nome que será dado a partição (máximo de 16 caracteres). Caso seja utilizado 52 CAPÍTULO 6. SISTEMAS DE ARQUIVOS um nome de volume com espaços em branco, ele deverá ser colocado entre aspas. Se não for especificado um nome, o nome atual da partição será mostrado. O nome da partição também pode ser visualizado através do comando dumpe2fs. Exemplo: e2label /dev/sda1 MarcosLaureano, e2label /dev/sda1 "Marcos Laureano" 6.9 Detalhes de uma Partição - comando dumpe2fs Mostra detalhes sobre uma partição Linux. Sua sintaxe: dumpe2fs [opç~ oes] [partiç~ ao] Onde: • partição - Identificação da partição que será usada. • opções - A opção -b mostra somente os blocos marcados como defeituosos no sistema de arquivos especificado. Este comando lista diversas opções úteis do sistema de arquivos como o tipo do sistema de arquivos, caracterı́sticas especiais, número de inodos, blocos livres, tamanho do bloco, intervalo entre checagens automáticas, etc. Exemplo: dumpe2fs /dev/sda1, dumpe2fs -b /dev/sda1 6.10 Criando sistema de arquivos Swap em uma partição O programa usado para formatar uma partição Swap é o mkswap: mkswap /dev/hda? O nome do dispositivo da partição Swap pode ser visualizado através de seu programa de particionamento, você pode usar o comando fdisk -l /dev/hda para listar as partições no primeiro disco rı́gido e assim verificar qual dispositivo corresponde à partição Swap. A opção -c também pode ser usada com o mkswap para checar se existem agrupamentos danificados na partição. Com a partição Swap formatada, use o comando: swapon /dev/hda? para ativar a partição swap. Se utilizar mais que 1 partição Swap, pode ser útil o uso da opção -p NUM que especifica a prioridade em que a partição Swap será usada. Pode ser usado um valor de prioridade entre 0 e 32767, partições com número maior serão usadas primeiro, sendo que na montagem automática através de mount -a podem ser designados números negativos. 53 CAPÍTULO 6. SISTEMAS DE ARQUIVOS 6.11 Pontos de Montagem O Linux acessa as partições existente em seus discos rı́gidos e disquetes através de diretórios. Os diretórios que são usados para acessar (montar) partições são chamados de Pontos de Montagem. No Windows(DOS) cada letra de unidade (C:, D:, E:) identifica uma partição de disco, no Linux os pontos de montagem fazem parte da grande estrutura do sistema de arquivos raiz. Existem muitas vantagens de se usar pontos de montagem ao invés de unidade de disco para identificar partições (método usado no Windows): • Você pode montar a partição no diretório que quiser. • Em caso de um sistema de arquivos cheio, você pode copiar o conteúdo de um grande diretório para um disco separado, apagar o conteúdo do diretório original e montar o disco onde foram copiados os arquivos naquele local. • O uso de pontos de montagem torna o gerenciamento mais flexı́vel. • A adição de novas partições ou substituição de discos rı́gidos não afeta a ordem de identificação dos discos e pontos de montagem (como não acontece no Windows). 6.11.1 Identificação de discos e partições em sistemas Linux No Linux, os dispositivos existentes em seu computador (como discos rı́gidos, disquetes, tela, portas de impressora, modem, etc) são identificados por um arquivo referente a este dispositivo no diretório /dev. A identificação de discos rı́gidos no Linux é feita da seguinte forma: /dev/hda1 | | | | | | | |_Número que identifica o número da partiç~ ao no disco rı́gido. | | | | | |_Letra que identifica o disco rı́gido (a=primeiro, b=segundo, etc...). | | | |_Sigla que identifica o tipo do disco rı́gido (hd=ide, sd=SCSI, xt=XT). | |_Diretório onde s~ ao armazenados os dispositivos existentes no sistema. As letras de identificação de discos rı́gidos podem ir além de hdb, em meu micro, por exemplo, a unidade de CD-ROM está localizada em /dev/hdg (Primeiro disco - quarta controladora IDE). 54 CAPÍTULO 6. SISTEMAS DE ARQUIVOS 6.12 Montando (acessando) uma partição de disco Comando mount É importante entender como os discos e partições são identificados no sistema, pois será necessário usar os parâmetros corretos para monta-los. Você pode acessar uma partição de disco usando o comando mount. Sua sintaxe: mount [dispositivo] [ponto de montagem] [opç~ oes] Onde: • dispositivo - Identificação da unidade de disco/partição que deseja (como /dev/hda1 (disco rı́gido) ou /dev/fd0 (primeira unidade de disquetes). acessar • ponto de montagem - Diretório de onde a unidade de disco/partição será acessado. O diretório deve estar vazio para montagem de um sistema de arquivo. Normalmente é usado o diretório /mnt para armazenamento de pontos de montagem temporários. Caso você digitar mount sem parâmetros, serão mostrados os sistemas de arquivos atualmente montados no sistema. Esta mesma listagem pode ser vista em /etc/mtab. A remontagem de partição também é muito útil, especialmente após reparos nos sistema de arquivos do disco rı́gido. Veja alguns exemplos de remontagem abaixo. É necessário permissões de root para montar partições, a não ser que tenha especificado a opção user no arquivo /etc/fstab. Exemplos de Montagem: • Montar uma partição Windows (vfat) de /dev/hda1 em /mnt somente para leitura: mount /dev/hda1 /mnt -r -t vfat • Montar a primeira unidade de disquetes /dev/fd0 em /floppy: mount /dev/fd0 /floppy -t vfat • Montar uma partição DOS localizada em um segundo disco rı́gido /dev/hdb1 em /mnt: mount /dev/hdb1 /mnt -t msdos • Remontar a partição raı́z como somente leitura: mount -o remount,rw / • Remontar a partição raı́z como leitura/gravação (a opção -n é usada porque o mount não conseguirá atualizar o arquivo /etc/mtab devido ao sistema de arquivos / estar montado como somente leitura atualmente: mount -n -o remount,rw / 55 CAPÍTULO 6. SISTEMAS DE ARQUIVOS 6.13 Arquivo fstab O arquivo /etc/fstab permite que as partições do sistema sejam montadas facilmente especificando somente o dispositivo ou o ponto de montagem. Este arquivo contém parâmetros sobre as partições que são lidas pelo comando mount. Cada linha deste arquivo contém a partição que desejamos montar, o ponto de montagem, o sistema de arquivos usado pela partição e outras opções. O /etc/fstab tem a seguinte forma: Sistema_de_arquivos Ponto_de_Montagem Tipo Opcoes /dev/hda1 /dev/hda2 /dev/hda3 /dev/hdg defaults defaults defaults,noauto,rw defaults,noauto / /boot /dos /cdrom ext2 ext2 msdos iso9660 dump ordem 0 0 0 0 1 2 0 0 Onde: • Sistema de Arquivos - Partição que deseja montar. • Ponto de montagem - Diretório do GNU/Linux onde a partição montada será acessada. • Tipo - Tipo de sistema de arquivos usado na partição que será montada. Para partições Linux use ext3, para partições Windows (com suporte a nomes extensos de arquivos) use vfat, para unidades de CD-ROM use iso9660. • Opções - Especifica as opções usadas com o sistema de arquivos: – defaults - Utiliza valores padrões de montagem. – noauto - Não monta os sistemas de arquivos durante a inicialização (útil para CDROMS e disquetes). – ro - Monta como somente leitura. – user - Permite que usuários montem o sistema de arquivos (não recomendado por motivos de segurança). – sync - é recomendado para uso com discos removı́veis (disquetes, zip drives, etc) para que os dados sejam gravados imediatamente na unidade. • Ordem - Define a ordem que os sistemas de arquivos serão verificados na inicialização do sistema. Se usar 0, o sistema de arquivos não é verificado. O sistema de arquivos raı́z que deverá ser verificado primeiro é o raı́z (/) (a não ser que você tenha um sistema de arquivos de outro tipo que não é montado dentro do diretório raı́z e possui seu suporte embutido no kernel). Após configurar o /etc/fstab, basta digitar o comando mount /dev/hdg ou mount /cdrom para que a unidade de CD-ROM seja montada. Não é necessário especificar o sistema de arquivos da partição pois o mount verificará se ele já existe no /etc/fstab e caso existir, usará 56 CAPÍTULO 6. SISTEMAS DE ARQUIVOS as opções especificadas neste arquivo. Para maiores detalhes veja as páginas de manual fstab e mount. Claro, cada computador pode ter arquivos /etc/fstab com diferentes configurações. Por exemplo, atualmente o meu equipamento possue as seguintes opções de montagem: # /etc/fstab: static file system information. # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 # /dev/sda4 UUID=2754aa10-dac4-47b0-ab1b-3b32c3da780d / ext3 defaults,errors=remoun # /dev/sda1 UUID=D870616970614F76 /media/sda1 ntfs defaults,umask=007,gid=46 0 1 # /dev/sda2 UUID=21BE559D53164EF2 /media/sda2 ntfs defaults,umask=007,gid=46 0 1 # /dev/sda3 UUID=ac1b3db0-fcb0-4ba5-b3bc-78e33e86d8cc none swap sw 0 /dev/scd0 /media/cdrom0 udf,iso9660 user,noauto,exec 0 0 6.14 Desmontando uma partição de disco - Comando umount Para desmontar um sistema de arquivos montado com o comando mount, use o comando umount. Você deve ter permissões de root para desmontar uma partição. Sua sintaxe: umount [dispositivo/ponto de montagem] Você pode tanto usar umount /dev/hda1 como umount /mnt para desmontar um sistema de arquivos /dev/hda1 montado em /mnt. O comando umount executa o sync automaticamente no momento da desmontagem para garantir que todos os dados ainda não gravados serão salvos. 6.15 Exercı́cios sugeridos 1. Crie um sistema de arquivos ext3 no arquivo e altere o arquivo /etc/fstab para monta-lo automaticamente no boot do sistema. 2. Altere as permissões do arquivo /etc/fstab para que um usuário comum possa montar e desmontar um sistema de arquivos. 57 7 Gerência de Processos 7.1 Entradas e saı́das padrão A maioria dos comandos pode comunicar-se com o sistema através de descritores de arquivos especiais conhecidos como entradas e saı́das padrão. São eles: • Entrada padrão (stdin - standard input): onde o comando vai ler seus dados de entrada. • Saı́da padrão (stdout - standard output): onde o comando vai escrever seus dados de saı́da. • Saı́da de erro (stderr - standard error ): onde o comando vai enviar mensagens de erro. A figura 7.1 mostra a relação entre um processo e os arquivos padrão. Figura 7.1: Saı́das do Sistema Quando um comando é lançado sem indicar seu arquivo de trabalho, ele busca seus dados da entrada padrão. Por default, o shell onde o comando foi lançado associa o processo ao seu terminal, ou seja: a entrada padrão do processo é associada ao teclado e as saı́das padrão e de erros à tela da sessão corrente (figura 7.2) Vejamos um exemplo de uso da entrada e saı́da padrão com o comando rev, que escreve em sua saı́da padrão as linhas de texto lidas em sua entrada padrão, invertendo-as: 58 CAPÍTULO 7. GERÊNCIA DE PROCESSOS Figura 7.2: Saı́das do Sistema ligadas ao terminal marcos@laureano:~$ rev vamos fazer um teste etset mu rezaf somav temos que achar um palindromo omordnilap mu rahca euq somet opoetaamaateopo opoetaamaateopo Para indicar o fim entrada padrão (fim de arquivo), basta pressionar <CTRL> D. Com esse caractere o comando rev encerra sua execução, pois chegou ao final de seu arquivo de entrada (que neste caso é o teclado). Vejamos outro exemplo com o comando sort: marcos@laureano:~$ sort Jo~ ao Maria José Luiz 59 CAPÍTULO 7. GERÊNCIA DE PROCESSOS Carlos <---pressionar <CTRL>+D ao fim deste nome Carlos Jo~ ao José Luiz Maria Normalmente o shell direciona a entrada padrão para o teclado e a saı́da padrão para a tela da sessão do usuário, mas pode ser instruı́do para redirecioná-las para arquivos ou mesmo para outros programas, como veremos na seqüência. 7.2 Redirecionamento para arquivos O shell pode redirecionar as entrada e saı́das padrão de comandos para arquivos normais, usando operadores de redireção. A sintaxe de redireção é especı́fica para cada shell, isto é, não é a mesma entre o C-Shell e o Bourne Shell. Aqui veremos a sintaxe do BASH-Shell. Os principais operadores de redireção para arquivos são: • Saı́da em arquivo: a saı́da padrão (stdout) do comando é desviada para um arquivo usando o operador >. Exemplo: ls > listagem.txt • Entrada de arquivo: a entrada padrão (stdin) pode ser obtida a partir de um arquivo usando o operador <. Exemplo: rev < listagem.txt • Uso combinado: os dois operadores podem ser usados simultaneamente. rev < listagem.txt > listrev.txt Exemplo: • Concatenação: a saı́da padrão pode ser concatenada a um arquivo existente usando-se o operador >>. Exemplo: ls /etc >> listagem.txt • Saı́da de erros: a saı́da de erros (stderr ) pode ser redirecionada juntamente com a saı́da standard. Para isso basta usar o modificador &1 em conjunção com 2> ou 2>>. Vejamos um exemplo: marcos@laureano:~$ ls /xpto > teste.txt ls: impossı́vel acessar /xpto: Arquivo ou diretório inexistente marcos@laureano:~$ ls -l /xpto 2>erro.txt marcos@laureano:~$ cat erro.txt ls: impossı́vel acessar /xpto: Arquivo ou diretório inexistente marcos@laureano:~$ ls -l /xpto /etc/passwd > acerto.txt 2>erro.txt marcos@laureano:~$ cat erro.txt 60 CAPÍTULO 7. GERÊNCIA DE PROCESSOS ls: impossı́vel acessar /xpto: Arquivo ou diretório inexistente marcos@laureano:~$ cat acerto.txt -rw-r--r-- 1 root root 1465 2008-04-25 21:23 /etc/passwd marcos@laureano:~$ ls -l /xpto /etc/passwd > acerto.txt 2>&1 marcos@laureano:~$ cat acerto.txt ls: impossı́vel acessar /xpto: Arquivo ou diretório inexistente -rw-r--r-- 1 root root 1465 2008-04-25 21:23 /etc/passwd • Forçar um desvio: Caso a saı́da seja redirecionada para um arquivo já existente, o shell recusa a operação indicando o erro (somente se a variável noclobber estiver setada através do comando set -C). Essa operação pode ser forçada através do operador !: marcos@laureano:~$ set -C noclobber marcos@laureano:~$ ls -l > teste.txt bash: teste.txt: n~ ao é possı́vel sobrescrever arquivo existente marcos@laureano:~$ ls -l >! teste.txt 7.3 Redirecionamento usando pipes O shell permite a construção de comandos complexos através da combinação de vários comandos simples. O operador |, conhecido como pipe, ou tubo, permite conectar a saı́da standard de um comando à entrada standard de outro. Com isso, um mesmo fluxo de dados pode ser tratado por diversos comandos consecutivamente, como mostra a figura 7.3 É importante ressaltar que os comandos conectados são lançados simultaneamente pelo shell e executam ao mesmo tempo. O shell controla a execução de cada um para que não haja acumulo de dados entre os comandos (a cada pipe é associado um buffer de tamanho limitado). A sintaxe usada para redireção é simples. Vejamos alguns exemplos: ls -l /etc | more ls -l /tmp | sort | more ls -l /usr/bin | cut -c31-40 | sort | more 61 CAPÍTULO 7. GERÊNCIA DE PROCESSOS Figura 7.3: Redirecionamento com pipes 7.4 Prática Sugerida Execute os passos abaixo e explique o que acontece. listagem.txt: Observe o tamanho do arquivo marcos@laureano:~$ mkdir novo marcos@laureano:~$ cd novo marcos@laureano:~/novo$ touch a b c marcos@laureano:~/novo$ ls total 0 -rw-r--r-- 1 marcos marcos -rw-r--r-- 1 marcos marcos -rw-r--r-- 1 marcos marcos -l 0 2008-05-07 11:33 a 0 2008-05-07 11:33 b 0 2008-05-07 11:33 c marcos@laureano:~/novo$ ls -l > listagem.txt marcos@laureano:~/novo$ cat listagem.txt total 0 -rw-r--r-- 1 marcos marcos 0 2008-05-07 11:33 -rw-r--r-- 1 marcos marcos 0 2008-05-07 11:33 -rw-r--r-- 1 marcos marcos 0 2008-05-07 11:33 -rw-r--r-- 1 marcos marcos 0 2008-05-07 11:33 marcos@laureano:~/novo$ ls -l 62 a b c listagem.txt CAPÍTULO 7. GERÊNCIA DE PROCESSOS total 4 -rw-r--r--rw-r--r--rw-r--r--rw-r--r-- 1 1 1 1 marcos marcos marcos marcos marcos 0 marcos 0 marcos 0 marcos 211 2008-05-07 2008-05-07 2008-05-07 2008-05-07 11:33 11:33 11:33 11:33 a b c listagem.txt Observe que o arquivo listagem.txt não existia, mas foi relacionado (com tamanho 0). Isto significa que antes do comando ls -l ser executado, o arquivo listagem.txt foi criado. 7.5 Filtros Existe um grande número de comandos bastante simples, cujo uso direto é pouco útil, mas que podem ser de grande valia quando associados entre si através de pipes. Esses comandos são chamados filtros, porque funcionam como filtros para o fluxo de dados. Vejamos os filtros de uso mais corrente: • cat - concatena diversos arquivos na saı́da padrão. marcos@laureano:~/novo$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh proxy:x:13:13:proxy:/bin:/bin/sh www-data:x:33:33:www-data:/var/www:/bin/sh backup:x:34:34:backup:/var/backups:/bin/sh list:x:38:38:Mailing List Manager:/var/list:/bin/sh irc:x:39:39:ircd:/var/run/ircd:/bin/sh gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh nobody:x:65534:65534:nobody:/nonexistent:/bin/sh dhcp:x:100:101::/nonexistent:/bin/false syslog:x:101:102::/home/syslog:/bin/false klog:x:102:103::/home/klog:/bin/false messagebus:x:103:109::/var/run/dbus:/bin/false hplip:x:104:7:HPLIP system user,,,:/var/run/hplip:/bin/false 63 CAPÍTULO 7. GERÊNCIA DE PROCESSOS avahi-autoipd:x:105:113:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false avahi:x:106:114:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false haldaemon:x:107:116:Hardware abstraction layer,,,:/home/haldaemon:/bin/false gdm:x:108:118:Gnome Display Manager:/var/lib/gdm:/bin/false marcos:x:1000:1000:Marcos Laureano,,,:/home/marcos:/bin/bash libuuid:x:109:121::/var/lib/libuuid:/bin/sh pulse:x:110:122:PulseAudio daemon,,,:/var/run/pulse:/bin/false polkituser:x:111:126:PolicyKit,,,:/var/run/PolicyKit:/bin/false • tac - idem, mas inverte a ordem das linhas. marcos@laureano:~/novo$ tac /etc/passwd polkituser:x:111:126:PolicyKit,,,:/var/run/PolicyKit:/bin/false pulse:x:110:122:PulseAudio daemon,,,:/var/run/pulse:/bin/false libuuid:x:109:121::/var/lib/libuuid:/bin/sh marcos:x:1000:1000:Marcos Laureano,,,:/home/marcos:/bin/bash gdm:x:108:118:Gnome Display Manager:/var/lib/gdm:/bin/false haldaemon:x:107:116:Hardware abstraction layer,,,:/home/haldaemon:/bin/false avahi:x:106:114:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false avahi-autoipd:x:105:113:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false hplip:x:104:7:HPLIP system user,,,:/var/run/hplip:/bin/false messagebus:x:103:109::/var/run/dbus:/bin/false klog:x:102:103::/home/klog:/bin/false syslog:x:101:102::/home/syslog:/bin/false dhcp:x:100:101::/nonexistent:/bin/false nobody:x:65534:65534:nobody:/nonexistent:/bin/sh gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh irc:x:39:39:ircd:/var/run/ircd:/bin/sh list:x:38:38:Mailing List Manager:/var/list:/bin/sh backup:x:34:34:backup:/var/backups:/bin/sh www-data:x:33:33:www-data:/var/www:/bin/sh proxy:x:13:13:proxy:/bin:/bin/sh uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh games:x:5:60:games:/usr/games:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync sys:x:3:3:sys:/dev:/bin/sh bin:x:2:2:bin:/bin:/bin/sh daemon:x:1:1:daemon:/usr/sbin:/bin/sh root:x:0:0:root:/root:/bin/bash 64 CAPÍTULO 7. GERÊNCIA DE PROCESSOS • more - permite a paginação do fluxo de dados. • tr - troca de caracteres entre dois conjuntos. marcos@laureano:~/novo$ ls -l total 4 -rw-r--r-- 1 marcos marcos 0 2008-05-07 11:33 -rw-r--r-- 1 marcos marcos 0 2008-05-07 11:33 -rw-r--r-- 1 marcos marcos 0 2008-05-07 11:33 -rw-r--r-- 1 marcos marcos 211 2008-05-07 11:33 marcos@laureano:~/novo$ ls -l | tr "Aa" "Bb" totbl 4 -rw-r--r-- 1 mbrcos mbrcos 0 2008-05-07 11:33 -rw-r--r-- 1 mbrcos mbrcos 0 2008-05-07 11:33 -rw-r--r-- 1 mbrcos mbrcos 0 2008-05-07 11:33 -rw-r--r-- 1 mbrcos mbrcos 211 2008-05-07 11:33 a b c listagem.txt b b c listbgem.txt • head - seleciona as n linhas iniciais do fluxo de dados. marcos@laureano:~/novo$ head -5 /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync • tail - seleciona as n linhas finais do fluxo de dados. marcos@laureano:~/novo$ tail -2 /etc/passwd pulse:x:110:122:PulseAudio daemon,,,:/var/run/pulse:/bin/false polkituser:x:111:126:PolicyKit,,,:/var/run/PolicyKit:/bin/false • wc - conta o número de linhas, palavras e bytes do fluxo. • sort - ordena as linhas segundo critérios ajustáveis. marcos@laureano:~/novo$ cat /etc/passwd | sort -t: -k1 avahi-autoipd:x:105:113:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false avahi:x:106:114:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false backup:x:34:34:backup:/var/backups:/bin/sh bin:x:2:2:bin:/bin:/bin/sh daemon:x:1:1:daemon:/usr/sbin:/bin/sh dhcp:x:100:101::/nonexistent:/bin/false games:x:5:60:games:/usr/games:/bin/sh gdm:x:108:118:Gnome Display Manager:/var/lib/gdm:/bin/false gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh haldaemon:x:107:116:Hardware abstraction layer,,,:/home/haldaemon:/bin/false 65 CAPÍTULO 7. GERÊNCIA DE PROCESSOS hplip:x:104:7:HPLIP system user,,,:/var/run/hplip:/bin/false irc:x:39:39:ircd:/var/run/ircd:/bin/sh klog:x:102:103::/home/klog:/bin/false libuuid:x:109:121::/var/lib/libuuid:/bin/sh list:x:38:38:Mailing List Manager:/var/list:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh marcos:x:1000:1000:Marcos Laureano,,,:/home/marcos:/bin/bash messagebus:x:103:109::/var/run/dbus:/bin/false news:x:9:9:news:/var/spool/news:/bin/sh nobody:x:65534:65534:nobody:/nonexistent:/bin/sh polkituser:x:111:126:PolicyKit,,,:/var/run/PolicyKit:/bin/false proxy:x:13:13:proxy:/bin:/bin/sh pulse:x:110:122:PulseAudio daemon,,,:/var/run/pulse:/bin/false root:x:0:0:root:/root:/bin/bash sync:x:4:65534:sync:/bin:/bin/sync syslog:x:101:102::/home/syslog:/bin/false sys:x:3:3:sys:/dev:/bin/sh uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh www-data:x:33:33:www-data:/var/www:/bin/sh • uniq - remove linhas repetidas, deixando uma só linha. marcos@laureano:~/novo$ cat nomes.txt Jo~ ao Jo~ ao Maria José Rosa Luiz Marcos Marcos marcos@laureano:~/novo$ sort nomes.txt | uniq Jo~ ao José Luiz Marcos Maria Rosa • sed - para operações complexas de strings (trocas, etc). • grep - seleciona linhas contendo uma determinada expressão. 66 CAPÍTULO 7. GERÊNCIA DE PROCESSOS • cut - seleciona colunas do fluxo de entrada. marcos@laureano:~$ cat /etc/passwd | cut -d: -f1 | sort avahi avahi-autoipd backup bin daemon dhcp games gdm gnats haldaemon hplip irc klog libuuid list lp mail man marcos messagebus news nobody polkituser proxy pulse root sync sys syslog uucp www-data • rev - reverte a ordem dos caracteres de cada linha do fluxo de entrada. • tee - duplica o fluxo de entrada (para um arquivo e para a saı́da standard). • ...e muitos outros, são mais de 300. Para conhecer melhor cada um dos comandos acima, consulte suas páginas de manual. 67 CAPÍTULO 7. GERÊNCIA DE PROCESSOS 7.6 Prática sugerida 1. Determine o número de linhas da página de manual do shell bash. 2. Determine quanto arquivos normais (não diretórios nem links) existem em /usr. 3. Qual a sequência de comandos para se obter uma listagem dos alunos que cursam esta disciplina. As informações podem ser obtidas no arquivo /etc/passwd. Para obter a relação dos alunos, pode-se filtrar a partir do grupo de trabalho. 7.7 Programas e processos Como vimos anteriormente, programas são arquivos em disco contendo instruções para execução pelo processador, enquanto processos são as execuções em andamento. Cada processo executando no sistema em um determinado momento é identificado por um número único, o PID - Process IDentifier. Além disso, cada processo possui outras informações que o caracterizam, como: • Usuário proprietário (aquele que lançou o processo) • Sessão de shell de onde foi lançado (se foi lançado através de um shell ) • Estado atual (Running, Suspended, SWapped, ...) • Linha de comando usada para lançá-lo. • Uso de memória e CPU • etc. 7.8 Comandos ps e pstree Podemos visualizar os processos em execução no sistema através do comando ps, cuja execução sem parâmetros gera uma listagem como a seguinte: marcos@laureano:~$ ps PID TTY TIME CMD 6767 pts/0 00:00:00 bash 16576 pts/0 00:00:00 ps O comando ps aceita uma série de parâmetros, entre os quais os mais importantes são: • a - mostra processos de outros usuários também (all). • u - mostra listagem mais detalhada dos processos, com uso de memória e CPU 68 CAPÍTULO 7. GERÊNCIA DE PROCESSOS • x - mostra processos não conectados a terminais. • w - mostra mais detalhes sobre as linhas de comando dos processos. Para obter uma listagem completa dos processos em execução no sistema usam-se as opções auxw, que geram uma listagem como a que segue: marcos@laureano:~$ ps auxw USER PID %CPU %MEM VSZ root 1 0.0 0.0 4016 root 2 0.0 0.0 0 root 3 0.0 0.0 0 root 4 0.0 0.0 0 root 5 0.0 0.0 0 root 6 0.0 0.0 0 root 7 0.0 0.0 0 root 8 0.0 0.0 0 root 9 0.0 0.0 0 root 10 0.0 0.0 0 root 11 0.0 0.0 0 root 45 0.0 0.0 0 root 46 0.0 0.0 0 root 49 0.0 0.0 0 root 50 0.0 0.0 0 root 143 0.0 0.0 0 root 190 0.0 0.0 0 root 191 0.0 0.0 0 root 192 0.0 0.0 0 root 236 0.0 0.0 0 root 237 0.0 0.0 0 root 1442 0.0 0.0 0 root 1445 0.0 0.0 0 root 1618 0.0 0.0 0 root 1630 0.0 0.0 0 root 1633 0.0 0.0 0 root 1641 0.0 0.0 0 root 2369 0.0 0.0 0 root 2372 0.0 0.0 0 root 2374 0.0 0.0 0 root 2406 0.0 0.0 0 root 2408 0.0 0.0 0 root 2660 0.0 0.0 0 root 2907 0.0 0.0 17180 root 3226 0.0 0.0 0 RSS 888 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1296 0 TTY ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 69 STAT Ss S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S S S< S< S< S< S< S< S< S< S< S< S< S< S< S< S< S<s S< START 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 08:47 TIME 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:00 0:02 0:00 0:00 0:00 0:00 0:00 0:00 COMMAND /sbin/init [kthreadd] [migration/0] [ksoftirqd/0] [watchdog/0] [migration/1] [ksoftirqd/1] [watchdog/1] [events/0] [events/1] [khelper] [kblockd/0] [kblockd/1] [kacpid] [kacpi_notify] [kseriod] [pdflush] [pdflush] [kswapd0] [aio/0] [aio/1] [ksuspend_usbd] [khubd] [khpsbpkt] [ata/0] [ata/1] [ata_aux] [knodemgrd_0] [scsi_eh_0] [scsi_eh_1] [scsi_eh_2] [scsi_eh_3] [kjournald] /sbin/udevd --daemon [kpsmoused] CAPÍTULO 7. GERÊNCIA DE PROCESSOS root 3301 0.0 0.0 root 4338 0.0 0.0 root 4339 0.0 0.0 root 4340 0.0 0.0 < resultado suprimido> 0 0 0 0 0 0 0 0 ? ? ? ? S< S< S< S< 08:47 08:47 08:47 08:47 0:00 0:01 0:00 0:00 [kmmcd] [ntos_wq] [ndis_wq] [wrapndis_wq] Os principais campos dessa listagem são: • USER - o proprietário do processo, que pode ser quem o lançou ou, no caso de executáveis com o bit SUID habilitado, o proprietário do arquivo executável. • PID - número do processo. • %CPU - porcentagem da CPU usada pelo processo. • %MEM - porcentagem da memória usada pelo processo. • SIZE - memória total usada pelo processo. • RSS - memória fı́sica (RAM) usada pelo processo. • TTY - terminal ao qual o processo está ligado. • STAT - status do processo (rodando, suspenso, ...). • START - data de lançamento do processo. • TIME - tempo total de CPU usado pelo processo. • COMMAND - comando usado para lançar o processo. O comando pstree é útil por mostrar a hierarquia existente entre os processos ativos no sistema: marcos@laureano:~$ pstree init-+-NetworkManager---2*[{NetworkManager}] |-NetworkManagerD |-acpid |-anacron---sh---run-parts---apt---apt-key---wget |-avahi-daemon---avahi-daemon |-bonobo-activati---{bonobo-activati} |-console-kit-dae---61*[{console-kit-dae}] |-cron |-cupsd |-2*[dbus-daemon] |-dd |-dhcdbd---dhclient |-evolution-data----2*[{evolution-data-}] |-fast-user-switc |-firefox---7*[{firefox}] 70 CAPÍTULO 7. GERÊNCIA DE PROCESSOS |-gconfd-2 |-gdm---gdm-+-Xorg | ‘-gnome-session-+-bluetooth-apple | |-compiz---compiz.real | |-emerald | |-evolution-alarm---{evolution-alarm} | |-gnome-panel | |-gnome-settings--+-pulseaudio-+-gconf-helper | | | ‘-2*[{pulseaudio}] | | ‘-{gnome-settings-} | |-nautilus---{nautilus} | |-nm-applet | |-2*[python] | |-seahorse-agent | |-tracker-applet | |-trackerd---2*[{trackerd}] | |-update-notifier | ‘-{gnome-session} |-6*[getty] |-gnome-keyring-d |-gnome-power-man |-gnome-screensav |-gnome-terminal-+-bash---pstree | |-gnome-pty-helpe | ‘-{gnome-terminal} |-gnome-volume-ma |-gvfsd |-gvfsd-burn |-gvfsd-trash |-hcid---2*[bluetoothd-serv] |-klogd |-mixer_applet2---{mixer_applet2} |-2*[mount.ntfs] |-syslogd |-system-tools-ba |-trashapplet |-udevd |-update-manager-+-gksu---synaptic-+-gnome-pty-helpe | | ‘-synaptic---dpkg | ‘-{update-manager} |-update-menus ‘-winefish 71 CAPÍTULO 7. GERÊNCIA DE PROCESSOS 7.9 Mudando prioridade processos - Comandos nice e renice O comando nice configura a prioridade da execução de um comando/programa. Sua sintaxe: nice [opç~ oes] [comando/programa] O comando renice configura a prioridade de um processo que já esteja em execução (somente o dono do processo ou o superusuário podem mudar a prioridade de um processo). Sua sintaxe: renice [opç~ oes] [processos ou usuários] Se um programa for executado com maior prioridade, ele usará mais recursos do sistema para seu processamento, caso tenha uma prioridade baixa, ele permitirá que outros programas tenham preferência. A prioridade de execução de um programa/comando ou processo pode ser ajustada de -19 (a mais alta) até 19 (a mais baixa). Somente o superusuário pode aumentar a prioridade de um programa ou processo. Exemplos de utilização: marcos@laureano:~$ nice -10 find / -name apropos 2>/dev/null & [2] 10896 marcos@laureano:~$ ps -l F S UID PID PPID C PRI 0 S 1000 9457 9447 0 80 0 S 1000 10896 9457 6 90 0 R 1000 10900 9457 0 80 NI 0 10 0 ADDR SZ - 5184 - 1342 - 1660 WCHAN wait wait_a - TTY pts/2 pts/2 pts/2 TIME 00:00:00 00:00:00 00:00:00 CMD bash find ps marcos@laureano:~$ renice 19 -p 10896 10896: prioridade antiga = 10; prioridade nova = 19 7.10 Execução de Comandos em Background e Foreground 7.10.1 Caractere & É possı́vel que se queira executar um comando demorado e, enquanto se espera o resultado do mesmo, fazer-se outras coisas no terminal. Este processo de se rodar um programa ou comando desvinculado do terminal chama-se rodar em background. Se for colocado o caractere & na linha de comando, a mesma será executada em background, liberando assim o terminal para outras tarefas. Se por acaso as saı́das padrão e de erro do comando submetido em background não forem redirecionadas elas continuaram saindo na tela apesar da execução do comando não estar mais vinculada a ele. Portanto sempre que for usar comandos em background, redirecione tanto a saı́da padrão, como a saı́da de erro. 72 CAPÍTULO 7. GERÊNCIA DE PROCESSOS Exemplo: O caractere & deve ser sempre o último na linha de comando. marcos@laureano:~$ ls -laR / >/dev/null 2>&1 & [1] 11096 O número 11096 é o PID do processo, o valor [1] é o número de controle de processos dentro do shell. Este número é utilizando para os comandos jobs, bg e fg. 7.10.2 Comando jobs O comando interno jobs mostra a situação de todos os processos que estão em background e que foram submetidos debaixo da sessão corrente. Um processo pode estar em situação suspensa ou rodando. Os processos estão numerados conforme o número indicado na submissão em background. Estas informações estão armazenadas em uma tabela interna do processo shell e é perdida quando se termina a sessão e o processo. marcos@laureano:~$ ls -laR / >/dev/null 2>&1 & [1] 11218 marcos@laureano:~$ jobs [1]+ Running ls --color=auto -laR / > /dev/null 2>&1 & 7.11 Suspendendo processos Pode-se suspender a execução de um processo rodando em foreground através da digitação do caractere <CTRL> + <Z>. Ao se digitar o caractere o processo é interrompido e fica esperando um comando para que volte a rodar. Este processo fica no sistema ocupando os recursos, mas não utiliza a CPU da máquina. O processo suspenso pode ser cancelado, pode voltar a executar em foreground ou pode-se colocar o mesmo para rodar em background. marcos@laureano:~$ ls -laR / >result.txt 2>/dev/null [1]+ Stopped ls -laR / > result.txt 2> /dev/null marcos@laureano:~$ jobs [1]+ Stopped ls -laR / > result.txt 2> /dev/null 73 <-- PRESSIONADO <CTRL>+<Z> CAPÍTULO 7. GERÊNCIA DE PROCESSOS 7.11.1 Comandos bg e fg Para ativar um processo parado podemos usar os comandos internos bg ou fg, bastando fornecer o número do processo indicado pelo comando jobs ou alguma string de caracteres que identifique o processo. Com o comando interno bg esta se indicando que o processo deve voltar a executar em background. Exemplos: marcos@laureano:~$ jobs [1]+ Stopped ls --color=auto -la -R / > resultado.txt 2> /dev/null marcos@laureano:~$ bg %1 [1]+ ls --color=auto -la -R / > resultado.txt 2> /dev/null & marcos@laureano:~$ jobs [1]+ Running ls --color=auto -la -R / > resultado.txt 2> /dev/null & Podemos também chamar um processo que está suspenso ou rodando em background para que o mesmo volte a rodar em foreground. Usamos para isto o comando interno fg, fornecendo o número ou uma string obtido pelo comando interno jobs. Veja a sequência de execução: 1. Executando o comando em backgroud : marcos@laureano:~$ ls -la -R / >resultado.txt 2>/dev/null & [1] 11534 2. Verificando a sua situação: marcos@laureano:~$ jobs [1]+ Running ls -la -R / > resultado.txt 2> /dev/null & 3. Colocando o comando em execução em foregroud, logo em seguida é paralisado pelo comando <CTRL>+<Z>: marcos@laureano:~$ fg %1 ls -la -R / > resultado.txt 2> /dev/null [1]+ Stopped ls -la -R / > resultado.txt 2> /dev/null ls -la -R / > resultado.txt 2> /dev/null 4. Verificando a sua situação: marcos@laureano:~$ jobs [1]+ Stopped 5. Colocando o comando em execução em backgroud : 74 CAPÍTULO 7. GERÊNCIA DE PROCESSOS marcos@laureano:~$ bg %1 [1]+ ls -la -R / > resultado.txt 2> /dev/null & 7.12 Comando nohup Todos os processos que o usuário roda está ligado ao seu processo shell de sessão. O Unix/Linux possui a caracterı́stica de que se o processo principal termina, todos os seus filhos serão encerrados. Isto torna-se um problema quando temos que rodar um comando ou programa demorado e não podemos manter a sessão aberta. O comando nohup serve para desligar um processo do processo shell da sessão permitindo assim que se encerre a sessão sem prejuı́zo da execução do programa ou comando. Na prática, o comando informa ao sistema operacional que, se a sessão for encerrada (pai do processo), o processo filho seja entregue ao processo init da máquina (PPID 1). Exemplo: Deve-se sempre colocar o comando para rodar em background pois o nohup não faz isto automaticamente. marcos@laureano:~$ ls -laR / >res.txt 2>erro.txt & [1] 11922 marcos@laureano:~$ ps -l F S UID PID PPID C PRI 0 R 1000 11875 11198 0 80 0 S 1000 11922 11875 37 80 0 R 1000 11923 11875 0 80 NI 0 0 0 ADDR SZ - 5159 - 6767 - 1660 WCHAN - TTY pts/0 pts/0 pts/0 TIME 00:00:00 00:00:00 00:00:00 CMD bash ls ps Caso a sessão seja fechada e o processo seja verificado em outra sessão, será verificado que o PPID do comando está setado para 1. marcos@laureano:~$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 11809 11198 0 80 0 - 5184 wait pts/1 00:00:00 bash 0 S 1000 11922 1 37 80 0 - 6767 pts/0 00:00:00 ls 0 R 1000 11951 11809 0 80 0 - 1660 pts/1 00:00:00 ps 7.13 Comando kill Quando se quer matar um processo, seja em background seja em foreground (de outro terminal) devemos usar o comando kill. Deve-se fornecer para este comando o número do PID 75 CAPÍTULO 7. GERÊNCIA DE PROCESSOS do processo que se quer eliminar. Somente o proprietário do processo e o usuário root podem enviar sinais. Opcionalmente podemos estabelecer o tipo de sinal a ser mandado para o processo. Para isto basta se colocar o número ou mnemônico do mesmo. Caso não se coloque nenhum sinal, será enviado o sinal 15 (TERM) para o processo. Os sinais mais importantes são: • 15 (SIGTERM) - Interrupção amena do processo. Este sinal pode ser interceptado e ignorado pelo process; • 9 (SIGKILL) - Interrupção forçada do processo. Este sinal não pode ser interceptado e nem ignorado pelo processo; • 19 ou 24 (SIGSTOP) - Suspende a execução de um processo. Este sinal também não pode ser interceptado e ignorado; • 18 ou 26 (SIGCONT) - Ativa a execução de um processo suspenso. Os sinais SIGSTOP e SIGCONT podem ter números diferentes em cada sistema operacional, neste caso é melhor utilizar o menemônico em vez do número do sinal. Para visualizar todos os sinais aceitos pelo comando kill marcos@laureano:~$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX Para testar, crie o script abaixo: #/bin/bash trap "echo N~ ao vou terminar!!!" 15 76 CAPÍTULO 7. GERÊNCIA DE PROCESSOS while true do sleep 1 done Para testar, só utilizar a sequência abaixo: marcos@laureano:~$ chmod u+x tempo.sh marcos@laureano:~$ ./tempo.sh & [1] 12095 marcos@laureano:~$ kill -15 12095 marcos@laureano:~$ N~ ao vou terminar!!! marcos@laureano:~$ kill -9 12095 marcos@laureano:~$ [1]+ Finalizado ./tempo.sh 7.14 Os comandos at e batch O comando at permite agendar a execução de um comando para uma hora e data definida pelo usuário. Os resultados (via stdout) das execuções agendadas serão enviados ao usuário por e-mail. Vejamos um exemplo: ppgia:~> at 23:50 12/31/2009 at> echo "Feliz 2010 a todos" | mail [email protected] at> who at> ^D O comando batch permite agendar uma execução de comandos sem data marcada, assim que a carga do sistema o permitir. Da mesma forma que no comando at, eventuais resultados (stdout) das execuções são enviados ao usuário por e-mail. Verifique as páginas de manual dos comandos at e batch para maiores detalhes. 7.15 Agendando programas via crontab Enquanto o comando at permite agendar uma tarefa para uma determinada data, o sistema crontab permite o agendamento de tarefas repetitivas ao longo do dia, semana, mês ou ano. 77 CAPÍTULO 7. GERÊNCIA DE PROCESSOS Toda a informação sobre tarefas agendadas via crontab é mantida em um arquivo dentro do diretório /var/spool/cron, que não é diretamente acessı́vel. O acesso ao arquivo é feito pelo comando crontab: • crontab -e - editar o arquivo com as definições de tarefas • crontab -l - listar o conteúdo do arquivo atual • crontab -r - remover o arquivo. A estrutura do arquivo de crontab é relativamente complexa, mas permite muita flexibilidade. Vejamos um exemplo: # Usar o shell /bin/sh to run commands SHELL=/bin/csh # enviar stdout MAILTO=laureano # Explicaç~ ao do # minuto, hora, 5 0 * * * para laureano, mesmo sendo o crontab de outro usuario formato dia, m^ es, dia da semana, comando $HOME/bin/daily.job >>&! $HOME/tmp/out # Rodar às 14:15 todo inı́cio de m^ es 15 14 1 * * $HOME/bin/monthly.job # Rodar às 22:30 todos os dias úteis 30 22 * * 1-5 mail -s "S~ ao 22:30, vá para casa !" maziero < /dev/null # Outros exemplos 23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday" 5 4 * * sun echo "run at 04:05 every sunday" Para maiores informações podem ser obtidas através das páginas do manual on-line: man crontab para o comando e man 5 crontab para o arquivo de configuração. 78 8 Lista de exercı́cios - 2a. Lista A resolução dos exercı́cios faz parte da avaliação da disciplina. Para as respostas dos exercı́cios, basta colocar o comando utilizado e o retorno do comando (quando necessário interpretar o resultado). Para resolver vários exercı́cios será necessário utilizar pipes. 1. Monte uma linha de comandos usando pipes para identificar todos os usuários proprietários de arquivos ou diretórios a partir de /tmp, colocando o resultado no arquivo users-tmp.txt. Siga os seguintes passos: • Use o comando find para listar os proprietários de todos os arquivos dentro de /tmp (dica: use a opção -printf do comando find). • Ordene a listagem obtida, usando o comando sort • Remova as linhas repetidas, usando o comando uniq • Direcione a saı́da para o arquivo indicado users-tmp.txt. 2. Qual o comando para verificar quantos processos um usuário está executando ? 3. Qual o comando para verificar quem está rodando o bash no momento ? 4. Execute o seguinte comando ls -l -R / >/dev/null 2>&1 & em background. Qual mensagem recebida e o que significa a mesma ? Verifique com o comando ps -l o que está acontecendo. 5. Como fica-se sabendo que o comando em background terminou ? 6. Como é possı́vel se redirecionar a saı́da de dois comandos, agrupando os mesmos através do uso dos parênteses ? Utilize os comandos echo "Diretório home" e ls -l ~ para testar, gravando a saı́da dos mesmo em um arquivo chamado processos. 7. Submeta o comando ls -l -R / >/dev/null 2>&1 & em background e verifique o seu estado através do comando jobs. 8. Enquanto o comando acima ainda estiver rodando, tente sair da sessão com o comando exit. O que aconteceu e por que ? 9. Execute um novo exit, terminando a sessão. Abra outra sessão e veja se o comando aparece no comando jobs. Verifique também se o comando está na relação do comando ps -u <usuario>. Explique. 10. Execute o comando ls -l -R / >/dev/null 2>&1 & em background. Como seria possı́vel parar este processo por um tempo, sem cancela-lo. Qual seria o comando para voltar a executar o comando em background ? 79 CAPÍTULO 8. LISTA DE EXERCÍCIOS - 2A. LISTA 11. Como se faz para voltar a executar o comando parado acima em foreground ? 12. Rode o comando ls -l -R / >/dev/null 2>&1 & com o comando nohup. Saia da sessão, volte e verifique se o processo ainda está rodando. Utilizar o comando ps -lu <usuário> para isto. 13. É possı́vel voltar a rodar este processo em foreground novamente? 14. Execute o script tempo (material de aula) em background. Anote o PID deste processo. Suspenda a execução do mesmo usando o comando kill. Quais as duas formas do comando? 15. Ative o processo suspenso com o comando kill. Como fica o comando ? 16. Tente matar este processo usando o sinal 15 (TERM). Conseguiu ? 17. Mate o processo definitivamente com o comando kill. 18. Efetue uma conexão SSH (Secure Shell ) no servidor de especialização. Do lado do cliente e do servidor, identifique os processos envolvidos no estabelecimento da conexão SSH e como eles se relacionam. 19. Você é o administrador do sistema e precisa desconectar imediatamente todos os usuários contectados via ssh. Como você pode fazer isso em uma única linha de comando ? 20. Agende uma operação de limpeza (remoção dos arquivos *bak e *~) do seu diretório HOME para as 23:55, todas as segundas, quartas e sextas-feiras. 21. Em qual cenário é melhor suspender um processo em vez de abortá-lo ? 22. Conforme visto em aula, alguns dos aspectos de segurança de um sistema de arquivos é não possuir arquivos com SGID ou SUID, arquivos sem órfãos (sem usuário ou grupo associado) e arquivos/diretórios que qualquer usuário possa gravar. Crie um script para verificar todas estas situações (dica: utilize o comando find) e altere o crontab da máquina virtual para executar este script todos os sábados do mês. Anote os comandos utilizados e a configuração dos arquivos envolvidos. Para criar o script: • • • • • Crie um arquivo utilizando o seu editor de textos preferido. A primeira linha do script deverá ser #/bin/bash. Em cada linha coloque um comando find. Salve o arquivo e atribua o direito de execução ao arquivo. Exemplo: #/bin/bash echo "Oi, este é um script de exemplo" echo "Procurando todos os arquivos .c e fazendo a cópia" find / -name "*.c" -exec cp {} /bkp \; 23. Utilizando os comandos grep, sort e cut mostre todos os alunos ligados, em ordem alfabética, ao grupo de especialização rss08a. Estas informações podem ser obtidas no arquivo /etc/passwd. 80 9 Administração de Usuários O Unix e o Linux são sistemas operacionais multiusuários, portanto é necessário que todos os usuários sejam cadastrados e tenham permissões de acesso diferenciadas. É possı́vel também cadastra-los em grupos para facilitar o gerenciamento. A criação e administração de contas de usuários no sistema são exclusive do superusuário (root). É uma tarefa que demanda responsabilidade e deve ser acompanhada com muita atenção. 9.1 Verificando informações do usuário Todo usuário possui um número chamado user ID com o qual o sistema Unix/Linux identificao no sistema. Além do user ID, os usuários possuem o group ID. Toda vez que um processo for ativado será atribuı́do ao processo um User ID e um Group ID. Estes ID’s são chamados de identificação efetiva do processo. Sintaxe: id [ opç~ oes ][ nome ] Exemplos de uso: • Sem parâmetros, pegando as informações do usuário atual. marcos@laureano:~$ id uid=1000(marcos) gid=1000(marcos) grupos=4(adm),20(dialout),24(cdrom),25(floppy),29 • Sem parâmetros, pegando as informações do usuário bin. marcos@laureano:~$ id bin uid=2(bin) gid=2(bin) grupos=2(bin) • Pegando somente o user id do usuário atual. marcos@laureano:~$ id -u 1000 9.2 Tornando-se outro usuário - Comando su Permite o usuário mudar sua identidade para outro usuário sem fazer o logout. Útil para executar um programa ou comando como superusuário sem ter que abandonar a seção atual. 81 CAPÍTULO 9. ADMINISTRAÇÃO DE USUÁRIOS Sintaxe: su [-] [usuário] Onde: • - quando informado, indica para iniciar as configurações do usuário que se está acessando. • usuário é o nome do usuário que deseja usar para acessar o sistema. Se não digitado, é assumido o usuário root. Será pedida a senha do superusuário para autenticação. Digite exit quando desejar retornar a identificação de usuário anterior. Exemplos de uso: • Acessando o usuário root sem carregar suas configurações marcos@laureano:~$ id uid=1000(marcos) gid=1000(marcos) grupos=4(adm),20(dialout),24(cdrom),25(floppy),29 marcos@laureano:~$ su Senha: root@laureano:/home/marcos# id uid=0(root) gid=0(root) grupos=0(root) root@laureano:/home/marcos# pwd /home/marcos root@laureano:/home/marcos# exit exit • Acessando o usuário root carregando suas configurações marcos@laureano:~$ su Senha: root@laureano:~# id uid=0(root) gid=0(root) grupos=0(root) root@laureano:~# pwd /root 9.3 O comando sudo O comando sudo oferece outra abordagem para permitir que usuários tenham acesso administrativo. Quando um usuário confiável precede um comando administrativo com sudo, o sistema pede que o usuário entre a sua própria senha. Então, após a autenticação, e assumindo que seja permitido, o comando administrativo é executado como se o usuário fosse o root. Sintaxe: sudo <comando> 82 CAPÍTULO 9. ADMINISTRAÇÃO DE USUÁRIOS No exemplo acima, <comando> seria substituı́do por um comando normalmente reservado apenas ao usuário root, como, por exemplo, mount. Importante: Usuários do comando sudo devem tomar cuidado extra para fazer o logout antes de deixarem suas máquinas, já que é possı́vel usar o comando novamente sem precisar indicar a senha, por um perı́odo de cinco minutos. Esta configuração pode ser alterada através do arquivo de configuração /etc/sudoers. Somente os usuários listados no arquivo de configuração /etc/sudoers podem usar o comando sudo e o comando é executado no shell do usuário, e não em um shell do root. Cada autenticação bem-sucedida é registrada no arquivo /var/log/messages e os comandos submetidos são registrados com o nome do usuário no arquivo /var/log/secure. Outra vantagem do comando sudo é que um administrador pode permitir que usuários acessem diferentes comandos especı́ficos de acordo com suas necessidades. Administradores que queiram editar o arquivo de configuração do sudo, o /etc/sudoers, devem usar o comando visudo. Digite visudo e adicione uma linha similar na seguinte na seção de especificação de privilégios do usuário: marcos ALL=(ALL) ALL Este exemplo estabelece que o usuário marcos pode usar o sudo em qualquer máquina e executar qualquer comando. O exemplo abaixo ilustra a granularidade possı́vel ao configurar o sudo: %users localhost=/sbin/shutdown -h now Este exemplo estabelece que qualquer usuário /sbin/shutdown -h now desde que o faça pelo console. pode submeter o comando A página man do sudoers tem uma lista detalhada das opções para este arquivo. 9.4 Arquivo passwd e group O arquivo /etc/passwd é o banco de dados de usuários que podem logar no sistema. Tem um formato de vários campos, separados pelo caracter : (dois pontos) e sempre na mesma ordem: • nome de login do usuário • senha (criptografada, evidentemente) 83 CAPÍTULO 9. ADMINISTRAÇÃO DE USUÁRIOS • id do usuário (identificação única, semelhante a um número de carteira de identidade) • grupo primário deste usuário (o usuário poderá participar de vários grupos) • nome completo (nome normal, sem ser de login) • diretório home deste usuário • shell inicial Um exemplo mostra melhor como são estes valores na prática: marcos:x:1000:1000:Marcos Laureano,,,:/home/marcos:/bin/bash Quando estamos utilizando shadow password (um pacote que evita o acesso de hackers ao conteúdo das senhas, mesmo criptografadas, para dificultar a tentativa de quebra de senha), o segundo campo é substituido por um * e a senha é armazenada em outro arquivo (/etc/shadow), normalmente inacessı́vel. O arquivo /etc/group define os grupos aos quais os usuários pertencem. Seu conteúdo são linhas da forma: group_name:passwd:GID:user_list onde group_name é o nome do grupo. Um usuário pode pertencer a qualquer número de grupos, e herdará todas as permissões de acesso a arquivos desses grupos. Opcionalmente um grupo pode ter uma senha (campo passwd). O GID (group id ) é um código, como o user id (no arquivo /etc/passwd), mas relativo ao grupo. Finalmente, user list é a lista (separada por vı́rgulas) de todos os usuários que pertencem a este grupo. 9.5 Adicionando grupos - comando groupadd Para facilitar a administração do sistema, pode-se usar o conceito de grupos de usuários com perfis semelhantes. Por exemplo, definir grupos conforme os departamentos de uma empresa. Sintaxe: groupadd [ opç~ oes ] grupo Este comando irá alterar os arquivos: • /etc/group - informações de grupos. • /etc/gshadow- informações de grupos armazenadas de forma segura (senhas de grupo). Exemplos de utilização: • Criando o grupo vendas marcos@laureano:~$ sudo groupadd vendas marcos@laureano:~$ tail -4 /etc/group polkituser:x:126: 84 CAPÍTULO 9. ADMINISTRAÇÃO DE USUÁRIOS web200801:x:1001: bsi200801:x:1002: vendas:x:1003: • Criando o grupos alunos com GID 2424 marcos@laureano:~$ sudo groupadd -g 2424 alunos marcos@laureano:~$ tail -4 /etc/group web200801:x:1001: bsi200801:x:1002: vendas:x:1003: alunos:x:2424: • Criando o grupo teste sem informar o GID (observe que o sistema pega o último GID utilizado e soma 1) marcos@laureano:~$ sudo groupadd teste marcos@laureano:~$ tail -4 /etc/group bsi200801:x:1002: vendas:x:1003: alunos:x:2424: teste:x:2425: 9.6 Eliminando grupos - Comando groupdel O comando groupdel permite que se eliminem grupos do sistema. Somente o superusuário poderá utilizar este comando. Sintaxe: groupdel grupo Exemplo de utilização: marcos@laureano:~$ sudo groupdel alunos marcos@laureano:~$ sudo groupdel vendas marcos@laureano:~$ sudo groupdel teste marcos@laureano:~$ tail -4 /etc/group mlocate:x:125: polkituser:x:126: web200801:x:1001: bsi200801:x:1002: 85 CAPÍTULO 9. ADMINISTRAÇÃO DE USUÁRIOS Atenção: Ao eliminar um grupo do sistema, se existir algum usuário ligado a este grupo, ele ficará órfão. 9.7 Adicionando usuários - Comando useradd O comando useradd permite que se criem usuários conforme especificado em opções. Somente o superusuário poderá utilizar este comando. Sintaxe: useradd [ opç~ oes ] usuário Este comando irá alterar os arquivos: • /etc/passwd - informações de contas de usuários e senhas criptografadas; • /etc/shadow - informações de contas de usuários e senhas criptografadas; • /etc/group - informações de grupos. Exemplos de utilização: • Cria o usuário mlaureano (como não foi informado grupo, é criado um grupo com o mesmo nome de usuário). O diretório home não foi criado. marcos@laureano:~$ sudo useradd mlaureano marcos@laureano:~$ id mlaureano uid=1035(mlaureano) gid=1035(mlaureano) grupos=1035(mlaureano) marcos@laureano:~$ tail -3 /etc/passwd e1000801684:x:1032:1001:WILLIAN RODRIGUEZ :/home/web200801/e1000801684:/bin/mbash e1000500643:x:1033:1002:BRUNO SANTOS:/home/bsi200801/e1000500643:/bin/bash e1000500502:x:1034:1002:PAULO VICTOR:/home/bsi200801/e100500502:/bin/bash mlaureano:x:1035:1035::/home/mlaureano:/bin/sh • Cria o usuário jmedeiros e designa o diretório /home/jmedeiros como o diretório pessoal deste. marcos@laureano:~$ sudo useradd -d /home/jmedeiros jmedeiros marcos@laureano:~$ id jmedeiros uid=1036(jmedeiros) gid=1036(jmedeiros) grupos=1036(jmedeiros) marcos@laureano:~$ tail -4 /etc/passwd e1000500643:x:1033:1002:BRUNO SANTOS:/home/bsi200801/e1000500643:/bin/bash e1000500502:x:1034:1002:PAULO VICTOR:/home/bsi200801/e100500502:/bin/bash mlaureano:x:1035:1035::/home/mlaureano:/bin/sh jmedeiros:x:1036:1036::/home/jmedeiros:/bin/sh 86 CAPÍTULO 9. ADMINISTRAÇÃO DE USUÁRIOS • Cria o usuário luiz com o shell bash. marcos@laureano:~$ sudo useradd -s /bin/bash luiz marcos@laureano:~$ id luiz uid=1037(luiz) gid=1037(luiz) grupos=1037(luiz) marcos@laureano:~$ tail -4 /etc/passwd e1000500502:x:1034:1002:PAULO VICTOR:/home/bsi200801/e100500502:/bin/bash mlaureano:x:1035:1035::/home/mlaureano:/bin/sh jmedeiros:x:1036:1036::/home/jmedeiros:/bin/sh luiz:x:1037:1037::/home/luiz:/bin/bash • Cria o usuário rosa com o grupo root marcos@laureano:~$ sudo useradd -g root rosa marcos@laureano:~$ id rosa uid=1038(rosa) gid=0(root) grupos=0(root) marcos@laureano:~$ tail -4 /etc/passwd mlaureano:x:1035:1035::/home/mlaureano:/bin/sh jmedeiros:x:1036:1036::/home/jmedeiros:/bin/sh luiz:x:1037:1037::/home/luiz:/bin/bash rosa:x:1038:0::/home/rosa:/bin/sh • Cria o usuário luizotavio com várias informações marcos@laureano:~$ sudo useradd -d /home/luizotavio -g users -c "Luiz Otávio Laurea marcos@laureano:~$ id luizotavio uid=1039(luizotavio) gid=100(users) grupos=100(users) marcos@laureano:~$ tail -4 /etc/passwd jmedeiros:x:1036:1036::/home/jmedeiros:/bin/sh luiz:x:1037:1037::/home/luiz:/bin/bash rosa:x:1038:0::/home/rosa:/bin/sh luizotavio:x:1039:100:Luiz Otávio Laureano:/home/luizotavio:/bin/sh Utilize o manual on-line (man) para ver outras opções de utilização do comando useradd. 87 CAPÍTULO 9. ADMINISTRAÇÃO DE USUÁRIOS 9.8 Alterando a senha do usuário - comando passwd O comando passwd permite que se troque a senha de determinado usuário. O superusuário pode trocar a senha de qualquer outro. O usuário comum, porém, pode trocar somente a sua senha. As senhas são armazenadas no arquivo /etc/passwd ou /etc/shadow. No arquivo /etc/passwd também é armazenado as informações relativas aos usuários. Após a criação do usuário será necessário criar uma senha para este, caso contrário, não será permitido que este usuário faça login no sistema. Sintaxe: passwd [usuário] 9.9 Eliminando usuários - Comando userdel O comando userdel permite que se eliminem usuários do sistema. Somente o superusuário poderá utilizar este comando. Sintaxe: userdel [opç~ oes] usuário Exemplos de utilização: • Eliminando o usuário luizotavio. O diretório home não é eliminado. marcos@laureano:/home$ ls -l total 24 drwxr-xr-x 4 root bsi200801 4096 2008-05-15 drwxr-xr-x 2 luizotavio users 4096 2008-05-19 drwxr-xr-x 65 marcos marcos 12288 2008-05-19 drwxr-xr-x 34 root web200801 4096 2008-05-14 marcos@laureano:/home$ sudo userdel luizotavio marcos@laureano:/home$ ls -l total 24 drwxr-xr-x 4 root bsi200801 4096 2008-05-15 drwxr-xr-x 2 1039 users 4096 2008-05-19 drwxr-xr-x 65 marcos marcos 12288 2008-05-19 drwxr-xr-x 34 root web200801 4096 2008-05-14 20:19 15:22 15:10 20:06 20:19 15:22 15:10 20:06 bsi200801 luizotavio marcos web200801 bsi200801 luizotavio marcos web200801 • Eliminando o usuário luizotavio. O diretório home é eliminado. marcos@laureano:/home$ ls -l total 24 drwxr-xr-x 4 root bsi200801 4096 2008-05-15 drwxr-xr-x 2 luizotavio users 4096 2008-05-19 drwxr-xr-x 65 marcos marcos 12288 2008-05-19 drwxr-xr-x 34 root web200801 4096 2008-05-14 88 20:19 15:22 15:10 20:06 bsi200801 luizotavio marcos web200801 CAPÍTULO 9. ADMINISTRAÇÃO DE USUÁRIOS marcos@laureano:/home$ sudo userdel -r luizotavio marcos@laureano:/home$ ls -l total 20 drwxr-xr-x 4 root bsi200801 4096 2008-05-15 20:19 bsi200801 drwxr-xr-x 65 marcos marcos 12288 2008-05-19 15:10 marcos drwxr-xr-x 34 root web200801 4096 2008-05-14 20:06 web200801 Atenção: Ao eliminar um usuário do sistema, verifique se em seu diretório home não existem arquivos importantes para a empresa, na dúvida, elimine o usuário do sistema, mas mantenha o seu diretório home e peça para alguém analisar o conteúdo do mesmo. Assim que tiver eliminado um usuário, talvez seja interessante verificar se o UID antigo do usuário não tem propriedade sobre outros arquivos no sistema. Para localizar os caminhos de arquivos órfãos, pode-se usar o comando find com o argumento -nouser. 9.10 Modificando o perfil de um usuário - comando usermod Este comando tem a mesma sintaxe e os mesmos parâmetros (existem algumas opções a mais) do comando useradd, a diferença é que ele modifica ou adiciona informações relativas a um usuário já cadastrado. Sintaxe: usermod [ opç~ oes ] usuário Exemplo de utilização: marcos@laureano:/home$ ls -l total 24 drwxr-xr-x 4 root bsi200801 4096 2008-05-15 20:19 drwxr-xr-x 65 marcos marcos 12288 2008-05-19 15:10 drwxr-xr-x 2 rosa root 4096 2008-05-19 15:30 drwxr-xr-x 34 root web200801 4096 2008-05-14 20:06 bsi200801 marcos rosa web200801 marcos@laureano:/home$ tail -2 /etc/passwd luiz:x:1037:1037::/home/luiz:/bin/bash rosa:x:1038:0::/home/rosa:/bin/sh marcos@laureano:/home$ sudo usermod -s /bin/bash -d /home/bsi200801/rosa -m rosa marcos@laureano:/home$ tail -2 /etc/passwd luiz:x:1037:1037::/home/luiz:/bin/bash rosa:x:1038:0::/home/bsi200801/rosa:/bin/bash 89 CAPÍTULO 9. ADMINISTRAÇÃO DE USUÁRIOS marcos@laureano:/home$ ls -l total 20 drwxr-xr-x 5 root bsi200801 4096 2008-05-19 15:31 bsi200801 drwxr-xr-x 65 marcos marcos 12288 2008-05-19 15:10 marcos drwxr-xr-x 34 root web200801 4096 2008-05-14 20:06 web200801 marcos@laureano:/home$ cd bsi200801/ marcos@laureano:/home/bsi200801$ ls -l total 12 drwxr-xr-x 4 e1000500643 bsi200801 4096 2008-05-15 21:40 e1000500643 drwxr-xr-x 2 e1000500502 bsi200801 4096 2008-05-15 21:03 e100500502 drwxr-xr-x 2 rosa root 4096 2008-05-19 15:30 rosa marcos@laureano:/home/bsi200801$ Atenção: Ao modificar o diretório home de um usuário do sistema, utilize sempre a opção -m para mover o diretório anterior para o novo diretório especificado. Utilize o manual on-line (man) para ver outras opções de utilização do comando usermod. 9.11 Exemplo Script automático Abaixo o script que foi utilizado para criar as contas dos alunos de especialização, considerando que o arquivo alunos.txt tem o formato: matricula - nome Onde: • matricula - número de 8 • nome - Nome completo O script aluno.sh realiza a leitura da matricula e do nome, cria uma senha padrão utilizando o comando mkpasswd, seta a quota do usuário (comando edquota) e já define a data de validade da conta (comando chage). IFS=" - " while read MATRICULA ALUNO do eUSER="e$MATRICULA" ePWD="p$MATRICULA" ePWD=$(mkpasswd -Hmd5 $ePWD) 90 CAPÍTULO 9. ADMINISTRAÇÃO DE USUÁRIOS echo "/usr/sbin/useradd -g rss08a -c ’$ALUNO’ -s /bin/bash -p ’$ePWD’ -m -d /home/esp echo "/usr/sbin/edquota -p aluno_referencia $eUSER" echo "/usr/bin/chage -E ’2009-12-31’ $eUSER" done < alunos.txt 9.12 Atividades sugeridas 1. Informe os comandos e anotem o conteúdo dos arquivos /etc/group e do /etc/passwd após cada passo (utilize o comando tail para visualizar o final do arquivo) e o resultado do comando id. • • • • • Adicionar o usuário aluno01 com ID 600; Modificar o shell para o /bin/sh; Acrescentar o comentário Conta de teste do aluno; Criar o grupo alunos; Ligar o usuário aluno01 ao grupo alunos. 9.13 Controle de quotas O sistema de cotas do Linux permite especificar limites em dois aspectos de armazenamento de disco: O número de inodes (ou arquivos) que um usuário pode possuir e/ou o número de blocos de disco que podem ser alocados a um usuário. O conceito do sistema de cotas é que os usuários são forçados a ficar dentro do limite de utilização do disco na maior parte do tempo. 9.13.1 Configuração de cotas para usuários Esta operação é executada com o comando edquota. Por exemplo, o comando edquota laureano o levará ao vi permitindo a edição de cotas para o usuário laureano. Exemplo: laureano:~> sudo /usr/sbin/edquota laureano Disk quotas for user laureano (uid 1094): Filesystem blocks /dev/sda1 152 /dev/sdb2 1213176 91 soft 0 0 hard 0 0 inodes 22 5526 soft 0 0 hard 0 0 CAPÍTULO 9. ADMINISTRAÇÃO DE USUÁRIOS • blocks - é o número total de blocos que um usuário está utilizando em uma partição. • Inodes - é o número total de arquivos que um usuário está usando numa partição. Os campos que o administrador deverá alterar neste arquivo são: soft e hard. Este campos indicam os limites do usuário. • soft indica a quantidade máxima de espaço em disco que um usuário pode usar numa determinada partição antes de ser alertado que execedeu o seu limite. • hard especifica o limite absoluto de uso do disco do usuário. É possı́vel definir por quanto tempo o usuário pode permanecer entre os limites (hard e soft). Este perı́odo de tolerância é chamado de grace period. O grace period é definido com o comando edquota -t. Este perı́odo pode ser definido em sec (segundos), min (minutos), hour (horas), day (dias), week (semanas), e month (meses), e é definido por sistema de arquivos, e não por usuários ou grupos. Exemplo: laureano:~> sudo /usr/sbin/edquota -t Grace period before enforcing soft limits for users: Time units may be: days, hours, minutes, or seconds Filesystem Block grace period Inode grace period /dev/sda1 7days 7days /dev/sdb2 7days 7days E por fim, o comando repquota exibe um sumário do sistema de cotas. Exemplo: laureano:~> sudo /usr/sbin/repquota /dev/sdb2 *** Report for user quotas on device /dev/sdb2 Block grace time: 7days; Inode grace time: 7days Block limits File limits User used soft hard grace used soft hard grace ---------------------------------------------------------------------root -- 6311852 0 0 63423 0 0 daemon -52 0 0 9 0 0 lp -16 0 0 2 0 0 games -212 0 0 27 0 0 rpm -- 253856 0 0 34 0 0 avahi -32 0 0 6 0 0 apache -232 0 0 37 0 0 ntp -16 0 0 2 0 0 mysql -956 0 0 62 0 0 92 CAPÍTULO 9. ADMINISTRAÇÃO DE USUÁRIOS hsqldb -8 0 0 gdm -352 0 0 beaglidx -80 0 0 tomcat -792 0 0 maziero -0 0 0 alcides -- 725316 0 0 jamhour -- 123752 0 0 teigao -- 3662744 4000000 5000000 pedroso -- 3831500 0 0 laureano -- 1213176 0 0 santin -- 412176 0 0 <resultado suprimido> 1 0 0 18 0 0 10 0 0 101 0 0 667 0 0 3186 0 0 5 0 0 3152 40000 50000 19574 0 0 5526 0 0 6270 0 0 9.14 Configuração do BASH-shell Ao ser lançado, o shell lê arquivos de configuração que contém comandos para definir o ambiente de trabalho de cada usuário. A sintaxe dos arquivos de configuração é bastante simples, similar à das linhas de comando. O BASH-Shell lê os arquivos de configuração, caso existam, na seqüência apresentada a seguir: • /etc/bash.bashrc - lido pelo shell durante seu lançamento, contém configurações comuns a todos os usuários. • ~/.bashrc - configurações locais de cada usuário (arquivo armazendo no diretório home de cada usuário), lidas por todos os shells (configurada através da variável do ENV). • ~/.bash_profile - ações especı́ficas ao usuário, a executar no momento do login. Este arquivo também fica no diretório home de cada usuário. Para criar variáveis e aliases permanentes, ou para executar comandos ao iniciar o shell, basta inserir os comandos correspondentes no arquivo desejado. Por exemplo, se inserirmos o comando: alias ola=’echo "ola $LOGNAME, como vai voce"’ No arquivo ~/.bashrc, no próximo lançamento de shell ele será lido e fará parte dos comandos disponı́veis ao usuário. 93 10 Lista de exercı́cios - 3a. Lista 1. Crie os grupos aluno mesa01, aluno mesa02, aluno mesa03. 2. Crie os usuários aluno 01 e aluno 02 com o grupo aluno mesa01. 3. Crie os usuários aluno 03 e aluno 04 com o grupo aluno mesa02. 4. Crie os usuários aluno 05 e aluno 06 com o grupo aluno mesa03. 5. Crie o grupo alunos geral. 6. Ligue todos os alunos 0X ao grupo alunos geral. 7. Crie o usuário admina. 8. Ligue o usuário admina com os grupos aluno mesa01, aluno mesa02, aluno mesa03, root e alunos geral. 9. Mude o shell dos usuários ligado aos grupos aluno mesa01 e aluno mesa03 para /bin/sh 10. Acrescente no campo comentários de todos os alunos o nome do aluno e o grupo a que pertecem. Por exemplo: ”aluno 01 - aluno mesa01”. 11. O usuário admina consegue montar um sistema de arquivos ? 12. Veja o comando newgrp, mude o grupo do usuário admina na sessão atual. 13. Qual o comando para verificar em todo o sistema se existe arquivos orfãos de usuário ? 14. Qual o comando para verificar em todo o sistema se existe arquivos orfãos de grupo ? 15. Utilize o seu editor de textos preferidos (exemplo: vi) e modifique o arquivo /etc/group modificando os grupos aluno mesa01 para aluno mesa1. 16. Na relação do comando ls -l, o grupo dos arquivos pertecentes aos usuários aluno 01 e aluno 02 foram modificados também ? Explique. 94 11 Programação Shell 11.1 Variáveis O shell permite a criação de variáveis para armazenar valores durante uma sessão de trabalho ou em scripts. Existem dois tipos de variáveis: locais e exportáveis ou variáveis de ambiente. As variáveis exportáveis ou de ambiente: são acessı́veis a todos os comandos lançados pelo shell (são passadas a todos os processos filhos do shell ). Normalmente são escritas em letras maiúsculas. Para criar uma variável de ambienta basta fazer export var=valor, repare que não pode existir espaços em brancos entre o nome da variável, o sinal de atribuição (=) e o conteúdo da variável. Para destruir uma variável basta utilizar o comando unset. Exemplo: export GRASPHOME=/usr/local/grasp echo $GRASPHOME unset GRASPHOME Para acessar o conteúdo de uma variável basta utilizar o caracter $ antes do nome da variável. Um outro exemplo de utilização: export GRASPHOME=/usr/local/grasp echo ${GRASPHOME} unset GRASPHOME Torne por hábito utilizar este último formato, ou seja, o nome da variável sempre entre { } Algumas variáveis de ambiente exportáveis têm valor pré-definido pelo shell, e são importantes para o funcionamento normal da sessão de trabalho. Vejamos as principais (a lista de variáveis exportáveis pode ser consultada através do comando env): • PATH : define os diretórios onde podem ser encontrados programas executáveis. • MANPATH : define os diretórios contendo páginas de manual. 95 CAPÍTULO 11. PROGRAMAÇÃO SHELL • USER : nome de login do usuário da sessão. • HOME : diretório home do usuário. • HOST : nome do host (máquina). • SHELL : shell ativo. • TERM : tipo de terminal. • MAIL: localização da caixa de correio do usuário no sistema local. As variáveis locais são acessı́veis somente dentro do shell onde foram criadas. Para criar uma variável local basta fazer var=valor, repare que não pode existir espaços em brancos entre o nome da variável, o sinal de atribuição (=) e o conteúdo da variável. Para destruir uma variável basta utilizar o comando unset. nome=joao echo $nome touch $nome.txt unset nome nomes = (joao maria pedro antonio) echo $nomes echo ${nomes[2]} mkdir ${nomes[3]} unset nomes As variáveis locais podem armazenar listas de valores, úteis sobretudo na construção de scripts. A forma de definição e uso de variáveis contendo listas segue a seguinte sintaxe: • $nome : o conteúdo da variável nome • ${nome[x]} : o conteúdo da variável, na posição x • ${#nome[@]} : o número de posições da variável • ${#nome} : o número de caracteres da variável Vejamos alguns exemplos: 96 CAPÍTULO 11. PROGRAMAÇÃO SHELL ppgia:~> nome=( joao maria pedro antonio luis ) ppgia:~> echo $nome joao ppgia:~> echo ${nome[3]} antonio ppgia:~> echo ${#nome[@]} 5 ppgia:~> echo ${#nome} 4 11.2 Estrutura geral de um script em BASH-Shell Os arquivos de script permitem construir esquemas de execução complexos a partir dos comandos básicos do shell. A forma mais elementar de arquivo de script é apenas um conjunto de comandos em um arquivo texto, com permissões de execução habilitadas. O arquivo backup, cujo conteúdo é mostrado a seguir, é um exemplo de script: Script 11.1: Script Backup 1 echo "Iniciando backup..." # montar o diretório do servidor de backup mount backserver.ppgia.pucpr.br:/backup /backup 6 # efetuar o backup em um arquivo tar compactado tar czf /backup/home.tar.gz /home # desmontar o diretório do servidor de backup 11 umount /backup echo "Backup concluido !" Quando o script backup for executado, os comandos do arquivo serão executados em seqüência pelo shell corrente (de onde ele foi lançado). Assim, se o usuário estiver usando o shell bash, os comandos do script serão executados por esse shell. Como isso poderia gerar problemas em scripts usados por vários usuários, é possı́vel forçar a execução do script com um shell especı́fico (ou outro programa que interprete os comandos do arquivo). Para isso é necessário informar ao sistema operacional o programa a ser usado, na primeira linha do arquivo do script: Script 11.2: Script Backup modificado 97 CAPÍTULO 11. PROGRAMAÇÃO SHELL 2 7 #!/bin/bash −−noprofile # A opção −−noprofile inibe a leitura dos arquivos de inicialização # do shell, tornando o lançamento do script muito mais rápido. # comandos de um script em Bash−Shell server=backserver.ppgia.pucpr.br backdir=/backup ... exit 0 Com isso, será lançado um shell bash separado, somente para interpretar as instruções do script. O shell será terminado pelo comando exit, cujo parâmetro é devolvido ao shell inicial através da variável $?. Esse procedimento pode ser usado para lançar scripts para outros shells, ou mesmo outros programas, como perl, awk, sed, etc. 11.3 Parâmetros de entrada Os argumentos da linha de comando são passados para o shell através da variável local $argv. Os campos individuais dessa variável podem ser acessados como em uma variável local qualquer. Além disso, uma série de atalhos é definida para facilitar o acesso a esses parâmetros: • $0 : o nome do script; • $n : o n-ésimo argumento; • $* : todos os argumentos; • $# : quantidade de argumentos; • $? : status do último comando executado (0 = verdadeiro e 1 = falso); • $$ : número de processo (PID) do shell que executa o script. Vejamos um exemplo através do script listaparams: Script 11.3: Script listaparams #!/bin/bash # exemplo de uso dos parâmetros de entrada 4 echo echo echo echo echo "Nome do script : $0" "Primeiro par^ ametro : $1" "Todos os par^ ametros : $*" "Numero de parametros : $#" "Numero deste processo : $$" 9 exit 0 98 CAPÍTULO 11. PROGRAMAÇÃO SHELL Chamando o script acima com alguns parâmetros obtemos a seguinte resposta: ppgia:~> listaparams banana tomate pessego melao pera uva Nome do script : listaparams Primeiro par^ ametro : banana Todos os par^ ametros : banana tomate pessego melao pera uva Numero de parametros : 6 Numero deste processo : 2215 11.4 Controle de fluxo Existem diversos construtores de controle de fluxo que podem ser usados em scripts shell. Os principais são: • if-then: #!/bin/bash read -p "Digite algo:" VALOR if [ "$VALOR" == "xpto" ] then echo "Voce digitou xpto". fi exit 0 • if-then-else: #!/bin/bash read -p "Digite algo:" VALOR if [ "$VALOR" == "xpto" ] then echo "Voce digitou xpto". else echo "Voce nao digitou xpto". fi exit 0 • if-then-elif-else: 99 CAPÍTULO 11. PROGRAMAÇÃO SHELL #!/bin/bash read -p "Digite algo:" VALOR if [ "$VALOR" == "xpto" ] then echo "Voce digitou xpto." elif [ "$VALOR" == "xptu" ] then echo "Voce digitou xptu." else echo "Voce digitou $VALOR." fi exit 0 • for loop : #!/bin/bash for ARQUIVO in ‘ls /tmp/*.~*‘ do rm -i $ARQUIVO done exit 0 • while loop: #!/bin/bash i=1 while [ $i -le 10 ] do echo $i i=$((i+1)) done IFS=":" while read pLOGIN pPWD pID pUID pNAME pHOME pSHELL do echo "$pLOGIN - $pNAME - $pSHELL" done < /etc/passwd • case #!/bin/bash 100 CAPÍTULO 11. PROGRAMAÇÃO SHELL read -p "Entre com um nome:" NOME case $NOME in JOAO|MARIA) echo "Joao e maria";; #atencao para os 2 pontos-e-virgula M*) echo "O nome comeca com a letra M";; *) echo "O nome foi $NOME";; esac • select #!/bin/bash PS3="Arquivo a ser deletado:" select ARQUIVO in * SAIR do if [ "$ARQUIVO" == "SAIR" ] then break fi rm -i $ARQUIVO done Além das estruturas acima, algumas outras podem ser usadas para executar comandos em situações especı́ficas: • ‘comando‘: substitui a expressão entre crases pelo resultado (stdout) da execução do comando. Por exemplo, a linha de comando abaixo coloca na variável arqs os nomes de arquivos retornados pelo comando find: arqs=‘find /etc -iname ’???’‘ Uma forma similar e mais eficiente: arqs=$(find /etc -iname ’???’) • comando1; comando2; comando3: executa seqüencialmente os comandos indicados: cp *.c /tmp ; rm *.txt ; ls -l 101 CAPÍTULO 11. PROGRAMAÇÃO SHELL • ( comando ): executa o comando entre parênteses em um sub-shell (lança um shell separado e passa o comando como parâmetro). Por exemplo: ( ls -l > stdout.txt ) 2> stderr.txt O exemplo acima é bastante usado para separar as saı́das stderr e stdout nos shells da famı́lia bash. 11.4.1 Outros Exemplos Exemplo utilizando select e case: #!/bin/bash PS3="Please enter a number " select i in fo* do case $i in food|fool|foot) echo "good choice" break;; for|foxy) echo ’poor choice’ echo ’Invalid number’ break;; *) echo try again;; esac done Exemplo testando o retorno de um comando: #!/bin/bash ls /etc/passwd >/dev/null 2>&1 if [ $? ] then echo "Existe o arquivo" else echo "Arquivo nao existe!!!" fi Exemplo utilizando o for: 102 CAPÍTULO 11. PROGRAMAÇÃO SHELL for arq in /etc/passwd /etc/hosts /etc/groups do cat $arq done 11.5 Operadores lógicos e aritméticos Para implementar as estruturas de controle de fluxo é necessário definir condições, que podem ser feitas através de testes. Podemos efetuar comparações entre expressões (deve-se utilizar [ ] ou o comando test no if/while/etc) através dos seguintes operadores: • Comparações entre números: – – – – – – -eq -ge -gt -le -lt -ne igual a maior ou igual maior que menor ou igual menor que diferente (não igual) • Comparações entre strings: – – – – == igual a != diferente (não igual) < maior > menor if [[ "xpto" < "xpti" ]] then echo "oi" else echo "ola" fi • Conectivos lógicos (and, or): – -a e lógico – -o ou lógico • Operadores aritméticos: + - * / % Para realizar uma operação matemática, var=$((var1 express~ ao var2)) é melhor utilizar a seguinte notação Vejamos alguns exemplos de expressões usando os operadores acima definidos: 103 CAPÍTULO 11. PROGRAMAÇÃO SHELL # se o usuário logado for o root if [ "$LOGNAME" == "root" ] then ... fi #enquanto n~ ao esgotar toda a lista de par^ ametros while test "$1" != "" do echo "Par^ ametro $1" shift #desloca par^ ametros done #verificando quantos par^ ametros foram passados if [ $# -le 3 ] then echo "Número insuficiente de par^ ametros de entrada" fi #contagem simples CONTADOR=1 while [ $CONTADOR -le 10 ] do echo "Número $CONTADOR" CONTADOR=$((CONTADOR+2)) done #alternativa para limitar a quantidade de usuários conectados if [ ‘who | wc -l‘ -ge $maxusers ] then echo "Login negado, pois há mais de $maxusers usuários conectados." logout else ... fi 11.6 Operadores de teste em arquivos e strings Os operadores de teste em arquivos e strings permitem verificar propriedades de entradas no sistema de arquivos. Eles são usados na forma -op, onde op corresponde ao teste desejado. Os principais testes são: 104 CAPÍTULO 11. PROGRAMAÇÃO SHELL • e: a entrada existe; • r: a entrada pode ser lida; • w: a entrada pode ser escrita; • O: usuário é o proprietário da entrada; • s: tem tamanho maior que zero; • f: é um arquivo normal; • d: é um diretório; • L: é um link simbólico; • b: é um dispositivo orientado a bloco; • c: é um dispositivo orientado a caracatere; • p: é um named pipe (fifo); • S: é um socket special file; • u: tem o bit SUID habilitado; • g: tem o bit SGID habilitado; • G: grupo da entrada é o mesmo do proprietário; • k: stick bit está habilitado; • x: a entrada pode ser executada; • z: a string tem tamanho zero; • n: a string tem tamanho diferente de zero; • nt: Verifica se um arquivo é mais novo que outro; • ot: Verifica se um arquivo é mais velho que outro; • ef: Verifica se é o mesmo arquivo (link). Vejamos um exemplo de uso desses operadores: arquivo=’/etc/passwd’ if [ -e $arquivo ] then if [ -f $arquivo ] then if [ -r $arquivo ] then source $arquivo else echo "Nao posso ler o arquivo $arquivo" 105 CAPÍTULO 11. PROGRAMAÇÃO SHELL fi else echo "$arquivo n~ ao é um arquivo normal" fi else echo "$arquivo n~ ao existe" fi #!/bin/bash arq1=$0 arq2=’/etc/passwd’ arq3=’/etc/passwd’ if [ $arq1 -nt $arq2 ] then echo "Arquivo $arq1 eh mais novo que $arq2" fi if [ $arq1 -ot $arq2 ] then echo "Arquivo $arq1 eh mais velho que $arq2" fi if [ $arq3 -ef $arq2 ] then echo "Trata-se do mesmo arquivo" fi As opções podem ser agrupadas em um único teste. Por exemplo, -erf arquivo testa se o arquivo indicado existe, se é um arquivo normal e se pode ser lido: arquivo=’/etc/passwd’ if [ -efr $arquivo ] then source $arquivo else echo "Problemas no acesso a $arquivo" fi 106 CAPÍTULO 11. PROGRAMAÇÃO SHELL 11.7 Expansão de variáveis Muitas vezes é necessário pegar apenas uma parte de uma variável. Neste caso, é possı́vel utilizar os caracteres de expansão de variáveis para pegar partes de uma string. Alguns parâmetros de expansão são: • ${par^ ametro#padr~ ao} : Remove a menor parte à esquerda do parâmetro. • ${par^ ametro##padr~ ao} : Remove a maior parte à esquerda do parâmetro. • ${par^ ametro%padr~ ao} : Remove a menor parte à direita do parâmetro. • ${par^ ametro%%padr~ ao} : Remove a maior parte à direita do parâmetro. • ${par^ ametro//padr~ ao/string} : Substitui o padrão pela nova string do parâmetro. • ${par^ ametro:inı́cio:tamanho} : Pega uma parte da variável. Existem vários outros, consulte o comando bash (man bash) para maiores detalhes. Vejamos script de exemplo do uso desses modificadores: #!/bin/bash texto="/etc/passwd" echo "Tirando o nome do arquivo = ${texto%passwd}" echo "Tirando o caminho do arquivo = ${texto#/etc/}" echo "Substituindo passwd por group = ${texto//passwd/group}" #!/bin/bash meses=( Janeiro, Fevereiro, Marco, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, echo echo "Entre com Uma data no formato dd/mm/aaaa :" read data dia=${data:0:2} mes=${data:3:2} ano=${data:6:4} echo echo "A data digitada foi $dia de ${meses[$mes-1]} de $ano" echo 11.8 Mais exemplos de script Analise e descreva o que faz o script a seguir, passo a passo: 107 CAPÍTULO 11. PROGRAMAÇÃO SHELL #!/bin/bash --noprofile # testar se ha um so parametro de entrada if [ $# != 1 ] then echo "Erro na chamada" echo "Uso: criadir numero de diretorios" exit 1 fi num=0 while [ $num -lt $1 ] do echo "Criando diretorio $num" mkdir dir$num num=$((num+1)) done echo "Acabei de criar $1 diretorios" exit 0 Mais outro script: read -p "Entre com o nome do usuario:" pUser resultado=$(grep $pUser /etc/passwd) if [ $? -ne 0 ] then echo "Usuario nao existe" else echo -n "Login:" echo $resultado|cut -d: -f1 echo -n "User ID:" echo $resultado|cut -d: -f3 echo -n "Group ID:" echo $resultado|cut -d: -f4 echo -n "Nome:" echo $resultado|cut -d: -f5 echo -n "Diretorio de trabalho:" echo $resultado|cut -d: -f6 echo -n "Shell padrao:" echo $resultado|cut -d: -f7 fi 108 CAPÍTULO 11. PROGRAMAÇÃO SHELL Exemplo completo de cadastro simples em arquivos, utiliza funções: #!/bin/bash function inclui() { read -p "Entre com o codigo:" cCodigo grep -e "^$cCodigo" cadastro >/dev/null 2>&1 if [ $? -eq 0 ] then echo "Codigo cadastrado" return else read -p "Nome:" cNome read -p "Email:" cEmail read -p "Confirma (S/N)?" cConfirma if [ "$cConfirma" == "S" ] then echo "$cCodigo:$cNome:$cEmail" >> cadastro fi fi return } function consulta() { read -p "Entre com o codigo:" cCodigo consulta=$(grep -e "^$cCodigo" cadastro 2>/dev/null) if [ $? -ne 0 ] then echo "Codigo nao existe" return else echo -n "Nome:" echo $consulta | cut -d: -f2 echo -n "Email:" echo $consulta | cut -d: -f3 fi return } function exclui() 109 CAPÍTULO 11. PROGRAMAÇÃO SHELL { read -p "Entre com o codigo:" cCodigo consulta=$(grep -e "^$cCodigo" cadastro 2>/dev/null) if [ $? -ne 0 ] then echo "Codigo nao existe" return else echo -n "Nome:" echo $consulta | cut -d: -f2 echo -n "Email:" echo $consulta | cut -d: -f3 read -p "Confirma exclusao (S/N) ?" confirma if [ "$confirma" == "S" ] then grep -e "^$cCodigo" -v cadastro > temp.tmp 2>/dev/null mv temp.tmp cadastro fi fi return } function relatorio() { l=0 >relatorio.txt while read LINHA do if [ $l -eq 0 ] then printf "Codigo\tMatricula\tEmail\n" >> relatorio.txt fi r=$(echo $LINHA | cut -d: -f1) printf "$r\t" >> relatorio.txt r=$(echo $LINHA | cut -d: -f2) printf "$r\t" >> relatorio.txt r=$(echo $LINHA | cut -d: -f3) printf "$r\n" >> relatorio.txt l=$((l+1)) if [ $l -eq 60 ] then l=0 110 CAPÍTULO 11. PROGRAMAÇÃO SHELL fi done < cadastro } PS3="Escolha a opç~ ao:" select opcao in Inclusao Alteracao Consulta Exclusao Relatorio Sair do case $opcao in Inclusao) inclui;; Consulta) consulta;; Exclusao) exclui;; Relatorio) relatorio;; Sair) exit 0;; *) echo "Opcao ainda nao implementada";; esac done 11.9 Atividades sugeridas 1. Escreva um script chamado clean para limpar seu diretório $HOME, removendo todos os arquivos com extensão ”bak”ou ” ”que não tenham sido acessados há pelo menos 3 dias. Dica: use os comandos find e rm e a avaliação por aspas inversas. 2. Escreva um script para criar diretórios com nome DirXXX, onde XXX varia de 001 a 299. Dica: use o comando printf para gerar o nome dos diretórios a criar. 3. Escreva um conjunto de scripts para gerenciar o apagamento de arquivos. O script del deve mover os arquivos passados como parâmetros para um diretório lixeira; o script undel deve mover arquivos da lixeira para o diretório corrente e o script lsdel deve listar o conteúdo da lixeira. O diretório lixeira deve ser definido através da variável de ambiente $LIXEIRA. 4. Funda os scripts do exercı́cio anterior em um só script del, com os demais (undel e lsdel) sendo links simbólicos para o primeiro. Como fazer para que o script saiba qual a operação desejada quando ele for chamado, sem precisar informá-lo via parâmetros ? 111 12 Comandos Básicos 12.1 Comandos Iniciais Tabela 12.1: Comandos Básicos - Armazenamento Comando bzip2 cpio gunzip gzip tar zcat zforce Ação Compacta Arquivos para liberar espaço. Cria e desempacota repositórios de arquivos. Expande arquivos compactados (.gz e .Z ). Compacta arquivos para liberar espaço. Copia ou restaura arquivos de uma mı́dia de repositório. Exibe o conteúdo de arquivos compactados. Obriga os arquivos gzip a terem a extensão .gz. Tabela 12.2: Comandos Básicos - Comparações Comando cmp comm diff diff3 sdiff Ação Compara Compara Compara Compara Compara dois arquivos, byte por byte. itens em dois arquivos ordenados. dois arquivos, linha por linha. três arquivos. e mescla dois arquivos interativamente. 112 CAPÍTULO 12. COMANDOS BÁSICOS Tabela 12.3: Comandos Básicos - Comunicação Comando dig ftp login rsync scp ssh talk tftp Ação Consulta o servidos DNS. File Transfer Protocol. Se registra no sistema. Transfere arquivos, particularmente através de uma rede. Copia arquivos com segurança em um sistema remoto. Executa o shell ou um comnado no sistema remoto (modo seguro/criptografado). Troca mensagens interativamente com outros terminais. Trivial File Transfer Protocol. Tabela 12.4: Comandos Básicos - Diversos Comando banner bc cal clear info man nice nohup openvt passwd script su sudo tee time wall whoami xargs Ação Faz pôsteres a partir de palavras. Calculadora de precisão arbitrária. Exibe o calendário. Limpa a tela. Obtém informações sobre um comando usando o leitor de hipertexto GNU. Obtém informações sobre um comando. Reduz a prioridade de uma tarefa. Preserva uma tarefa em execução, após desconectar. Executa um programa no próximo terminal virtual disponı́vel. Configura sua senha de login. Produz uma transcrição de sua sessão de login. Torna-se um usuário diferente, freqüentemente o superusuário. Executa um comando autorizado como root ou outro usuário. Armazena a saı́da em arquivo e envia para a tela, simultâneamente. Cronometra a execução de um comando. Envia uma mensagem para todos os terminais. Imprime a identificação do usuário corrente. Processa muitos argumentos em partes gerenciáveis. 113 CAPÍTULO 12. COMANDOS BÁSICOS Tabela 12.5: Comandos Básicos - Gerenciamento de arquivos Comando cat chfn chgrp chmod chown chsh cksum cp csplit dd file head hexdump less ln ls merge mkdir more mv newgrp od pwd rm rmdir shred split tac tail tailf touch wc Ação Concatena arquivos ou os exibe. Altera informações do usuário para finger, e-mail, etc. Altera grupo associado aos arquivos. Altera modos de acesso dos arquivos. Altera proprietário dos arquivos. Altera o shell de login. Calcula a soma de verificação. Copia arquivos. Divide um arquivo em partes com um tamanho especı́fico ou em locais especı́ficos. Copia arquivos diretamente do/para o disco. Determina o tipo de um arquivo. Exibe as primeiras linhas de um arquivo. Exibe arquivos no formato hexadecimal. Exibe arquivos na tela. Cria alias (links) de nome de arquivo. Lista arquivos ou diretórios. Mescla alterações de diferentes arquivos. Cria um diretório. Exibe arquivos na tela. Move ou renomeia arquivos ou diretórios. Altera o grupo corrente (da sessão). Exibe arquivos no formato octal. Imprime o diretório de trabalho. Remove arquivos/diretórios. Remove diretórios. Exclui arquivos com segurança. Divide arquivos uniformemente. Imprime linhas de um arquivo na ordem inversa. Exibe as últimas linhas de um arquivo. Acompanha o crescimento de um arquivo de registro. Atualiza as indicações de tempo de um arquivo e cria o arquivo, caso ele não exista. Conta linhas, palavras e caracteres. 114 CAPÍTULO 12. COMANDOS BÁSICOS Tabela 12.6: Comandos Básicos - Impressão Comando lpq lpr lprm lpstat pr Ação Mostra o status das tarefas de impressão. Envia para a impressora. Remove tarefas de impressão. Obtém o status da impressora. Formata e pagina para impressão. Tabela 12.7: Comandos Básicos - Manutenção de Programas Comando cvs ctags etags gdb gprof make nm objcopy objdump patch pmap size strace strip Ação Gerencia diferentes versões (revisões) de arquivos-fonte. Gera uma lista de sı́mbolos para uso com o editor vi. Gera uma lista de sı́mbolos para uso com o editor Emacs. Depurador GNU. Exibe dados de profile do arquivo-objeto. Mantém, atualiza e recria programas e arquivos relacionados. Exibe a tabela de sı́mbolos do arquivo-objeto. Copia e transforma arquivos-objeto. Exibe informações sobre arquivos-objeto. Aplica patches no código-fonte. Imprime o mapa da memória de um processo. Imprime o tamanho de um arquivo-objeto, em bytes. Rastreia chamadas de sistema e sinais. Extrai sı́mbolos de um arquivo-objeto. 115 CAPÍTULO 12. COMANDOS BÁSICOS Tabela 12.8: Comandos Básicos - Pesquisa Comando apropos egrep fgrep find grep locate look strings whereis which Ação Pesquisa páginas de manual sobre um tópico. Versão extendida do comando grep. Procura palavras literais em arquivos. Procura arquivos pelo no sistema e adota uma variedade de ações possı́veis. Procura padrões de texto em arquivos. Pesquisa um banco de dados já existente para mostrar onde estão os arquivos no sistema. Procura string no arquivo, no inı́cio das linhas. Procura padrões de texto em arquivos binários. Localiza comandos. Imprime o nome do caminho de um comando. Tabela 12.9: Comandos Básicos - Processamento de Textos Comando col cut emacs ex expand fmt fold gawk groff gs ispell join paste rev sed sort tr uniq vi vim Ação Processa caracteres de controle. Seleciona colunas para exibição. Ambiente de trabalho com poderosos recursos de edição de textos. Editor de linhas subjacente ao vi. Converte tabulações em espaços. Produz comprimentos de linhas mais ou menos uniformes. Quebra linhas. Processa linha ou registros, um por um. Formata a entrada de troff. Exibe arquivo Postscript ou PDF. Correção ortográfica interativa. Mescla diferentes colinas em banco de dados. Mescla colunas ou troca a ordem. Imprime linhas no sentido inverso. Editor de texto não interativo. Ordena ou mescla arquivos. Transforma (redefine) caracteres. Localiza linhas repetidas ou únicas em um arquivo. Editor de texto visual. Versão melhorada do vi. 116 CAPÍTULO 12. COMANDOS BÁSICOS Tabela 12.10: Comandos Básicos - Programação Comando ar as bison cpp flex g++ gcc ld ldd m4 make ranlib rpcgen yacc Ação Cria e atualiza arquivos de biblioteca. Gera arquivo-objeto. Gera tabelas de parsing. Faz pré-processamento de código C. Analisador Léxico. Compilador C++ GNU. Compilador C GNU. Linkeditor. Imprime dependências de biblioteca compartilhadas. Processador de macros. Cria programas. Gera a tabela de sı́mbolos de arquivo. Transforma código RPC em C. Gera tabelas de parsing. Tabela 12.11: Comandos Básicos - Programação Shell Comando basename echo envsubst expr mktemp printf sleep test Ação Remove os componentes iniciais do caminho de um diretório. Repete os argumentos da linha de comando na saı́da. Substitui o valor de variáveis de ambiente em strings. Efetua operações aritméticas e comparações. Gera nome de arquivo temporário e cria o arquivo. Formata e imprime argumentos de linha de comando. Faz uma pausa durante o processamento. Testa uma condição. 117 CAPÍTULO 12. COMANDOS BÁSICOS Tabela 12.12: Comandos Básicos - Status do Sistema Comando at atq atrm crontab date df du env finger free hostname kill printev ps quota stat tty top tty uname uptime vmstat who Ação Executa comandos posteriormente. Exibe as tarefas enfileiras por at. Remove tarefa enfileirada por at. Automatiza comandos. Exibe ou configura a data. Mostra a utilização do disco. Mostra a utilização do disco. Exibe variáveis de ambiente. Exibe informações sobre usuários. Mostra a memória livre e a usada. Mostra o nome de host do sistema. Termina um comando em execução. Exibe variáveis de ambiente. Exibe processos. Exibe a utilização e os limites do disco. Exibe o status de arquivo ou do sistema de arquivos. Configura ou exibe configurações do terminal. Exibe as tarefas que estão em execução. Exibe o nome de arquivo do terminal conectado na entrada padrão. Exibe informações do sistema. Mostra há quanto tempo o sistema está funcionando. Mostra estatı́sticas da memória virtual. Mostra quem está conectado. 118 CAPÍTULO 12. COMANDOS BÁSICOS 12.2 Comandos de Administração de Sistemas e Redes Tabela 12.13: Comandos de Administração/Redes - Correio Comando fetchmail formail mailq makemap newaliases rmail sendmail Ação Busca correio em servidores remotos. Converte entrada para formato de correio. Imprime um resumo da fila de correio. Atualiza mapas de banco de dados do comando sendmail. Reconstrói o banco de dados de alias do comando sendmail. Manipula correio uucp. Envia e recebe correio. 119 CAPÍTULO 12. COMANDOS BÁSICOS Tabela 12.14: Comandos de Administração/Redes - Daemons Comando apmd atd bootpd cupsd fingerd ftpd imapd klogd mountd named nfsd pppd rdistd rexecd rlogind routed rpc.rusersd rpc.statd rshd rwhod sshd syslogd talkd tcpd tftp xinetd ypbind yppasswd ypserv Ação Daemon do Advanced Power Managent. Enfileira comandos para execução posterior. Daemon do Internet Boot Protocol. Daemon de impressora. Daemon do comando finger. Daemon do File Transfer Protocol. Daemon do servidor de caixa de correio IMAP. Gerencia o daemon syslogd. Servidor de pedido de montagem NFS. Servidor de nome de dominı́o da Internet. Daemon do NSF. Mantém conexões de rede PPP (Point-to-Point Procol). Servidor de distribuição de arquivos remotos. Servidor de Execução remota. Servidor do comando rlogin. Daemon de roteamento. Servidor de usuários remoto. Daemons de estado NFS. Servidor de shell remoto. Servidor do comando who remoto. Daemon de shell seguro. Daemon de monitoração de eventos de sistema. Daemon do comando talk. Daemons de rede TCP. Daemons do Trivial File Transfer Protocol. Daemons de Serviços de Internet estendido. Inicia outros serviços, quando necessário. Processo de vı́nculo NIS. Servidor de modificação de senha NIS. Prcoesso servidor NIS. 120 CAPÍTULO 12. COMANDOS BÁSICOS Tabela 12.15: Comandos de Administração/Redes - Hardware Comando agetty arp cardctl cardmgr fdisk hdparm kbdrate ramsize setkeycodes setserial slattach Ação Iniciia sessão de usuário no terminal. Gerencia a cache ARP. Controlador cartões PCMCIA. Daemons gerenciador de cartão PCMCIA. Mantém partições de disco. Obtém e configura parâmetros de unidade de disco rigı́do. Gerencia a taxa de repetição do teclado. Imprime informações sobre disco de RAM. Altera mapeamentos de código de varredura para código de teclado. Configura informações da porta serial. Liga linhas seriais às interfaces de rede. Tabela 12.16: Comandos de Administração/Redes - Informações de host Comando arch dig dnsdomainname domainname free host hostname uname Ação Imprime a arquitetura da máquina. Consulta servidores de nomes de domı́nio Internet. Imprime nome de dominı́o DNS. Imprime nome de dominı́o NIS. Imprime a utilização da memória. Imprime informações de host e zona. Imprime ou configura nome de host. Imprime informações de host. Tabela 12.17: Comandos de Administração/Redes - Instalação Comando cpio install rdist tar Ação Copia e grava arquivos em repositórios. Copia arquivos em locais que fornecem acesso ao usuário e configura permissões. Distribui arquivos para sistemas remotos. Copia ou restaura arquivos em uma mı́dia de repositório. 121 CAPÍTULO 12. COMANDOS BÁSICOS Tabela 12.18: Comandos de Administração/Redes - Relógio Comando hwclock rdate zdump zic Ação Gerencia o relógio do hardware. Obtém a hora do servidor de horário da rede. Imprime a lista de fusos horários. Cria arquivos de informação de conversão de hora. 122 CAPÍTULO 12. COMANDOS BÁSICOS Tabela 12.19: Comandos de Administração/Redes - Sistema de Arquivos Comando debugfs dosfsck dump dumpe2fs e2fsck e2image edquota fdformat fsck fsck.ext2 mke2fs mkfs mkfs.ext2 mkfs.ext3 mklost+found mkraid mkswap mount quotacheck quotaon quotaoff quotastats raidstart raidstop rdev repquota resize2f restore rootflags setquota showmount swapoff sync tune2fs umount warnquota Ação Depura o sistema de arquivos ext2. Verifica e repara um sistema de arquivos DOS ou VFAT. Faz backup de dados de um sistema de arquivos. Imprime informações sobre superbloco e grupo de blocos. Verifica e repara um sistema de arquivos ext2. Armazena dados de recuperação de desastres para um sistema de arquivos ext2. Edita quotas de sistema de arquivos com vim. Formata disquetes. Outro nome para e2fsck. Verifica e repara um sistema de arquivos ext2. Cria um novo sistema de arquivos ext2. Cria um novo sistema de arquivos. Outro nome para mke2fs. Mais um nome para mke2fs. Cria o diretório lost+found. Configura um dispositivo RAID. Designa um espaço de trocas. Monta um sistema de arquivos. Faz auditoria da informação de quota armazenada. Impõem o uso de quotas. Não impõem o uso de quotas. Exibe estatı́sticas de quota do kernel. Aitva um dispositivo RAID. Desativa um dispositivo RAID. Descreve ou altera valores do sistema de arquivos raiz. Exibe resumo de quota. Aumenta ou diminui um sistema de arquivos ext2. Restaura dados de um comando dump em um sistema de arquivos. Lista ou configura flags para uso na montagem do sistema de arquivos raiz. Edita quotas de sistema de arquivos. Lista os diretórios exportados em um host remoto. Começa a usar dispositivo para trocas. Grava os buffers do sistema de arquivos no disco. Gerencia um sistema de arquivos ext2. Desmonta um sistema de arquivos. Envia avisos de utilização do disco pelo correio para usuários. 123 CAPÍTULO 12. COMANDOS BÁSICOS Tabela 12.20: Comandos de Administração/Redes - Gerenciamento de kernel Comando depmod lsmod modinfo modprobe sysctl Ação Cria listagens de dependência de módulos. Lista os módulos do kernel. Imprime informações de módulo do kernel. Carrega e remove um módulo e seus módulos dependentes. Examina ou modifica parâmetros do kernel em tempo de execução. Tabela 12.21: Comandos de Administração/Redes - Interligação em rede Comando ifconfig iptables named nameif netstat nfsstat nsupdate portmap rarp rndc route routed rpcinfo ruptime rwho traceroute wvdial Ação Gerencia interfaces de rede. Administra recursos de firewall. Faz a tradução entre nomes de domı́nio e endereços IP. Atribui nomes a dispositivos de rede. Imprime o estado da rede. Imprime estatı́sticas para NFS e RPC. Envia pedidos de atualização de DNS dinâmica. Faz o mapeamento de daemons para portas. Gerencia a tabela RARP. Envia comandos para um servidor de nomes BIND. Gerencia tabelas de roteamento. Mantém tabelas de roteamento atualizadas dinamicamente. Relata informações de RPC. Verifica há quanto tempo o sistema remoto está ativo. Mostra quem está conectado no sistema remoto. Rastreia a rota da rede até o host remoto. Estabelece conexões de IP dial-up. 124 CAPÍTULO 12. COMANDOS BÁSICOS Tabela 12.22: Comandos de Administração/Redes - Impressão Comando accept lpadmin lpinfo lpmove reject tunelp Ação Instrui o daemon de impressora para que aceite tarefas. Configura filas de impressora e classe. Mostra as impressoras e drivers disponı́veis. Move uma tarefa de impressão para uma fila diferente. Instrui o daemon de impressora para que rejeite tarefas. Otimiza os parâmetros de impressora. Tabela 12.23: Comandos de Administração/Redes - Iniciando e parando o sistema Comando chkconfig ctrlaltdel halt init reboot runlevel shutdown telinit uptime Ação Define quais serviços funcionam em um nı́vel de execução. Desliga e reinicia o sistema normalmente. Pára ou desliga o sistema. Altera o nı́vel de execução. Desliga e reinicia o sistema à força. Imprime o nı́vel de execução do sistema. Desliga o sistema. Altera o nı́vel de execução corrente. Exibe o tempo de funcionamento da máquina local. Tabela 12.24: Comandos de Administração/Redes - Atividade do Sistema e Gerenciamento de processos Comando fuser renice top vmstat Ação Identifica processos que estão usando arquivos ou sistemas de arquivos. Altera a prioridade de processos que estão em execução. Mostra os processos que usam a CPU mais intensamente. Imprime estatı́sticas da memória virtual e estatı́sticas de processo. 125 CAPÍTULO 12. COMANDOS BÁSICOS Tabela 12.25: Comandos de Administração/Redes - Usuários Comando chpasswd groupadd groupdel groupmod grpck grpconv lastlog newusers pwck pwconv rusers rwall useradd userdel usermod w wall whoami Ação Altera múltiplas senhas. Adiciona um novo grupo. Exclui um grupos. Modifica grupos. Verifica a integridade de arquivos do grupo do sistema. Converte arquivo de grupo em arquivo de grupo de sombra. Gera relatório dos últimos logins de usuário. Adiciona novos usuários em um lote. Verifica a integridade de arquivos de senha do sistema. Converte arquivo de senha em senhas de sombra. Imprime informações no estilo do comando who sobre máquina remotas. Imprime uma mensagem para usuários remotos. Adiciona um novo usuário. Exclui um usuário e o diretório de base desse usuário. Modifica as informações de um usuário. Lista os usuários conectados. Escreve para todos os usuários. Mostra como você está conectado correntemente. 126 CAPÍTULO 12. COMANDOS BÁSICOS Tabela 12.26: Comandos de Administração/Redes - Diversos Comando anacron atrun cron dmesg ldconfig logger logrotate run-parts Ação Agenda comandos para execução periódica. Agenda comandos para execução posterior. Agenda comandos para tempos especı́ficos. Imprime mensagens de inicialização depois que o sistema está funcionando. Atualiza links de biblioteca e utiliza o cache. Envia mensagens para o monitorador de eventos do sistema. Compacta e faz o rodı́zio de logs de sistema. Executa os scripts em um diretório. Tabela 12.27: Comandos de Administração/Redes - TCP/IP Comando dig ftpd gated host ifconfig named netstat ping pppd rdate route routed slattach sshd tcpdump telnetd tftpd Ação Consulta servidores de nome de domı́nio. Servidor para transferências de arquivo. Tabelas de roteamento de mensagens entre redes. Imprime informações de host e zona. Configura parâmetros de interface de rede. Faz a tradução entre nomes de domı́nio e endereços IP. Verivia se um host remoto está on-line e respondendo. Verifica se um host remoto está on-line e respondendo. Cria conexão PPP serial. Notifica o servidor de horário de que a data mudou. Gerencia tabelas de roteamento. Mantém tabelas de roteamento atualizados dinamicamente. Liga linhas seriais às interfaces de rede. Servidor para conexões de shell seguras. Escreve informações de pacotes de rede na tela ou no arquivo. Servidor para sessões Telnet de hosts remotos. Servidor para conjunto restrito de transferências de arquivo. 127 CAPÍTULO 12. COMANDOS BÁSICOS Tabela 12.28: Comandos de Administração/Redes - TCP/IP Comando domainame makedbm portmap rpcinfo ypbind ypcat ypinit ypmatch yppasswd yppoll yppush ypserv ypset yptest ypwhich ypxfr Ação Configura ou exibe o nome de domı́nio NIS corrente. Reconstrói bancos de dados NIS. Mapeador de número de programa RPC para porta DARPA. Relata informações RPC. Conecta a servidor NIS. Imprime valores do banco de dados NIS. Constrói novos bancos de dados NIS. Imprime o valor de uma ou mais chaves NIS. Altera a senha do usuário no banco de dados NIS. Determina a versão do mapa NIS no servidor NIS. Propaga o mapa NIS. Daemon do servidor NIS. Aponta ypbind para um servidor especı́fico. Verifica a configuração de NIS. Exibe o nome do servidor NIS ou do mestre de mapas. Transfere o banco de dados NIS do servidor para o host local. 128