CURSO DE UNIX
http://www.inf.ufsc.br/barata Volta pro índice do BE 20:
CURSO DE UNIX I
por rodrigo feher - feher@ibm.net
copiado
http://www.nsc.ufpb.br/~g9411415/unix/feher.html
com permissão do autor
(inclusive tem uma versão mais atualizada lá - achei mais legal
essa versão)
* Historia
O sistema operacional UNIX nao foi feito como algo
comecial, mas como
uma ferramenta para hackers, feito POR programadores PARA
programadores.
So para ter uma ideia, os primeiros releases
eram chamados de PWB
(Programmer's Work Bench).
O primeiro UNIX foi escrito por Dennis Ritchie e Ken Thompson,
na AT&T
Bell Labs, para uso pr¢prio.
Ultilit rios foram escritos a medida que
eles tinham problemas a resolver.
http://www.Genocide2600.com/~tattooman/unix-humor/gallery/
Pelo simples motivo que o
Bell Labs nao era uma empresa de
computadores, o source code foi
compartilhado para universidades.
Programadores brilhantes escreveram seus proprios programas e adicionaram
ao UNIX.
Nestes 20 anos o UNIX foi ganhando cada vez
mais programas, cada vez
mais usuarios. Hoje em dia e praticamente impossivel falar
em Internet
sem falar em UNIX.
* O Shell
Talvez uma das razoes do poder do UNIX e que voce
nao "fala" com o
sistema diretamente. Ao contrario, voce "fala" com
um programa chamado
shell.
O que o shell faz e pegar tudo aquilo que
voce digita e interpretar,
tomando a acao desejada, como executando um programa ou coisa parecida.
Por exemplo, quando voce digita um comando
para mostrar todos os
arquivos que comecam com a letra "m":
$ cat m???
O shell procura pelos arquivos, faz uma lista deles,
chama o programa
cat e pede para ele mostrar os arquivos da lista. O comando
cat chama o
kernel atraves das "system calls" para pegar cada
arquivo no disco e
mostrar seu conteudo na tela.
Por que isso e importante?
Primeiro, porque voce pode escolher entre
diferentes shells, cada um
com diferentes funcoes e regras. Segundo porque e importante
saber quais
as regras que o shell usa para interpretar o
que voce digita, para
obter-se o resultado desejado.
Por exemplo, a regra basica
que o shell usa para o espaco (" ") e
separar os argumentos da linha de comando.
Porem, as vezes, voce quer
que o shell interprete-os de forma diferente. O shell permite
que voce
pegue uma frase como um unico argumento. Voce pode fazer
isso usando as
aspas basicamente, como no exemplo abaixo:
$ grep "Isso e apenas um parametro" arquivo.txt
Se voce entender como o shell interpreta a linha
de comando isso pode
ser muito util em dezenas de casos, principalmente quando estiver lidando
com asteriscos ("*").
Segue abaixo a relacao entre o kernel e os programas.
+--------------------------------------------------------------------+
|
USUARIO
|
+---+----------------------------------------------------------------+
| dados e comandos
^
^
| do
usuario
|
|
|
|
saida
| saida
v
|
|
+-------------------+
|
|
|
shell
+----+ transferencia +--+--+
| comandos internos +----------------------> |
cat |
+-------+----------
+
de controle +--+--+
|
|
|
| "system calls"
v
v
+-------------------------------------------------------------------+
| Kernel de UNIX e
Drivers
|
+-------------------------------------------------------------------+
Vale lembrar que alguns comandos fazem a entrada de
dados diretamente
do usuario, sem a intervencao do shell. Nestes
casos o unico papel do
shell e chamar o programa. Um editor de texto, por exemplo, quase
sempre
inclue seu proprio interpretador de comandos e suas proprias regras.
CURSO DE UNIX II por rodrigo feher <feher@ibm.net>
* Os Programas Funcionam Juntos
No UNIX a maioria dos programas foram
desenhados para justamente
trabalharem juntos. Isso e realmente maravilha (como
voce vai perceber
ao longo do curso) pois voce nunca vai ter que reinventar
a roda. :-)
Para a melhor interacao entre os programas, um ultilitario
deve seguir
os tres conceitos basicos:
* Dentro do possivel, a saida de um
programa deve ser usavel como a
entrada de outro.
* Toda a informacao que um programa necessitar deve
ser passada em um
unico "stream" ou especificada na linha de comando. Um programa
nao deve
perguntar dados ao usuario ou fazer uma formatacao desnecessaria da
saida.
* Se nenhum argumento for passado na linha de comando,
a entrada deve
ser feita pela stdio (entrada padrao, normalmente o teclado)
e a saida
deve ser feita pela stdout (saida padrao, normalmente a sua tela).
Os programas que forem escritos seguindo as
"regras" acima podem ser
facilmente usados como filtros.
A barra vertical "|" representa
o pipe, isso e, "pegue a saida do
programa da esquerda como entrada".
Com isso voce podera pegar a saida
de um comando de procura, jogar
para outro que colocara a saida em ordem alfabetica e este entao
jogar o
resultado para um arquivo.
Isso fica assim (veremos isso
mais tarde, nao se preocupe se nao
entender - o intuito e apenas demostrar o poder da linha de comando):
$ find -name "aula_unix*" -print | sort > indice.txt
Que tal? :-)
CURSO DE UNIX III por rodrigo feher
<feher@ibm.net>
nota: eu estava lendo as aulas I e II e achei
melhor antes de dar os
comandos basicos do UNIX apresentar rapidamente quais sao os shells
mais
populares.
* Os Diversos Shells
Como voce pode ver na aula I, existem
muitos shells disponiveis;
tambem e muito importante saber usa-lo, ja que isso e vital para
o total
aproveitamento do UNIX.
Na maioria dos sistemas operacioais,
o shell (ou interpretador de
comandos) e parte interna do sistema
operacional. No UNIX isso e
totalmente diferente. O shell e apenas
mais um programa, que vai
proteger voce do kernel - e o kernel de voce! :-)
Existem uma grande diversidade de shells disponiveis,
onde voce esta
livre para escolher aquele que mais se adapta a voce. Os mais comuns
sao:
* sh
O Bourne Shell
(tem esse nome por causa do seu criador - Steve
Bourne) e o mais antigo dos
shells atualmente disponiveis. Ele e
bastante primitivo.
E quase sempre usado para
a programacao de shell por alguns
motivos que irei provavelmente mostrar em alguma
outra aula.
* csh
O C Shell foi desenvolvido em
Berkeley (para quem nao sabe, quem
faz os "BSDs": FreeBSD, NetBSD, etc) como
parte da sua implementacao
do seu UNIX. E de
longe o mais popular e usado shell disponivel.
Ocasionalmente o csh nao e encontrado
em um System V UNIX, porem e
bastante raro.
Possui varias coisas que o sh
nao tem - e fazem bastante falta.
Sao elas o controle de tarefas
(jogar um programa para background,
foreground, etc) e o "history", entre outras.
Nao e aconselhavel se escrever
shell scripts para ele, pois possui
varios bugs. Entretanto para o uso normal, voce
nao percebera nada.
* jsh
Uma nova versao
do Bourne shell que possui a implementacao de
controle de tarefas. Disponivel
apenas para o System V Release 4
UNIX.
* ksh
O Korn Shell (tem esse nome por
ter sido criado por David Korn) e
compativel com o Bourne
shell, entretanto tem a maioria das
facilidades do C shell implementada
e mais algumas totalmente novas
como a edicao do "history". E mais confiavel que
o csh.
* bash
Este e o Bourne-Again Shell.
Foi desenvolvido pela GNU. Possui a
maioria das funcoes do C shell e do
Korn shell e mais um comando de
ajuda interno.
Fora isso ainda existem shells como
o tcsh (Turbo C Shell), que e
apenas uma variacao do tradicional C Shell.
* Como Identificar O Shell Que Esta Usando
Basicamente voce pode identificar que shell
esta usando pelo prompt:
"%" para o csh e "$" para o sh. Porem como e possivel a
customizacao do
prompt, talvez isso nao funcione em casos de prompts redefinidos.
Para se certificar, use um dos comandos abaixo:
$ grep "seu nome de login" /dev/passwd
Caso esteja usando NIS, use:
$ ypcat passwd | grep "seu nome de login"
No meu caso a saida sera:
feher:x:501:100:Rodrigo Feher:/home/feher:/bin/bash
Note que o nome do shell e o ultimo parametro, onde eles
sao separados
por ":". Logo, o meu default e
o Bourne-Again Shell. Apenas por
curiosidade os campos sao login, senha (criptografada), User
ID, Group
ID, nome real, homedir e shell default.
CURSO DE UNIX IV por rodrigo feher <feher@ibm.net>
* Os Comandos Internos e Externos
A maioria dos comandos que voce executa
sao externos. Por exemplo,
quando voce quer listar os arquivos de um diretorio e digita
"ls" voce
esta usando um programa externo (/bin/ls).
Entretanto, quando usa o
comando "cd" para mudar de diretorio voce esta usando um comando
interno
do shell.
O shell nao cria um novo processo
para rodar comandos internos. A
grande vantagem dos internos sobre os externos e a velocidade:
comandos
externos precisam que o shell use as chamadas "fork" e "exec" para
criar
um subprocesso. Veremos mais tarde varios casos onde isso e vital
para o
nosso programa e/ou shell script.
Vejamos como o shell interpreta o que voce
digitou: se existir algum
comando interno com aquele nome, ele e executado. Se o
comando digitado
contiver o path absoluto (veremos mais tarde) como "/bin/ls" entao
esse e
executado mesmo se houver algum comando interno com o mesmo
nome. Caso
nao exista nenhum comando externo com aquele nome e voce nao
expecificou
o path absoluto entao o shell procurara no seu path pelo programa.
O path e apenas uma string, que expecifica onde o shell
deve procurar
pelos programas externos. Ele e
geralmente especificado nos seus
arquivos de configuracao (veremos mais tarde, tambem).
Normalmente programas de uso
geral sao localizados no diretorio
"/bin", alguns tambem ficam em "/etc",
porem sao normalmente apenas
usandos pelo administrador do sistema.
O path fica armazenado numa variavel ambiental
(veremos mais sobre
isso depois) chamada PATH. Provavelmente sera algo como:
PATH=/bin:/usr/bin:/usr/local/bin:/home/seulogin/bin:
Os varios lugares especificados, como voce pode ver, sao
separados por
":". O shell faz a procura dos programas
externos nos diretorios que
voce especificou na ordem em que sao declarados.
* Arquivos no UNIX
Como em todo sistema
operacional, os arquivos sob o UNIX possuem
nomes. Normalmente esses nomes nao tem
restricao quanto ao tamanho,
exeto em algumas versoes mais antigas onde o limite era 14 caracteres.
Teoricamente os arquivos sobre UNIX podem conter
qualquer caractere,
exeto a barra "/". Entretanto e
altamente recomendavel que voce use
apenas letras e evite a pontuacao,
pois isso podera causar alguns
problemas quando voce tiver que acessar um arquivo. Use as regras
abaixo
quando for nomear um:
* Maiusculas e Minusculas.
O UNIX e
sempre case-sensitive, ou seja, letras maiusculas sao
tratadas diferentemente das minusculas (ao
contrario do DOS, Windows
95, OS/2, etc). O que isso
significa? Voce pode ter no mesmo
diretorio simultaneamento os arquivos "ABCD",
"AbCd", "abcd" e assim
em diante.
* Underscore (_)
Underscores facilitam
a criacao de um arquivos com um nome
composto de varias palavras. Evite
usar o espaco para nao ter
problemas futuros.
Em vez de criar um
arquivo chamado
"planilhajan96" use "planilha_jan_96".
* Pontos (.)
Os pontos sao
usandos frequentemente para especificar o tipo do
arquivo. Por exemplo, arquivos como "aaa.c"
geralmente sao programas
escritos em C, enquanto um arquivo do tipo
"aaa.txt" geralmente sera
um texto. Fora o ponto evite usar outros tipos
de pontuacao.
Uma coisa muito importante
sobre delecao de arquivos: uma vez
deletado, o arquivo nao pode ser mais
recuperado. Logo tome muito
cuidado quando usar wildcards com o comando "rm" ou similar.
CURSO DE UNIX V por rodrigo feher <feher@ibm.net>
* Wildcards
[para os usuarios que estao migrando do DOS]
Antes de mais nada, precisa ficar bem
claro para os usuarios do DOS
que os wildcards no DOS funcionam de forma muito diferente em
relacao ao
UNIX: quem os interpreta e o shell. Como
assim? Se voce mandar um
programa no DOS mostrar todos os arquivos de
um diretorio, usamos por
exemplo "dir *.*", o shell passa o parametro "*.*" para o comando "dir"
e
este ira fazer a procura dos arquivos correspondentes,
mostrando-os na
tela.
No UNIX e diferente: quem faz a procura e
o shell. Por exemplo,
quando digitamos o comando "ls *", o shell primeiro pre-processa a
linha,
expandindo o "*" para todos os arquivos do diretorio e entao executando
o
"ls" usando como argumento os arquivos achados em uma lista
concatenada,
usando o espaco (" ") como separador de campos. Se
voce tiver acesso a
uma maquina que rode UNIX, experimente executar o
comando "echo *" e
entao entendera melhor o que eu estou dizendo.
[pronto, so isso... :-) Agora iniciamos a nossa aula.]
Como na maioria dos outros sistemas
operacionais, os shells do UNIX
tem a facilidade dos wildcards, porem com
muito mais poder. Veremos
agora algumas maneiras de se abreviar o nome de um ou mais arquivos.
Comecaremos a demonstrar o uso dos wildcards pelo
mais simples: o
ponto de interrogacao ("?").
O shell ira interpreta-lo como um unico caractere.
Por exemplo: voce
quer listar todos os arquivos que comecam com
"curso_unix_" e possuem
mais um caractere. Faremos a procura usando a string "curso_unix_?".
Com isso, o shell ira
expandir a string acima transformando-a no
resultado da busca. Se no diretorio houver os arquivos
"curso_unix_1" e
"curso_unix_2", o shell
passara como argumento ao
programa:
"curso_unix_1 curso_unix_2".
Agora vamos ver o wildcard "*". Ele e praticamente
igual ao "?" com a
diferenca que ele significa "zero ou mais caracteres".
Se tivermos num
diretorio os arquivos "curso_unix_1", "curso_unix_2" e
"dummy.tar.gz",
usando-se "curso*" o
shell fala a expansao para "curso_unix_1
curso_unix_2".
As vezes voce precisara ser mais restrito
quando for especificar um
grupo de arquivos. Na pratica, para achar
todos os arquivos de um
diretorio que terminam com a letra "Z" ou "z", voce deve usar
o wildcard
"[]". Fica assim: "*[Zz]". Com isso
serao localizados arquivos como
"teste.Z", "abobora.z", "xyz", "xyZ", etc.
Em outras palavras, o wildcard "[]" sempre ira
corresponder-se a um
dos caracteres da lista que for especificada. Vale
lembrar que se voce
quiser, por exemplo, achar todos os arquivos que terminarem com as
letras
de "b" ate "l" voce pode usar: "*[b-l]".
Resumo pratico:
Wildcard | Equivale a... |
? | Um unico e qualquer caractere |
* | Zero ou mais caracteres |
[ab] | Ou "a" ou "b" |
[a-z] | Caracteres de "a" ate "z" |
Vale a pena lembrar que os wildcards apenas sao
expandidos para nomes
de arquivos que ja existam, logo, se voce quiser criar
dez arquivos, de
"carta_1" ate "carta_9" e usar "carta_[1-9]" voce nao
obtera sucesso.
Para isso voce deve usar o operador "{}", que
veremos brevemente numa
proxima aula.
Caso queira ir mais fundo nos wildcards, consulte
a manpage do seu
shell. Para o bash, fica "man bash", para o csh, fica "man
csh" e assim
por diante.
* Extensoes de Arquivos
Apenas para referencia, segue uma tabela
de como identificar qual o
tipo do arquivo usando-se como referencia a sua extensao.
Vale lembrar
que isso nao vale para 100% dos casos, ja que ninguem e
obrigado a usar
esta convencao.
Extensao O arquivo
e'
um...
.c
Source code de um programa escrito em C.
.h
Header de um program escrito em C.
.f
Source code de um programa escrito em FORTRAN.
.o
Arquivo objeto (compilado).
.s
Source code de um programa escrito em assembly.
.Z
Arquivo comprimido pelo programa compress.
.[1-8] Source code
para uma "manpage".
.tar
Arquivo "tarado".
.gz
Arquivo comprimido pelo programa gzip.
.tgz
Arquivo "tarado" e comprimido pelo gzip.
.txt
Arquivo texto.
.shar Arquivo shell.
.sh
Script para o Bourne shell.
.csh Script
para o C shell.
.ps
Arquivo fonte para postscript
Extensao | O arquivo e' um... |
.c | Source code de um programa escrito em C. |
.h | Header de um program escrito em C. |
.f | Source code de um programa escrito em FORTRAN. |
.o | Arquivo objeto (compilado). |
.s | Source code de um programa escrito em assembly. |
.Z | Arquivo comprimido pelo programa compress. |
.[1-8] | Source code para uma "manpage". |
.tar | Arquivo "tarado". |
.gz | Arquivo comprimido pelo programa gzip. |
.tgz | Arquivo "tarado" e comprimido pelo gzip. |
.txt | Arquivo texto. |
.shar | Arquivo shell. |
.sh | Script para o Bourne shell. |
.csh | Script para o C shell. |
.cs | Arquivo fonte para postscript |
CURSO DE UNIX VI por rodrigo feher
<feher@ibm.net>
* Usando O Operador "{}"
Continuando a aula passada, vamos agora aprender como
usar as chaves.
Vale lembrar que elas nao
funcionam em qualquer shell, algumas
implementacoes nao possuem esta facilidade.
Vamos ao que interessa. As chaves
possuem uso semelhante ao dos
colchetes, com uma diferenca: elas podem ser
usadas em qualquer caso,
nao apenas quando o arquivo o qual voce quer se referenciar exista.
Digitando no shell:
$ echo "aula_unix_{um,dois}"
Voce obtera:
aula_unix_um aula_unix_dois
Uso pratico: voce quer extrair planilhas de um arquivo
.tar. Vejamos
como fica:
$ tar xvf planilhas_1995.tar planilha_{jan,fev,mar}
O shell ira expandir as chaves, passando para o tar como
parametros as
palavras formadas. Neste caso voce
nunca poderia ter usado qualquer
outro wildcard, ja que o shell nao conseguiria expandi-los
pela simples
causa da inexistencia dos arquivos no diretorio corrente.
* A Estrutura em Arvore do Disco
Antes de comecar a demonstrar os
comandos mais usados no UNIX, e
importante que voce saiba como e organizado o disco. Os
arquivos estao
todos dentro de diretorios (sao como gavetas), sendo que
sao permitidos
diretorios aninhados.
Para os usuários do DOS e bom lembrar que
as barras usadas sao ao
contrario. Por exemplo, se no DOS voce se referencia
a um arquivo como
"\tmp\abc" no UNIX voce usaria "/tmp/abc".
Segue abaixo como voce se
referenciaria a todos os diretorios
mostrados na arvore acima:
/
/bin/
/usr/
/home/
/etc/
/usr/bin/
/usr/X/
/home/feher/
/home/joao/
Ficou claro? Se voce
estiver no diretorio "/home/feher/", por
exemplo, e quiser se referenciar ao
"/home/joao/", voce pode usar
"../joao/". O ".." e sempre um link para o diretorio "de baixo".
* O Home Directory
No UNIX, quase sempre todo usuario tem
seu home directory. E neste
local que voce ira guardar os seus seus arquivos em geral, salvas algumas
exessoes.
Os homedirs originalmente foram colocados
em "/usr/", porem hoje em
dia e muito comum voce encontra-los em "/home/" ou
"/u/". Independente
de onde voce estiver no filesystem, digitando apenas
"cd", sem nenhum
argumento, voce ira automaticamente voltar ao seu homedir.
E muito interessante como voce
pode se referenciar a um homedir.
Assumindo-se que seu homedir esta em "/home/feher/", e seu nome
de login
e "feher" voce pode se referenciar ao diretorio "/home/feher/bin/"
usando
apenas "~/bin/".
Como voce deve ter percebido, o shell ira entender o "~"
como homedir.
E se voce quisesse se referir ao subdiretorio
"bin/" no homedir do
usuario "joao"? Basta voce usar "~joao/bin/".
Note que se voce digitar, por exemplo, "cd ~joao"
o shell expandira o
til e entao chamara o
comando cd, que recebera como parametro
"/home/joao/".
* Paths Absolutos e Paths Relativos
A diferenciacao entre paths absolutos e relativos e muito
simples. Se
comecar com uma barra ("/"), o path e
absoluto. Caso contrario, e
relativo.
Se voce estiver no diretorio "/home/feher/" e digitar
"cd bin", voce
ira para o diretorio "/home/feher/bin/". Caso digite "cd /bin"
entao ira
para "/bin/" (estou assumindo que os diretorios
especificados existam.
Caso contrario voce recebera uma mensagem de "diretorio nao encontrado").
CURSO DE UNIX VII por rodrigo feher
<feher@ibm.net>
* Como Funciona Mais "Intimamente" o Filesystem do UNIX
Quando falamos no filesystem do UNIX, nao
podemos deixar de falar do
mais importante: a palavra chave e "inode".
O inode e a estrutura de
dados que mantem todas as informacoes
essenciais sobre os arquivos. Ele abriga:
* UID e GID do dono do arquivo.
* As permissoes do arquivo.
* O timestamp do arquivo (informacoes sobre
a ultima modificacao,
ultimo acesso, etc).
* O tipo do arquivo (arquivo de
dados, device, imagem da memoria,
etc).
O comando "ls -l" mostra quase todas as
informacoes acima, "ls -i"
mostra o inode.
Todos os filesystems
tem um numero pre-definido de inodes,
determinados na sua criacao; e isso que vai determinar o numero maximo
de
arquivos que o ele pode guardar. As vezes, mesmo nao sendo
muito comum,
voce tera ter bastante espaco livre entretanto nao
podera criar novos
arquivos. Este caso identifica o esgotamento de inodes livres.
O numero de inodes nao
pode ser redefinido sem que haja perda de
dados, ou seja, o filesystem tem que ser recriado.
* As Diversas Permissoes de Acesso a um Arquivo
Como o UNIX e um sistema operacional
multiusuario, seria impossivel
administra-lo sem que se tivesse permissoes de arquivos.
As permissoes
sao baseadas em dois conceitos: o de usuario e grupo.
Todo usuario tem uma unica
conta, com um unico nome de login e um
unico UID (o numero de identificacao do
usuario - consulte as aulas
anteriores para informacoes de como achar seu numero atraves
do arquivo
passwd) (*).
Todo usuario tambem e membro de um ou mais grupos (no
BSD e em algumas
outras implementacoes do UNIX, voce e membro de todos os grupos
os quais
voce tem acesso, simultaneamente. Em outros sistemas, para mudar
o grupo
ativo voce devera usar o comando "newgrp").
O seu grupo primario e especificado no arquivo passwd
(normalmente em
"/etc/"). Caso o operador do
sistema deseje lhe dar acesso a mais
grupos, voce sera adicionado no arquivo
group (tambem normalmente em
"/etc/").
Quando voce cria um arquivo ele sera automaticamente setado
para o seu
grupo primario ou para o grupo do dono do diretorio em que ele esta
sendo
criado. Exeto em sistemas que possuem
quota, voce pode mudar o dono
(apenas o root) e o grupo (apenas para algum o qual voce pertenca)
com o
comando chown e/ou chgrp (veremos mais adiante).
Por exemplo, eu pertenco aos grupos "users
e "staff". Quero mudar o
grupo do arquivo "planilha_jan96", que esta em "users", para "staff":
$ chgrp staff planilha_jan96
Agora vejamos como e formada
as permissoes de leitura, escrita e
execucao.
Todo arquivo possui tres diferentes sets de
permissoes: um para o
dono do arquivo, outro para o grupo o qual
o arquivo pertence e outro
para os outros (ou seja, todos exeto os usuarios que nao
se enquadrarem
em nenhuma das especificacoes anteriores). A
permissao de escrita e
simbolizada pela letra "w", a de leitura pela letra
"r" e de execussao
pela letra "x".
Usando a saida do comando "ls -l", temos abaixo:
-rw-r--r-- 1 feher users 0 Mar 29 17:12 planilha_dez94
O arquivo "planilha_dez94" possui um set de permissoes
de "rw-r----".
Desmembrando, temos:
* "rw-" para o dono do arquivo. Significa:
"tem acesso a escrita e
leitura, porem nao pode executar o arquivo".
* "r--" para os usuarios pertencentes ao grupo do
arquivo. Significa:
"tem acesso a leitura, porem nao pode escrever nem executar o arquivo".
* "---" para os outros usuarios.
Significa: "Nao tem acesso nem a
leitura, nem a escrita e nem para a execucao do arquivo".
Agora que voce ja
conhece as permissoes, vejamos elas
mais
intimamente, a nivel de bits (parcialmente):
execucao -----------+
escrita --------+ |
leitura ---+
| |
| | |
| | |
+---+---+---+
| 0 | 0 | 0 |
+---+---+---+
Agora (totalmente), englobando os tres sets de permissoes:
dono do usuarios outros
arquivo do grupo usuarios
+---+---+---++---+---+---++---+---+---+
| 0 | 0 | 0 | | 0 |
0 | 0 | | 0 | 0 | 0
|
+---+---+---++---+---+---++---+---+---+
Um bit setado ("1") significa "sim",
caso contrario ("0") significa
nao. Agora vejamos como vamos formar o set de permissoes
na forma de
numero em base octal: um bit setado para leitura
soma 4, um bit setado
para escrita soma 2 e um para execucao soma 1.
Por exemplo, tenho acesso a
leitura, para escrita mas nao para
execucao. Fica 4 +2 + 0 = 6.
Logo, concluimos a tabela abaixo:
Octal | Permissao |
0 | "---" |
1 | "--x" |
2 | "-w-" |
3 | "-wx" |
4 | "r--" |
5 | "r-x" |
6 | "rw-" |
7 | "rwx" |
Sendo assim, um arquivo com permissao "rwxr-x--x" tera
permissao 651.
Ficou claro? A primeira vista isso
nao teria ultilidade, porem voce
ficara surpreso quando for usar o comando "chmod" (veremos brevemente).
CURSO DE UNIX VIII por rodrigo feher
<feher@ibm.net>
* Os Atributos SUID e SGID
Os atributos SUID e SGID tem uma funcao muito especial
no UNIX: uma
vez executados o seu UID e/ou GID e alterado. No
caso do atributo SUID
estar presente, voce passa a ter a identidade do dono do arquivo; no
caso
do SGID voce passa a ser do mesmo grupo a qual o arquivo pertence.
Vale lembrar que a identidade
e apenas mantida naquele programa,
apenas durante a sua execucao.
Mas qual seria a ultilidade de um programa com esses atributos?
Por exemplo, voce quer que um usuario
possa fazer a impressao de um
documento. Para isso, ele precisara ter permissao de acesso ao
device da
impressora. Porem nao voce que quer
que esse usuario possa fazer
qualquer coisa com aquele device, voce
quer apenas que ele use-o pra
impressao.
Qual a saida? Setar atributos SUID ou SGID ao
programa que fara a
impressao. Assim voce limitara o seu acesso.
Seja muito cauteloso quando for criar um programa
SUID ou SGID: 90%
dos casos de buracos na seguranca sao causados
esses programas. Um
exemplo classico foi um worm (se
nao me engano foi em 1989) que
praticamente derrubou toda a Internet: ele usava
um bug de um programa
com SUID (o sendmail).
Outro exemplo recente e o webserver httpd, da
NCSA. Rodando com SUID
root, um bug nele comprometeu a seguranca de milhares de computadores.
* O Superuser (no caso do UNIX, o root)
Em um sistema multiusuario seria impossivel fazer
a administracao sem
algum "super" usuario. No UNIX ele e o root (UID 0).
Rapidamente: o root pode fazer
praticamente qualquer coisa: ler
arquivos (mesmo sem ter permissao), mudar
permissoes, matar e mudar a
prioridade qualquer processo, etc.
* Como Funcionam as Permissoes para Diretorios
Os diretorios no UNIX usam as mesmas permissoes que os
arquivos, porem
elas sao interpretadas diferentemente.
Para voce poder listar os arquivos de um diretorio, voce
precisa ter o
atributo "r" setado. Caso nao tenha, voce ainda pode acessar
arquivos do
mesmo, porem com uma restricao: voce tera que saber
previamente o nome
do arquivo que voce quer acessar.
Diretorios como "rwx--x--x" sao
muitas vezes chamados de "black
boxes".
O atributo de execucao (search bit) e
o mais importante: caso voce
nao tenha ele setado, nada podera ser feito, o diretorio esta "fechado".
O atributo de escrita determina se voce tera permissao
de criacao e
modificacao de um arquivo. *NUNCA*, repito, *NUNCA* sete isso
para o seu
homedir. Algum ususario mal intencionado pode preparar uma
"surpresinha"
para voce.
Como sempre, o root e uma
excecao: ele passa por cima de todos os
atributos. Em outras palavras, ele pode escrever,
ler, etc em qualquer
diretorio (claro que em casos como volumes montados como "ro", a
escrita
nao e permitida; isso vale para os demais casos).
* Programas em Background: Como funciona
O UNIX sendo um sistema multitarefa,
permite que voce rode varios
programas simultaneamente. Fazendo uma compilacao em background:
% cc program.c &
[1] 1297
%
Como voce pode perceber, o
simbolo "&" significa: "execute em
background". O numero entre colchetes e chamado de
"job number" e o
numero que o segue e o PID (process ID).
* Mais Sobre Programas em Background
No C Shell, Korn Shell, Bash,
etc voce tem a facilidade do chamado
"job control". Com isso voce podera
manipular os processos com muito
mais facilidade. Veja como funciona:
* Para colocar um programa rodando em background
(se voce esqueceu o
"&", por exemplo:
% cc program.c
<Ctrl-Z>
Stopped
% bg
[1] cc program.c
Como voce pode perceber, depois que o Control-Z
foi pressionado no
teclado, o programa foi suspenso e voce retornou
para o shell. Neste
ponto o programa esta totalmente parado. Depois foi dado o comando
"bg".
Isso faz que o ultimo programa em
estado "stopped" seja colocado em
background.
Para jogar o ultimo programa parado de background para
foreground, use
o comando "fg". Caso tenha varios processos rodando em
background, voce
pode ter uma lista deles usando o comando "jobs".
Para colocar em background o job numero "3":
% bg %3
Para colocar em foreground o job numero "2":
% fg %2
CURSO DE UNIX IX por rodrigo feher <feher@ibm.net>
* Um Pouco Mais Sobre Processos em Background
No Bourne Shell, caso voce queira
colocar uma serie de comandos em
background, separados por ";", voce devera
usar os parenteses. Por
exemplo:
$ sleep 15; ls &
O "&" ira apenas afetar o
ls, ou seja, o resultado obtido sera uma
espera de 15 segundos em foreground e entao a execucao
do comando ls em
background.
Neste caso, voce devera usar:
$ (sleep 15; ls) &
Com o comando acima voce obtera o resultado desejado.
Outra coisa que acontece no Bourne Shell e
que quando voce da um
logout todos os seus programas que foram
colocados em background sao
terminados. Para evitar isso, use o comando "nohup".
Por exemplo, para
fazer uma compilacao em background, independentemente se
voce der um
logout:
$ nohup cc program.c &
[1] 3409
$ logout
* Passwords no UNIX
O UNIX sendo um sistema operacioal
multiusuario acaba implicando na
necessidade do usuario ter permissoes restritas.
Isso normalmente e
feito atraves de passwords.
Seja muito cauteloso quando for
escolher um password: uma escolha
errada pode se tornar numa grande dor de cabeca.
No UNIX os passwords estao
guardados (de modo criptografado) no
arquivo "/etc/passwd". Quando voce tenta logar no
sistema, o programa
"login" nao faz a descriptografia da sua senha e compara
com o que voce
entrou, mas sim criptografa o que voce entrou e compara com o que esta
no
"passwd". Se bater, ela esta correta.
Como voce pode perceber, uma
senha criptografada *NAO* pode ser
simplesmente descriptografada por um algoritimo reverso: ele
nao existe.
* O Algoritimo crypt
O algoritimo "crypt", baseado no DES, e usado pelo UNIX
para fazer a
criptografia dos passwords. Ele usa uma chave de 56bit
(oito caracteres
low-ascii) para encriptar blocos de texto de 64bit.
Hoje em dia nao ha
nenhum metodo conhecido que consiga quebrar o algoritimo em pouco
tempo,
pelo fato dele ser "one way".
A criptografia dos passwords e feita da seguinte
maneira: pega-se o
password do usuario como chave de criptografia e criptografa-se
um bloco
de 64bit de zeros. Entao o processo e repetido, num
total de 25 vezes.
No final, adiciona-se o sal(*), e
entao 64bit criptografados sao
transformados em uma string de 11 caracteres,
que sao guardados em
"/etc/passwd".
Para se ter uma ideia, na epoca que este processo
foi idealizado o
processador PDP-11 demorava algo em torno de um segundo para
completar o
processo.
Mas nao para por ai. Para eliminar a
possibilidade de se usar algum
tipo hardware especializado em quebrar
senhas, Robert Morris e Ken
Thompson (os idealizadores) adicionaram o chamado "sal".
O sal e um numero de
12bit, ou seja, entre 0 e 4095, que muda o
resultado do que o DES retorna. Sendo
assim, cada password pode ser
criptografado de 4096 maneiras
diferentes! Quando voce muda seu
password, o programa "passwd" escolhe qual sal usar baseado no relogio
do
computador.
Vejamos abaixo uma tabela de passwords, sais, etc.
password | sal | pass. criptografado |
nutmeg | Mi | MiqkFWCm1fNJI |
ellen1 | re | re79KNd7V6.Sk |
Sharon | ./ | ./2aN7ysff3qM |
norahs | am | amfIADT2iqjAf |
norahs | 7a | 7azfT5tIdyhOI |
Note como o password "norahs"
foi criptografado de duas maneiras
diferentes por terem sais diferentes.
CURSO DE UNIX X por rodrigo feher
<feher@ibm.net>
* O Comando "ls"
Como em qualquer outro sistema operacional,
o UNIX tambem possui um
comando para listar arquivos. Ele e o "ls". Na sua forma
mais reduzida,
ou seja, sem nenhum parametro, voce obtera como saida
uma listagem em
formato horizontal com os arquivos do diretorio corrente:
$ ls
Documentos.tar.gz
backup.tar.gz bin/
planilha_fev96 planilha_jan96
Caso voce queira uma saida em formato longo, use o parametro "l".
$ ls -l
total 1
-rw-r--r-- 1 feher
users 0 Apr 13
10:14 Documentos.tar.gz
-rw-r--r-- 1 feher
users 0 Apr 13
10:14 backup.tar.gz
drwxr-xr-x 2 feher
users 1024 Apr 13 10:14 bin/
-rw-r--r-- 1 feher
users 0 Apr 13
10:13 planilha_fev96
-rw-r--r-- 1 feher
users 0 Apr 13
10:13 planilha_jan96
Vamos interpretar a saida deste
comando: (nao vale para todos os
UNIXes)
O primeiro bloco faz referencia
as permissoes do arquivo (sobre
permissoes, consulte a aula 7), exeto
o primeiro caractere. Ele
significa:
+-----------+----------------------------------+
|
Caractere
|
Significado
|
+-----------+----------------------------------+
|
-
| arquivo
normal
|
|
d
|
diretorio
|
|
c
| dispositivo de
caracteres
|
|
b
| dispositivo de
blocos
|
|
l
| symbolic
link
|
|
s
| socket (apenas em alguns UNIXes) |
|
p |
FIFO (apenas em alguns UNIXes) |
+-----------+----------------------------------+
O segundo bloco indica quantos hard links
(veremos mais tarde) ele
possue ou em caso de diretorios, quantos arquivos la existem.
O terceiro bloco indica o nome do dono do
arquivo. Caso voce obtenha
um numero, significa que o sistema nao pode associar o UID ao nome
do seu
dono (provavelmente foi deletado sua entrada no arquivo "passwd").
O quarto bloco indica a que
grupo o arquivo pertence. Vale o
comentario do paragrafo acima: caso voce obtenha um
numero, o sistema
nao pode assiciar o GID ao seu nome (so que neste caso provavelmente
nao
foi encontrado a sua entrada no arquivo "groups").
O quinto bloco indica o tamanho do arquivo.
O sexto, setimo e oitavo indicam
a data e hora da sua ultima
modificacao.
Finalmente, o nono bloco e o nome do arquivo.
No UNIX os arquivos que comecam com
um ponto (".") ficam ocultos na
listagem. Para mostra-los, use o parametro "a". Veja
como fica a saida
do comando "ls -la":
total 1
-rw-r--r-- 1 feher
users 0 Apr 13
10:14 Documentos.tar.gz
-rw-r--r-- 1 feher
users 0 Apr 13
10:14 backup.tar.gz
drwxr-xr-x 2 feher
users 1024 Apr 13 10:14 bin/
-rw-r--r-- 1 feher
users 0 Apr 13
10:13 planilha_fev96
-rw-r--r-- 1 feher
users 0 Apr 13
10:13 planilha_jan96
-rw-r--r-- 1 feher
users 0 Apr 13
10:13 .signature
Para mostrar um diretorio em vez de seu conteudo, use o parametro "d".
Para obter o inode de cada arquivo, adicione o parametro "i".
Usando-se o parametro "F", no final
do arquivo sera adicionado um
simbolo indicando qual e o seu tipo, para facilitar na sua identificacao.
Veja a tabela abaixo:
+---------+----------------+
| Simbolo | Significado |
+---------+----------------+
| (nada) | arquivo normal |
|
* |
executavel |
|
/ |
diretorio |
|
= |
socket |
| @ | simbolic
link |
+---------+----------------+
Lembre-se sempre que voce pode especificar nomes de
arquivos (usando
wildcards ou nao) e diretorios ao comando ls. Nao
importanto onde voce
esteja, para listar os arquivos do diretorio "/usr" basta
voce usar "ls
/usr".
Vale lembrar que voce na maioria
dos casos voce pode usar varios
parametros simultaneamente.
Nota: o comando "ls" e
realmente muito completo, com dezenas de
parametros. Caso voce queira algo mais especifico, procure consultar
sua
manpage.
* O Comando "cd"
Como voce ja deve ter percebido lendo as aulas
anteriores, o comando
"cd" muda de diretorio. Sua sintaxe e
muito simples, bastando apenas
voce especificar como parametro o diretorio de destino.
Por exemplo, para mudar o diretorio
corrente para "/usr/local/bin"
usa-se "cd /usr/local/bin".
CURSO DE UNIX XI por rodrigo feher <feher@ibm.net>
* O Comando "rm"
Como no DOS existe o comando "del", no
UNIX o equivalente e o "rm".
Sua sintaxe e um tanto quanto
simples: para remover o arquivo
"misc.txt":
$ rm misc.txt
Para remover recursivamente use o parametro
"r". Por exemplo, para
remover os arquivos do diretorio "teste":
$ rm -r teste
Caso voce tente remover algum arquivo que seja
seu, mas nao tenha
setado o atributo de escrita "w", o programa
ira lhe perguntar se tem
certeza que deseja fazer aquilo. Para
passar por cima disso, use o
parametro "f" (force).
$ rm -f homework.tex
O parametro "f" tambem ignora
arquivos nao existentes e nunca faz
perguntas ao usuario.
Dica: para remover um diretorio e
tudo que ha dentro dele, use em
combinacao os parametros "f" e "r". Fica:
$ rm -fr teste
Isso ira eliminar todos os arquivos
pertencentes a teste e tambem a
propria entrada do diretorio. Portanto, tome *muito*
cuidado ao usar
este comando desta maneira.
Nota: sempre que for apagar algum arquivo, pense
duas vezes: uma vez
apagado, o arquivo muito dificilmente podera ser recuperado.
Nao existem
ferramentas como o "undelete" (DOS) para UNIX.
O parametro "i" e exatamente o inverso do "f": ele
causa uma execucao
interativa do programa. A cada arquivo que for
processado sera pedida
uma conformacao do usuario.
* O comando "mv"
O comando "mv" serve para
mover ou renomear (o que acaba dando na
mesma) arquivos e diretorios. Com ele
voce pode desde renomear um
simples arquivo ate mover toda uma arvore de diretorios para outro
lugar.
Para renomear o arquivo "teste.html" para "beta1.html":
$ mv teste.html beta1.html
Tome bastante cuidado ao tomar atitudes como
esta: caso o arquivo
beta1.html ja existir, ele sera destruido!
O parametro "i" causa a execucao do comando
"mv" no modo interativo:
para cada arquivo que sera destruido o programa pedira a confirmacao
por
parte do usuario.
Caso voce especifique mais que
dois arquivos, automaticamente o
programa percebera que voce quer mover um grupo de
arquivos para outro
diretorio. Neste caso o ultimo parametro
deve ser um diretorio; caso
contrario uma mensagem de erro sera emitida.
Para mover todos os arquivos que comecam com "a" para
"/usr/a" e todos
que comecam com "b" para "/usr/b":
$ mv a* /usr/a
$ mv b* /usr/b
* O comando "cp"
O comando "cp" serve para fazermos copias de arquivos.
Na sua forma
reduzida, remos:
$ cp sent-mail-jan96 backup
O comando acima ira fazer uma copia do arquivo
"sent-mail-jan96" para
o arquivo "backup". Use tambem com cautela
este comando: voce podera
facilmente destruir arquivos importantes se
o alvo da copia for um
arquivo ja existente!
Para evitar problemas, use o parametro "i": ele
executa o programa em
modo interativo. Como no comando "mv", sera pedida uma confirmacao
antes
que o arquivo seja destruido.
Algumas versoes do programa "cp" possuem o parametro
"r". Ele e usado
para fazer copias de arvores completas. Por exemplo:
$ cp -p /usr/X11 /backup
O comando acima ira fazer uma copia recursiva do
diretorio "/usr/X11"
para "/backup".