Curso de extensão em Administração de redes com GNU/Linux
Italo Valcy - italo@dcc.ufba.br
Gestores da Rede Acadêmica de Computação Departamento de Ciência da Computação
Notas de autoria: Parte do conteúdo desta apresentação foi baseado nos slides de Amadeu Júnior (amadeu@gmail.com) em seu curso "Curso Iniciante em GNU/Linux" datado de Abril/2006 como extensão universitária da UFBA.
Temos, ainda, uma série de referęncias no final deste documento que indicam locais de consulta utilizados na confecção deste material.
Todo o material aqui disponível pode, posteriormente, ser utilizado sobre os termos da:
Creative Commons License:
Assuntos abordados
O mundo GNU/Linux
Introdução ao Shell do GNU/Linux
O Mundo GNU/Linux
Iniciado em 1984 (Free Software Fundation)
GNU é um acrônimo recursivo para GNU Não é Unix GPL (Licença Pública GNU): Inversão da lógica de propriedade - “Copyleft”
Linux foi criado em 1991, por Linus Torvalds
O Linux é somente o núcleo do sistema, que integrado às camadas de mais alto nível passam a integrar o
sistema GNU/Linux
O Mundo GNU/Linux
GPL - GNU Public LicenseAs quatro liberdades defendidas pela FSF para os usuários de software:
A liberdade de executar o programa para qualquer propósito.
Estudar como o programa funciona e adaptá-lo às suas necessidades. O acesso ao código-fonte é pré-requisito para essa liberdade.
Redistribuir cópias de modo que você possa ajudar a seu próximo
Aperfeiçoar o programa e liberar seus aperfeiçoamentos, de modo que toda a comunidade se beneficie. O acesso ao código-fonte também é um pré-requisito neste caso.
O Mundo GNU/Linux
Distribuições GNU/LinuxDado o modelo descentralizado de desenvolvimento do kernel e dos aplicativos, surge um diferenciamento na forma como se distribui o S.O. com as ferramentas GNU. Assim surge o conceito de distribuição.
Peculiaridades:
Metodologia de instalação de aplicativos
Disponibilização dos aplicativos por categorias Seleção dos aplicativos mais utilizados
Organização da estrutura de diretórios Organização da inicialização do sistema
O Mundo GNU/Linux
Distribuições GNU/LinuxGeralmente cada distribuição tem uma especialidade
O Mundo GNU/Linux
Qual escolha tem sido tomada na Rede DCC?Em um ambiente de rede de computadores, a diversidade descontrolada de tantas variáveis sobre a organização do sistema operacional dificulta a tarefa de administração. Nesse sentido, deve ser preferível uma distribuição que forneça devido suporte ao usuário.
Ao mesmo tempo, a escolha não deve ser meramente técnica, uma vez que a ideologia de manutenção de pacotes, a longo prazo, se torna importante.
Desde 2001, os administradores os administradores da rede DCC, vêm adotando Debian GNU/Linux, uma comunidade de voluntários.
O Mundo GNU/Linux
Por que Debian GNU/Linux?O esforço dos voluntários não deve ser erroneamente confundido com descomprometimento e desorganização.
O processo de desenvolvimento do Debian levemente hierarquizado, mas garante através de seu contrato social que:
O Debian permanecerá 100% livre
Nós iremos retribuir à comunidade de software livre Nós não esconderemos problemas
Nossas prioridades são nossos usuários e o software livre
Suportamos programas que não atendam nossos padrões de software livre de maneira peculiar e isolada.
O Mundo GNU/Linux
Arquitetura básica do GNU/LinuxO Mundo GNU/Linux
Arquitetura básica do GNU/LinuxKernel → Linux
Software parte do S.O que implementa as principais funcionalidades do sistema.
Introdução ao Shell do GNU/Linux
O que é shell?Shell: é o "prompt" da linha de comando do Unix e Linux, ele recebe os comandos digitados pelo usuário e os executa.
O shell lê o comando que o usuário teclou e converte-o em uma forma mais simplificada e legível para o Unix, aumentando o desempenho.
Pode ser utilizado como linguagem de programação. Conhecimento de shell é essencial para os sysadmins unix-like.
Introdução ao Shell do GNU/Linux
Tarefas do shellExame da linha de comando recebida (comandos, atribuições)
Resolução de redirecionamentos (stdin, stdout, stderr) Substituição de variáveis ( parâmetros do tipo $[a-zA-Z0-9_]*)
Substituição de meta-caracteres (*, ? ou [ ]) Passa a linha de comando para o kernel
Introdução ao Shell do GNU/Linux
Principais ShellsBourne Shell (sh): Shell padrão no Unix, presente na maioria das distribuições Unix-like.
Bourne-Again Shell (bash): Shell padrão no Linux, quase 100% compatível com o sh.
Korn Shell (ksh): Considerado um upgrade do sh. Tem atraído programadores de Shell no Unix.
C Shell (csh): Como o ksh, contempla diversos
aspectos não implementados no sh. Estrutura parecida com a linguagem C.
Introdução ao Shell do GNU/Linux
Usando o terminalInterface de modo texto presente em todos os sistemas operacionais
Evoluiu junto à interface gráfica no GNU/Linux
Proporciona praticidade para fazer algumas tarefas (muitas)
Introdução ao Shell do GNU/Linux
Comandos do promptman: Contém informações do manual de cada comando,
com todos os parâmetros suportados e exemplos.
Sintaxe: man comando, por exemplo: man ls É possível especificar sessões para o manual
1 – Executáveis e comandos do shell 2 – Chamadas de sistema
5 – Formato de arquivos e conveções
Exemplo: man passwd é diferente de man 5 passwd
Introdução ao Shell do GNU/Linux
Comandos do promptcd: Utilizado para navegar entre diretórios.
Sintaxe: cd diretorio, por exemplo: cd /tmp/pasta Para acessar o diretório acima: cd ..
Para voltar ao home do usuário: cd Para qual o diretório atual: pwd
ls: Utilizado para listar o conteúdo de diretórios.
Sintaxe: ls [dir], por exemplo: ls ou ls /tmp/
Diferenciar cores dos arquivos: ls --color=auto [dir] Exibir detalhes dos arquivos: ls -l [dir]
Exibir arquivos ocultos: ls -a [dir]
Introdução ao Shell do GNU/Linux
Comandos do promptcp: Utilizado para copiar arquivos.
Sintaxe: cp origem destino, exemplo: cp arq.txt /tmp/ Copiar para o diretório atual:
cp /mnt/cdrom/video.avi ./
Copiar um diretório completo: cp -r diretorio destino
mv: Move arquivos de um lugar para o outro e renomeia
arquivos.
Sintaxe: mv origem destino,exemplo: mv arq.txt /tmp/
Renomear arquivos: mv arquivo1.txt arquivo2.txt Você pode usar o mv em diretórios
Introdução ao Shell do GNU/Linux
Comandos do promptpwd: Exibe o diretório atual.
mkdir: Utilizado para criar novos diretórios.
Sintaxe: mkdir diretorio..
exemplo: mkdir /tmp/testes
Criar pastas recursivamente: mkdir -p /tmp/p1/p2/p3
rmdir: Utilizado para remover pastas vazias.
Sintaxe: rmdir pasta_vazia, exemplo rmdir /tmp/testes
rm: Remover arquivos e diretórios, de acordo aos parâmetros
passados.
Sintaxe: rm arquivo1 ...
Introdução ao Shell do GNU/Linux
Comandos do promptExistem dois tipos especiais de nomes de diretórios
utilizados para a navegação na estrutura de diretórios do Linux:
Ponto (.), que significa o diretório corrente
Dois pontos (..), que significa um nível acima do
diretório atual.
Por exemplo, supondo “pwd = /home/joao”, o caminho ../italo/books é o mesmo que /home/italo/books
O diretório que fica um nível imediatamente acima do diretório corrente é chamado diretório-pai.
Introdução ao Shell do GNU/Linux
Comandos do promptlocate: Permite localizar arquivos de forma instantânea. Não
procura o arquivo em todo o HD, invés disso usa um banco de dados.
Exemplo: locate arquivo.txt
Atualizar o bando de dados: updatedb Para buscar por executáveis: which
O locate busca por arquivos que contêm a string passada.
Por exemplo, para achar books e school:
Introdução ao Shell do GNU/Linux
Comandos do promptO comando find procura o arquivo desejado na árvore hirerárquica.
Sintaxe: find [caminho] [opcoes]
Pode demorar algum tempo para retornar o resultado da busca, que começa no diretório-raiz e passa por todos os subdiretórios.
As principais opções são:
-name nome: procura arquivos pelo seu nome. -type c: procura arquivos pelo seu tipo: l, d, f, s.
-user username: procura por arquivo que pertençam à username.
Introdução ao Shell do GNU/Linux
Comandos do promptExemplos: buscar arquivo no /home que...
Tenham nome igual à “*.mp3”: find /home -name '*.mp3'
Pertençam ao usuário fulano: find /home -user fulano
Tenham permissão de execução para o dono: find /home -perm -u=x
Sejam links:
Introdução ao Shell do GNU/Linux
Comandos do promptO comando touch é utilizado para atualizar os horários de acesso e de modificação de um arquivo existente.
Caso este arquivo não exista, será criado na data e hora especificadas no comando.
Sintaxe: touch [opcoes] arquivo
Se não forem especificadas data e hora, o sistema utilizará a data atual.
Podemos criar arquivos ao editar um arquivo
inexistente, por intermédio de editores de texto do
Linux.
Introdução ao Shell do GNU/Linux
Comandos do prompt – Exercício 1Acesse seu diretório de trabalho e crie o arquivo “exemplo1” vazio.
Crie um arquivo chamado “exemplo2” com algumas linhas de dados enviadas pelo teclado.
Faça com que o arquivo vazio tenha o mesmo conteúdo do segundo.
Edite o segundo e altere seu conteúdo.
Introdução ao Shell do GNU/Linux
Comandos do prompt – Exercício 2Crie um diretório “exemplos” em um subdiretório “temp” do seu diretório “home”. Utilize apenas um comando para isso.
Mova os arquivos “exemplo1” e “exemplo2”, do exercício anterior, para o diretório “exemplos”, deixando uma cópia do segundo em seu diretório de origem.
Introdução ao Shell do GNU/Linux
Atributos de arquivosO linux mantém as seguintes informações sobre os arquivos:
Nome: Nome do arquivo;
Localização: Local de armazenamento do arquivo no disco; Tamanho: Tamanho do arquivo em bytes;
Ligações: Nomes pelos quais o arquivo é conhecido; Propriedade: Usuário que é o dono (owner) do arquivo; Grupo: Grupo de usuários que acessa o arquivo
Tipo: Tipo do arquivo
Criação: Data e hora de criação do arquivo;
Modificação: Data e hora da última modificação do arquivo Acesso: Permissões de acesso ao arquivo
Introdução ao Shell do GNU/Linux
Atributos de arquivos Informações do comando ls -l: Tipo de arquivo - : significa arquivo d: significa diretório l: link simbólico s,b,c,p: arquivos especiais Permissões de acesso Número de links do arquivo Dono do arquivo Grupo de usuários Tamanho em bytes Data da últimamodificação Nome do arquivo
rwr—r 1 italo users 9 Mar 8 18:48 arquivo1.txt drwxrxrx 2 italo users 48 Mar 8 18:48 diretorio
Introdução ao Shell do GNU/Linux
Atributos de arquivosPermissões ou modos de acesso:
Modo
r Listar o conteúdo Ler conteúdo w
x Executar
Operações sobre
diretório Operações sobre arquivos Criar e renomear diretórios e arquivos Alterar o conteúdo Acessar arquivos e subdiretórios
rwx rwx rwx
Permissões do grupoIntrodução ao Shell do GNU/Linux
Atributos de arquivosPermissões ou modos de acesso:
Dono (owner): Proprietário do arquivo
Grupo (group): Grupo ao qual o dono pertence
Outros (others): Usuários que não fazem parte do grupo Comandos para manusear permissões:
Mudar o dono do arquivo:
# chown novodono[:novogrupo] arquivo
Mudar o grupo
# chgrp novogrupo arquivo
Mudar permissões do arquivo
Introdução ao Shell do GNU/Linux
Atributos de arquivosCada dígito binário corresponde a uma letra: r,w,x
0 = ausência de letra ou negação de permissão 1 = concessão de permissão
São três números de três dígitos binários (000=0 e
111=7). Um número para o dono, um para o grupo e um para outros.
Exemplo:
$ chmod 764 arquivo
Onde:
7 = Permite rwx para owner (u) 6 = Permite rw para group (g)
rwx rw-
r--111 = 7 100 = 4 110 = 6
Introdução ao Shell do GNU/Linux
Atributos de arquivosPermissões especiais
s: Seleciona o usuário ou identificação de grupo durante
a execução. Também chamado de bit setuid. Quando marcado ao grupo torna efetiva a sua identificação, sendo chamado de bit setgid. Ao ser aplicado à diretórios, força que os arquivos criados dentro dele pertençam ao mesmo grupo do diretório, ao invés do grupo primário que o usuário pertence.
Como utilizar:
chmod u+s arquivo # setuid chmod g+s arquivo # setgid
Introdução ao Shell do GNU/Linux
Atributos de arquivos – Exercício 3Utilizando os conceitos vistos sobre usuários, grupos, permissões de arquivos e pastas,além dos comandos básicos de shell, monte o seguinte ambiente de trabalho.
Vamos criar uma série de pastas para alocar arquivos com listas de filmes, sendo que precisamos ter:
Um diretório filmes de forma que todos os usuários do grupo
users tenham permissão de gravar, ninguém deve poder gravar na
pasta
Um subdiretório terror do grupo suporte de forma que se qualquer pessoa colocar novo arquivo será registrado como sendo do grupo
suporte e não do grupo users.
Introdução ao Shell do GNU/Linux
Atributos de arquivos – Exercício 4Vamos criar uma estrutura de pastas para um subsistema
GNU/Linux (chroot) que será utilizado para conexões SFTP. Esse sistema deve possuir:
Um diretório para binários (bin), um para bibliotecas do sistema (lib), e outro para arquivos de configurações (etc), outros usuários devem ter permissão para execução e leitura somente no diretório de binários;
Um diretório home, onde os usuários do grupo users tenham permissão para ler, escrever e executar.
Diretórios home/professores e home/aluno, de forma que somente os usuários do grupo professores e do grupo alunos possam escrever em seus respectivos diretórios, mas um grupo não possa navegar nas pastas do outro grupo.
Um diretório tmp com total acesso, porém ninguém além do próprio dono do arquivo possa apagá-lo.
Introdução ao Shell do GNU/Linux
Atributos de arquivos – Exercício 4 (solução)mkdir /tmp/chroot
cd /tmp/chroot mkdir bin lib etc
chmod o-rwx lib etc mkdir home
chgrp users home
chmod g+rwx,o-rwx home
mkdir home/professores home/alunos chgrp alunos home/alunos
chgrp professores home/professores
chmod g+rwx,o-rwx home/professores home/alunos chmod g+s home/professores home/alunos
mkdir tmp
Introdução ao Shell do GNU/Linux
Arquivo padrão: entrada, saída e errosOs programas utilitários ou comandos do Linux desempenham funções simples e bem definidas.
Os comandos obtêm dados como entrada, executam o processamento e fornecem resultados como saída.
Ao comando são atribuídos três arquivos-padrão:
Entrada padrão: do qual o programa recebe os dados de entrada
Saída padrão: recebe a saída do programa
Erro: recebe quaisquer mensagens de erros ocorridas na execução do comando.
O shell atribui, automaticamente, os três arquivos-padrão ao terminal do usuário.
Introdução ao Shell do GNU/Linux
Arquivo padrão: entrada, saída e errosQuando o programa
solicita
entrada,
ela vem do teclado
do
terminal
e,
quando
produz
saída
ou
mensagens
de
erro,
elas
são
mostradas na tela
do terminal de
Introdução ao Shell do GNU/Linux
Arquivo padrão: entrada, saída e errosPodemos redirecionar a entrada de um arquivo usando o operador <. Exemplo: ./consulta < clientes.txt
A saída padrão pode ser modificada, bastando utilizar o operador >. Exemplo: ls > saida-ls.txt
O arquivo de erros padrão é a tela do monitor. Para armazenar os erros em um arquivo para análise posterior, utilizamos o operador 2>.
Exemplos:
Saída-padrão sobrepõe o arquivo: comando > arquivo Saída-padrão anexa ao arquivo: comando >> arquivo Erro-padrão sobrepõe o arquivo: comando 2> arquivo Erro padrão anexa ao arquivo: comando 2>> arquivo Saída e erro padrão sobrepõe o arquivo:
comando > arquivo 2>&1
Introdução ao Shell do GNU/Linux
Arquivo padrão: entrada, saída e erros - ExercícioExecutamos o comando ls -R /etc, como usuário
não-privilégiado, e precisamos adicionar sua saída ao arquivo
saida-ls.txt e os erros ao arquivo erros-ls.txt. Como
fazer isso em um único comando?
Execute dois terminais virtuais. Pressione Ctrl+Alt+F1 para acessar o primeiro e Ctrl+Alt+F2 para acessar o
segundo, esteja autenticado em ambos. Agora execute o seguinte comando no primeiro terminal:
ls /tmp > /dev/tty/2 Qual o resultado?
Introdução ao Shell do GNU/Linux
Pipe ou canalizaçãoOs utilitários do Linux desempenham funções
específicas. Tarefas complexas são realizadas pela combinação de utilitários.
Um pipe é usado para executar uma sequência de
comandos, passando a saída padrão de um comando
diretamente a outro comando, que a usará como entrada padrão.
Introdução ao Shell do GNU/Linux
Pipe ou canalizaçãoCanalização de vários comandos. Funciona como um só programa.
Comando1 Comando 2 Comando 3 Comando 4
Entrada padrão
Saída padrão
Introdução ao Shell do GNU/Linux
Pipe ou canalizaçãoExemplo: Colocar os clientes em ordem numérica e mostrar suas informações por meio do programa
consulta na tela do monitor: sort numeros.txt > temp ./consulta < temp
O mesmo resultado pode ser conseguido
utilizando um pipe:
Introdução ao Shell do GNU/Linux
Pipe ou canalizaçãoO pipe permite que vários comandos sejam conectados, criando um fluxo de dados com o mesmo efeito da
execução de um programa que contém várias instruções.
Para preservar a saída de um comando no interior de uma canalização, utilizamos o comando tee como parte da canalização.
O comando tee copia as linhas do arquivo de entrada
padrão para um arquivo de saída padrão e também para um arquivo fornecido como parâmetro.
No exemplo anterior, para salvar os dados em um arquivo temp, faríamos:
Introdução ao Shell do GNU/Linux
Pipe ou canalização – Exercício 5Como devemos fazer para exibir a saída do comando
ls -l /etc pausadamente na tela?
Dica: o comando less é capaz de ler um arquivo e exibi-lo pausadamente na tela.
Desejamos saber quantos arquivos em nosso sistema
terminam com a extensão .conf e também salvar o nome desses para que possamos fazer backup deles no futuro. Como podemos fazer isso usando apenas uma linha de comando?
Dica: o comando wc -l conta o número de linhas em um arquivo ou da entrada padrão.
Programação Shell Script
(primeiros passos)
Programação Shell Script
Quando usar o Shell?Quais problemas podem ser resolvidos utilizando a programação em Shell?
Quais problemas não podem ser resolvidos utilizando a programação em Shell?
Qual a diferença entre um shell script e uma linha de programação como C, C++, Java?
Programação Shell Script
Escrevendo scriptsUm script é basicamente uma sequência de comandos. Os comandos podem ser separados por um ponto e
vírgula (;) ou por quebra de linha.
Um arquivo contendo um script traz, na primeira linha a seguinte string:
Programação Shell Script
Escrevendo scriptsTanto espaços em branco quanto tabulações antes dos comandos são ignorados.
Comentários são iniciados com o caractere # e se estendem até o fim da linha, conforme exemplo:
#!/bin/bash
# isso eh um comentario
Programação Shell Script
Variáveis em ShellNome dado ao espaço de memória que armazena um valor.
O nome da variável é escolhido pelo programador. Não é necessário declaração prévia.
Tipos suportados: Inteiro
Decimal String Vetor
Programação Shell Script
Variáveis em ShellPara criar uma variável, basta atribuir-lhe um valor:
#!/bin/bash
minha_variavel=”hello world” echo $minha_variavel
Programação Shell Script
Variáveis em ShellX=14 # funciona
X=teste # funciona
X=varias palavras # não funciona :(
X=”varias palavras” # agora sim! :)
Y=”$X unidades” # $X será substituído pelo valor de X Y='$X unidades' # $X não será substituído
Como atribuir a saída de um comando a uma variável?
Programação Shell Script
Escopo das variáveisO que é escopo? Onde é utilizada uma variável criada em um script?
Variáveis locais: somente no script
Variáveis de ambiente: em todo o ambiente Shell
X=1 # X é local
export X # X agora é variável de ambiente
exporte Y=”/srv/books” # variável de ambiente
Programação Shell Script
ParâmetrosO que é um parâmetro ou argumento?
cp -R origem destino invoke-rc.d ssh restart
Variável especial contém o argumento: $<n>
./meu_script.sh cpu 1 verde $0 → ./meu_script.sh
$1 → cpu $2 → 1
Programação Shell Script
ParâmetrosOutras variáveis de parâmetros:
$@: Contém todos os parâmetros passados a partir de
$1. Trata-os como uma lista.
$#: Contém o número de parâmetros passados
$$: Número PID do processo atual (do próprio script) $_: Último argumento do último comando executado $?: Código de retorno do último comando executado
Programação Shell Script
Exercício 6Crie um script que recebe como parâmetro um diretório e lista a quantidade de arquivos dentro daquele diretório (incluindo subdiretórios, se for o caso). Exemplo:
./conta_arquivos.sh /etc
O diretório /etc contém 3214 arquivos.
./conta_arquivos.sh /boot
O diretório /boot contém 106 arquivos.
./conta_arquivos.sh documentos
Programação Shell Script
Exercício 7Crie um script que recebe como parâmetro uma string, digamos expr, um diretório, digamos source, e outro diretório, target. O script deverá procurar por arquivos
que contenham o padrão expr no seu nome e estejam no diretório source. Todos os arquivos encontrados devem ser copiados para a pasta target, a qual deve ser criada se não existir.
Referências
http://homes.dcc.ufba.br/~amadeu/extensao-basico/img0.html http://aurelio.net/shell/canivete.html