Preview only show first 10 pages with watermark. For full document please download

Apostila Unix

Sistema Operacional UNIX

   EMBED


Share

Transcript

Sistema Operacional UNIX Sistema Operacional UNIX i Sistema Operacional UNIX Sumário SUMÁRIO..............................................................................................................................................................II LISTA DE FIGURAS...........................................................................................................................................IV LISTA DE TABELAS............................................................................................................................................V 1. O SISTEMA OPERACIONAL UNIX...............................................................................................................1 2. UMA SESSÃO UNIX..........................................................................................................................................4 2.1. AMBIENTE GRÁFICO NO UNIX................................................................................................................................6 3. COMANDOS SIMPLES.....................................................................................................................................7 3.1. MANUAL DE REFERÊNCIA - MAN PAGES......................................................................................................................8 3.2. DATA E HORA DO SISTEMA - DATE.........................................................................................................................10 3.3. CALENDÁRIO - CAL...............................................................................................................................................10 3.4. LIMPAR A TELA - CLEAR........................................................................................................................................11 3.5. INFORMAÇÕES SOBRE USUÁRIOS - WHO...................................................................................................................11 3.6. MUDANÇA DE SENHA - PASSWD..............................................................................................................................12 3.7. INFORMAÇÕES SOBRE O USUÁRIO - ID, CHFN............................................................................................................12 3.8. COMUNICAÇÃO COM OUTROS USUÁRIOS - WRITE E TALK............................................................................................13 3.9. ENCERRANDO UMA SESSÃO - EXIT E LOGOUT............................................................................................................15 4. SHELL BÁSICO...............................................................................................................................................16 4.1. REDIRECIONAMENTO..............................................................................................................................................16 4.2. FILTROS - TAIL, CAT, WC, SORT, CUT........................................................................................................................18 4.3. PIPES - CONEXÃO DE UTILITÁRIOS..........................................................................................................................21 4.4. SINÔNIMOS DE COMANDOS - ALIAS E UNALIAS.........................................................................................................22 4.5. HISTÓRICO DE COMANDOS - HISTORY.......................................................................................................................22 4.6. VARIÁVEIS DO SHELL - SET, UNSET, SETENV, UNSETENV.............................................................................................24 4.7. CONTROLE DE EXECUÇÃO - PS, KILL, JOBS, BG, FG.....................................................................................................25 4.7.1. Lista de Processos - ps.............................................................................................................................26 4.7.2. Cancelando Processos - kill.....................................................................................................................27 4.7.3. Execução em Background e Controle de Jobs - bg e fg...........................................................................27 5. SISTEMA DE ARQUIVOS DO UNIX............................................................................................................30 5.1. POSSES DE ARQUIVOS - CHOWN, CHGRP...................................................................................................................31 5.2. PROTEÇÃO DE ARQUIVOS.......................................................................................................................................33 5.2.1. Tipos de Acesso a Arquivos.....................................................................................................................33 ii Sistema Operacional UNIX 5.2.2. Classes de Acesso a Arquivos..................................................................................................................34 5.2.3. Ajustando Permissões de Arquivos - chmod............................................................................................35 5.3. MAPEAMENTO DE ARQUIVOS PARA DISCOS..............................................................................................................37 5.4. TIPOS DE ARQUIVOS..............................................................................................................................................38 5.4.1. Links e o comando ln...............................................................................................................................39 6. OPERAÇÕES COM O SISTEMA DE ARQUIVOS.....................................................................................41 6.1. CAMINHOS DE DIRETÓRIOS (PATHS).........................................................................................................................41 6.2. MANIPULAÇÃO DE DIRETÓRIOS - CD, PWD, LS, MKDIR, RMDIR......................................................................................42 6.3. MANIPULAÇÃO DE ARQUIVOS - CAT, CP, MV, RM.......................................................................................................45 6.4. PROCURANDO ARQUIVOS - FIND, GREP.....................................................................................................................48 6.5. IMPRIMINDO ARQUIVOS - LPR, LPQ, LPRM.................................................................................................................49 7. BACKUP E COMPRESSÃO - TAR, COMPRESS, UNCOMPRESS, ZCAT............................................52 8. BIBLIOGRAFIA...............................................................................................................................................55 iii Sistema Operacional UNIX Lista de Figuras FIGURA 2.1 - EXEMPLO DE LOGIN DE UM USUÁRIO...............................................................................4 FIGURA 3.1 - FORMATO GERAL DE UM COMANDO UNIX......................................................................8 FIGURA 3.8.1 - TELA DO USUÁRIO ‘CELSO’..............................................................................................15 FIGURA 3.8.2 - TELA DO USUÁRIO ‘JOAO’.................................................................................................15 FIGURA 5.1 - ÁRVORE DE DIRETÓRIOS TÍPICA NO UNIX....................................................................30 FIGURA 5.2.3.1 - STRING DE ACESSO DO COMANDO CHMOD.............................................................36 FIGURA 6.1 - DIRETÓRIOS HOME DOS USUÁRIOS “ZECA” E “JOAO”..............................................41 iv Sistema Operacional UNIX Lista de Tabelas TABELA 5.2.1.1 - TIPOS DE ACESSO A ARQUIVOS...................................................................................33 TABELA 5.2.2.1 - INTERPRETANDO MODOS DE ARQUIVOS.................................................................35 TABELA 5.2.3.1 - CONVERSÃO DE MODO SIMBÓLICO PARA ABSOLUTO.......................................37 TABELA 5.4.1 - TIPOS DE ARQUIVOS NO UNIX.........................................................................................39 v Sistema Operacional UNIX 1. O Sistema Operacional UNIX O UNIX foi desenvolvido, nos anos 70, pelos laboratórios Bell, uma divisão da AT&T. Quase todo o trabalho foi realizado por duas pessoas, Ken Thompson e Dennis Ritchie. Como eles eram programadores, o principal objetivo do sistema operacional foi a obtenção de um ambiente satisfatório de trabalho para programadores. Geralmente usuários e programadores experimentados consideram o UNIX um sistema operacional simples, elegante e fácil de aprender, enquanto os iniciantes costumam considerá-lo resumido e não muito amistoso. Atualmente, o UNIX é um importante padrão que influenciou o projeto de muitos sistemas operacionais modernos, como o próprio MS-DOS e o OS/2. Além disso, o UNIX é hoje o sistema operacional mais adequado e mais utilizado nos computadores que atuam como servidores na rede mundial de computadores Internet. Com a recente popularização da Internet, as vendas de sistemas baseados no sistema operacional UNIX têm crescido vertiginosamente. Os comandos do UNIX são processados por uma cápsula (shell), que consiste num programa situado entre o usuário e o sistema operacional. Ela é responsável por interpretar os comandos do usuário, convertendo-os em chamadas do sistema operacional. Seguindo a abordagem clássica de sistemas operacionais, a cápsula não é realmente parte do sistema operacional e, portanto, pode ser modificada. Programadores profissionais podem escolher uma cápsula técnica que forneça maiores facilidades de programação de arquivos script (semelhantes a arquivos de lote no MS-DOS). Os iniciantes talvez prefiram escolher comandos, a partir de um menu, ou pela indicação de ícones na tela. De qualquer forma, a idéia de um interpretador de comandos independente do sistema operacional foi uma importante inovação do UNIX, adotada também por vários outros sistemas operacionais. No mundo UNIX existem mais de uma cápsula de uso habitual. Cada fornecedor de UNIX escolhe aquela que julga ser melhor, ou fornece cápsulas alternativas, à escolha do usuário. A cápsula padrão, por ter sido desenvolvida nos Laboratórios Bell, é chamada de Bourne Shell (sh). Ela está presente em praticamente todos os sistemas UNIX. Uma segunda cápsula muito utilizada é a C Shell (csh), que possui semelhanças com a linguagem C, e é preferida por usuários avançados e programadores. Uma terceira cápsula bastante conhecida é a Korn Shell (ksh), utilizada por exemplo no UNIX da IBM, o AIX. De qualquer forma, os comandos básicos são os mesmos em todas as cápsulas, variando geralmente nos comandos usados para escrever programas de cápsula, os chamados shell scripts. 1 Sistema Operacional UNIX O sistema operacional UNIX é um sistema multi-usuário e multi-tarefa. Por multi-usuário entende-se um sistema no qual programas de mais de um usuário podem estar em execução. Em um sistema multi-usuário, algum tipo de conexão entre o sistema central e os diversos usuários deve existir, seja a conexão simples de terminais, ou uma rede local de computadores. Um sistema multi-tarefa é aquele capaz de executar vários programas simultaneamente, mesmo que a máquina possua somente um processador. Dessa forma, um sistema multi-tarefa não é necessariamente um sistema multi-usuário, mas um sistema multiusuário precisa ser multi-tarefa para que os programas (ou processos) de cada usuário possam ser executados simultaneamente. Entre outras vantagens do UNIX estão a sua portabilidade (facilidade de ser convertido para rodar em várias máquinas), padronização (cada fabricante segue um esquema pré-definido para comandos, etc.), sistema de arquivos hierárquico, e generalidade (pode ser utilizado para praticamente qualquer tipo de aplicação). Além disso, os sistemas UNIX mais modernos tendem a ser distribuídos (recursos espalhados entre várias máquinas), multi-processados (rodam em máquinas com mais de um processador), e suportam aplicações em tempo real. A arquitetura do sistema operacional segue um esquema onde o componente central do sistema (núcleo ou kernel) interage diretamente com o hardware, ao mesmo tempo que fornece serviços, através de chamadas de sistema, para o shell, utilitários do próprio UNIX e aplicações. O núcleo do sistema operacional é o coração de todo o sistema. Suas funções básicas são: • interfaceamento direto com o hardware, fornecendo serviços de acesso ao hardware para o shell, utilitários do UNIX e aplicativos do usuário; • gerenciamento de usuários; • gerenciamento de arquivos e segurança; • serviços de rede; • contabilidade do sistema; • gerenciamento de erros; • gerenciamento de processos; • controle de interrupções e erros; 2 Sistema Operacional UNIX • serviços de entrada e saída (E/S). 3 Sistema Operacional UNIX 2. Uma Sessão UNIX Quando um usuário deseja trabalhar em um sistema UNIX, ele normalmente encontra o sistema já inicializado e pronto para o trabalho. As tarefas de inicialização do sistema, como o processo de boot e acerto de data e hora são executadas pelo administrador de sistema, normalmente chamado de superusuário, cujo nome de login é root. Toda sessão no UNIX começa com uma solicitação de um nome de login, que consiste em um identificador único dentro do sistema para cada usuário. Geralmente os nomes de logins são o primeiro ou o último nome das pessoas, ou ainda uma combinação destes. Após o usuário informar o seu login, uma senha é solicitada. Enquanto a senha é digitada ela não aparece na tela (figura 2.1). Cada usuário possui uma senha específica que pode ser por ele mudada a qualquer momento. Um detalhe a ser observado é que o UNIX faz distinção entre letras maiúsculas e minúsculas. Isto quer dizer que tanto o nome de login do usuário quanto sua senha devem ser digitados exatamente conforme foram cadastrados. Por exemplo, os usuários joao, Joao, joaO, e JOao são, para o sistema, usuários diferentes. Do mesmo modo, senhas que diferem em pelo menos um caractere maiúsculo/minúsculo são consideradas diferentes. Welcome to Linux 1.2.8 darkstar login: celso Password: --> login do usuário --> senha (não aparece na tela) Last login: Thu Mar 21 11:06:38 on tty1 Linux 1.2.8 (POSIX). --> mensagens do sistema You have new mail. --> prompt do sistema darkstar:~% Figura 2.1 - Exemplo de login de um usuário O superusuário é também o responsável por cadastrar os usuários, dando para cada um o nome de login correspondente, bem como uma senha, que o usuário pode mudar depois. Em alguns sistemas, a senha é deixada em branco, e o sistema solicita a mudança de senha na primeira vez em que o usuário se “logar”1. 1 O termo “logar” é largamente usado para descrever o processo do usuário entrar com seu nome de login e senha corretamente para ter acesso ao sistema. 4 Sistema Operacional UNIX Sempre que um usuário digita seu nome de login e senha corretamente, um shell é invocado e a partir dele o usuário passa a dar comandos e interagir com o sistema. O superusuário pode definir shells específicos para cada usuário. Todo shell possui alguns arquivos de configuração (semelhantes ao CONFIG.SYS e AUTOEXEC.BAT no MS-DOS). No C-Shell, o arquivo .cshrc define aliases (sinônimos) e paths (caminhos de procura em diretórios). O arquivo .login define características do terminal e outras variáveis de ambiente globais. No Bourne-Shell, o arquivo .profile serve para definir as configurações iniciais do usuário. No Korn-Shell, o arquivo .profile e o arquivo .kshrc (apesar de poder ser especificado outro em seu lugar) são os responsáveis pelas configurações iniciais. Vale a pena observar que cada usuário possui em sua área de disco seus próprios arquivos de configuração, ao invés de arquivos de configuração que servem “para todo mundo”, como ocorre no MS-DOS. Além do nome de login, um usuário no UNIX também pertence a um ou mais grupos de usuários. Os grupos no UNIX permitem que o controle de acesso a recursos seja definido como um todo para usuários que pertençam a grupos específicos, poupando o trabalho de especificar as permissões individuais de cada usuário uma a uma. O cadastro de um usuário no sistema implica numa conta (account). Uma conta envolve pelo menos três aspectos: • área de disco disponível; • permissões de acesso; • ambiente de trabalho. Podemos classificar as contas sob dois aspectos: • Quanto ao Uso: contas de usuário (uso pessoal); e contas de sistema (funções relacionadas ao sistema); • Quanto ao Acesso: contas comuns; contas privilegiadas (root, etc); e contas restritas. O superusuário (root) não tem nenhuma restrição, podendo ter pleno acesso a qualquer recurso do sistema, inclusive a áreas dos usuários comuns. Além disso pode tornar-se qualquer usuário. Algumas funções administrativas também estão disponíveis somente para o usuário root, enquanto outras podem ser delegadas a outros usuários. 5 Sistema Operacional UNIX 2.1. Ambiente Gráfico no UNIX O UNIX também possui um padrão para ambiente gráfico. Os sistemas mais antigos são baseados somente em caracteres, mas hoje praticamente qualquer sistema oepracional UNIX suporta o ambiente gráfico padronizado X11R6. O nome oficial desta última versão do ambiente gráfico do UNIX é X-Window System Version 11 Release 6. Esta plataforma define um ambiente gráfico básico, sem no entanto definir um gerenciador de janelas padronizado. Um gerenciador de janelas consiste em um software, rodando sobre o X11, que é responsável por gerenciar cada aplicação gráfica. O gerenciador de janelas é o responsável pelas funções de ajuste de tamanho de uma janela, minimização, maximização, etc. Entre os gerenciadores mais famosos podemos citar o Open Look, da Sun Microsystems Inc., e o Motif, desenvolvido na comunidade acadêmica. O uso do ambiente gráfico aumenta a produtividade do usuário, permitindo acesso e visualização de várias aplicações simultaneamente, de uma forma muito mais amigável. O uso do mouse é indispensável em um ambiente como este. O X11 segue a arquitetura cliente-servidor, onde as aplicações possuem a função de cliente, e o ambiente gráfico, de servidor. Neste modelo, o cliente faz solicitações ao servidor, que se encarrega de respondê-las. Como em qualquer aplicação cliente-servidor, o X11 permite que o servidor esteja em uma máquina e o cliente em outra. Assim, o X11 prevê que uma determinada aplicação gráfica esteja rodando em uma máquina, mas que sua visualização seja feita em outra. Neste caso, a máquina onde a aplicação está sendo visualizada é que roda o servidor X-Window, respondendo as requisições da aplicação X11 cliente rodando em uma máquina remota. Um cenário muito comum desta situação é instalar um software servidor X11 baseado em MS-Windows, de modo que o usuário de um PC possa visualizar em seu micro um software gráfico que rode somente em estações de trabalho de alto desempenho. 6 Sistema Operacional UNIX 3. Comandos Simples As seções a seguir descrevem os comandos básicos do UNIX e do shell. Na apresentação da sintaxe e exemplos dos comandos, as seguintes formatações de texto serão utilizadas: negrito: as palavras em negrito constituem o próprio comando e devem ser digitadas exatamente como estão escritas; normal: o texto normal é usado para opções dos comandos, e também deve ser digitado tal qual está escrito; itálico: o texto em itálico representa os parâmetros que o usuário especifica, como por exemplo uma opção de um comando; [colchetes]: todo o texto entre colchetes é opcional, e pode ser omitido. Os colchetes não devem ser digitados; ...: as reticências indicam que o item apresentado pode ser repetido uma ou mais vezes. opção1 | opção2: quado opções separadas por uma barra vertical são apresentadas, uma delas deve ser escolhida somente. A figura 3.1 exemplifica as notações acima, descrevendo o formato geral de um comando UNIX: 7 Sistema Operacional UNIX % comando [-opções ...] [argumentos ...] mais argumentos podem vir em seguida. geralmente são nomes de arquivos ou caminhos. outras opções de uma ou mais letras precedidas de hífen. opções de uma ou mais letras são precedidas de hífen. nome do comando. Para comandos também há distinção entre letras minúsculas e maiúsculas. prompt do shell ($ para Bourne Shell, % para C-Shell e # para usuário root) Figura 3.1 - Formato geral de um comando UNIX Nas seções seguintes, os comandos padrão do UNIX foram testados sob o sistema operacional Linux, instalado a partir de uma distribuição Slackware 2.0, com kernel 1.2.13. Os comandos do shell referem-se todos ao c-shell. 3.1. Manual de Referência - man pages A documentação padrão do UNIX, chamada de man pages, contém ajuda para todos os comandos padrão do UNIX. Para que o sistema também contenha man pages de utilitários e aplicações não-padrão do UNIX, estes devem encarregar-se de incluí-las durante sua instalação no sistema. O Manual de Referência do UNIX é dividido em oito seções: 1. comandos de usuários; 1. chamadas de sistema (para programadores); 1. bibliotecas de funções (para programadores); 1. formatos de arquivos especiais, drivers e hardware (para programadores); 8 Sistema Operacional UNIX 1. arquivos de configuração; 1. jogos e demonstrações; 1. comandos diversos; 1. comandos de administração do sistema. O comando man apresenta todas os tópicos do manual UNIX, de uma forma muito semelhante ao manual impresso. A interface com o usuário do man não é muito elaborada, e praticamente todos os fornecedores de UNIX incluem outras interfaces mais agradáveis de serem utilizadas. Entretanto, man é o utilitário de documentação padrão, e está presente em qualquer UNIX, além de seus comandos serem os mesmos em qualquer sistema. Sintaxe: man [seção] tópico man -k assunto Parâmetros: seção: indica uma das oito seções do manual a procurar. Serve para procurar um determinado tópico em uma seção específica do manual, do contrário o man apresenta o tópico encontrado na primeira seção onde ele existir; tópico: indica qual tópico procurar. O tópico deve ser exatamente o nome de comando, chamada de sistema, etc., exatamente como está no manual, do contrário o man não conseguirá encontrar as páginas correspondentes do manual; assunto: na segunda forma de uso do man, o assunto especifica a palavra que deve ser procurada nas várias páginas do man. O comando apresenta na tela todos os tópicos onde a palavra foi encontrada. Ao encontrar o tópico solicitado, o comando man aceita comandos diretamente do teclado. Os principais são: h: mostra a ajuda do man; q: sai do man; [N] e: avança uma linha, ou N linhas, quando especificado; 9 Sistema Operacional UNIX [N] y: volta uma linha, ou N linhas, quando especificado; f: avança uma tela; b: volta uma tela; / texto: procura por um texto no texto apresentado pelo man; n: repete a última procura no sentido para frente; N: repete a última procura no sentido para trás; g: vai para a primeira linha do texto; G: vai para a última linha do texto. 3.2. Data e Hora do Sistema - date Apresenta a data e a hora do sistema. O comando não possui nenhum argumento para usuários comuns. Somente o superusuário (root) pode passar como parâmetros a data e hora a serem atualizados. Sintaxe: date 3.3. Calendário - cal O comando mostra o calendário do mês correspondente à data atual do sistema, ou de um mês e ano especificados pelo usuário. Sintaxe: cal [mês [ano]] Parâmetros: mês: o parâmetro mês especifica qual calendário mostrar do ano corrente. O mês deve ser especificado na forma de dois dígitos, de 01 a 12. Se somente um parâmetro for especificado, o calendário completo daquele ano é apresentado. Se nenhum parâmetro for especificado, o calendário do mês corrente é 10 Sistema Operacional UNIX apresentado; ano: especifica de qual ano se quer o calendário. Deve ser especificado na forma de quatro dígitos. Exemplo: cal 08 1996 S 4 11 18 25 August 1996 M Tu W Th F 1 2 5 6 7 8 9 12 13 14 15 16 19 20 21 22 23 26 27 28 29 30 S 3 10 17 24 31 3.4. Limpar a Tela - clear O comando limpa a tela do terminal. Em um ambiente gráfico, clear limpa a tela do shell cuja janela está ativa. Sintaxe: clear 3.5. Informações Sobre Usuários - who O comando who exibe informações sobre usuários “logados” no sistema, incluindo o nome de login, data e hora de entrada no sistema. Permite também a alguém que encontre um terminal “logado” saber qual usuário que deixou sua conta “aberta”. Sintaxe: who [am i] whoami Parâmetros: am i: esta opção instrui o comando who a exibir informações de login do próprio usuário. whoami: este comando é uma derivação do comando who com as opções ‘am i’. 11 Sistema Operacional UNIX Ao invés de exibir nome de login, data e hora, exibe somente o nome de login do usuário. Exemplos: % who joao juca tty1 tty2 Mar Mar % who am i darkstar!celso 20 20 22:40 23:03 tty3 Mar 20 23:04 % whoami celso 3.6. Mudança de Senha - passwd O comando passwd permite a um usuário mudar sua própria senha. Além disso, o superusuário pode mudar a senha de qualquer usuário, especificando como parâmetro para passwd o login deste usuário. Alguns sistemas pedem a senha antiga antes de solicitarem a nova. Além disso, em algumas implementações o comando passwd não permite que a nova senha seja o próprio login do usuário ou uma parte do seu nome completo. Adicionalmente, alguns sistemas não permitem senhas com menos de seis caracteres, ou que não contenham pelo menos um dígito ou pelo menos uma letra maiúscula. Estes aspectos de segurança visam evitar que usuários não autorizados adivinhem senhas dos usuários do sistema. Sintaxe: passwd Exemplo: % passwd Changing password for celso Old password: New password: Retype new password: --> senhas não são ecoadas na tela 3.7. Informações Sobre o Usuário - id, chfn Um usuário pode requisitar informações sobre si próprio com o comando id. O comando id retorna o login do usuário, seu nome completo, seu diretório pessoal (home directory), o shell utilizado como padrão após o login, e os grupos a que pertence. 12 Sistema Operacional UNIX Sintaxe: id Exemplo: % id uid=501(zeca) gid=100(users) groups=100(users),200(laser) Um usuário pode mudar seu nome completo (full name) cadastrado no sistema. O comando chfn faz este trabalho, e permite também alterar outras informações sobre o usuário. Sintaxe: chfn Exemplo: % who am i zeca % chfn Changing finger information for user zeca Name [Zeca Xavier]: Zeca da Silva Xavier Office []: Casa da Luz Vermelha LTDA Office Phone []: 222-6666 Home Phone []: 224-2424 Finger information changed Um usuário pode pertence a um ou mais grupos de usuários. Para saber a que grupos um usuário pertence, utiliza-se o comando groups. Sintaxe: groups Exemplo: % groups users alunos 3.8. Comunicação com Outros Usuários - write e talk Em algumas situações é interessante a troca de mensagens entre usuários. Dois comandos do UNIX suprem esta necessidade: write e talk. Enquanto o comando write apenas envia uma mensagem para um usuário, sem que este precise responder a um chamado, o comando talk 13 Sistema Operacional UNIX envia uma mensagem ao usuário destinatário solicitando uma conversa interativa. Se este responder, é feita uma conexão, e a tela passa a ser dividida em duas partes, onde a parte superior da tela apresenta o que o usuário digita em sua máquina, e a parte inferior apresenta o que usuário remoto está digitando em seu terminal. Sintaxe: write usuário [tty] talk usuário [tty] Parâmetros: usuário: indica o login do usuário para quem se deseja enviar uma mensagem. Este parâmetro pode vir acompanhado do nome da máquina (host) onde o destinatário está “logado”. Neste caso, adiciona-se o caractere ‘@’ e em seguida o nome do host, sem nenhum espaço; tty: indica para qual terminal virtual do usuário a mensagem deve ser enviada. Um usuário pode estar “logado” em mais de um terminal se ele estiver utilizando um ambiente de janelas, ou se estiver em uma máquina que permita vários terminais virtuais diretamente do console do computador. Exemplos: % whoami celso % write zeca@darkstar tty2 Fala rapaz! Preciso falar contigo ainda hoje. Ate’ mais. ^D % talk joao@darkstar Em resposta à mensagem do primeiro exemplo, o usuário ‘zeca’ poderia responder com outro write para o usuário ‘celso’. No caso do segundo exemplo, o usuário ‘joao’ receberia a seguinte mensagem em sua tela: Message from Talk_Daemon at 2:14 ... talk: connection requested by [email protected]. talk: respond with: talk [email protected] Após o usuário ‘joao’ ter respondido ao talk do usuário ‘celso’, as telas dos usuários ‘celso’ e ‘joao’ ficariam respectivamente como nas figuras 3.8.1 e 3.8.2. 14 Sistema Operacional UNIX [Connection Established] Fala Joao. Como vai a vida? [Connection Established] ---------------------------------- ---------------------------------Fala Joao. Como vai a vida? Figura 3.8.2 - Tela do usuário ‘joao’ Para encerrar o talk, basta teclar CTRL+C. 3.9. Encerrando uma Sessão - exit e logout Diferentemente de sistemas mono-usuários como o MS-DOS, em um sistema multi-usuário como o UNIX cada usuário deve encerrar sua sessão explicitamente. No UNIX, dois comandos realizam esta tarefa: exit e logout. Enquanto o comando logout encerra de uma vez a sessão corrente do usuário, o comando exit encerra somente o shell de comandos corrente. Desse modo, é aconselhável sempre utilizar o comando exit ao invés de logout, pois pode haver uma situação em que o usuário tenha invocado um shell a partir do prompt de outro shell, e portanto deve-se sempre encerrar cada shell ativo para garantir que nenhuma informação ou processo fique pendente. Em alguns sistemas, é possível configurar a seqüência de teclas CTRL+D para funcionar como o comando logout. Muitos superusuários desabilitam esta capacidade para evitar que um CTRL+D acidental encerre uma sessão de um usuário. Em outros sistemas, o comando logout só pode ser utilizado no shell de login do usuário, isto é, no primeiro shell invocado para ele após o processo de login. Sintaxe: exit logout 15 Sistema Operacional UNIX 4. Shell Básico Todo shell em um sistema operacional precisa comunicar-se com o usuário através de dispositivos de entrada e saída. Da mesma forma, os programas normalmente utilizam-se de serviços do sistema operacional para a comunicação com o usuário. No UNIX, todo programa (inclusive o shell) possui pelo menos três dispositivos associados: entrada de dados padrão (stdin): este é o dispositivo onde os programas obtém dados de entrada para poderem executar suas tarefas. Na maior parte do tempo este dispositivo é o teclado do terminal. Entretanto comandos de redirecionamento do shell podem associar um arquivo como entrada de dados padrão. saída de dados padrão (stdout): é o dispositivo para onde normalmente enviam seus resultados, dados gerados de sua execução. Em geral, o monitor de vídeo do terminal é o dispositivo de saída padrão. Comandos de redirecionamento do shell podem associar um arquivo como a saída de dados padrão. saída de erros padrão (stderr): dispositivo para o qual mensagens e dados decorrentes de erros ocorridos na execução de programas são enviados. Normalmente o dispositivo de erros padrão é o mesmo da saída de dados padrão, mas é possível associar a saída de erros padrão para um arquivo, por exemplo. 4.1. Redirecionamento O redirecionamento consiste um recurso muito útil que permite que dados de saída de programas sejam armazenados em arquivos ou impressos, por exemplo, bem como que dados de entrada sejam obtidos de um arquivo, ao invés do teclado. Em qualquer shell do UNIX o redirecionamento da saída padrão é feito através do sinal de maior (‘>‘) diretamente na linha de comando do shell. Exemplo: % who > users redirecionando o comando who para o arquivo ‘users’ % cat users o comando cat exibe o conteúdo de um arquivo na saída padrão zeca tty1 Mar 25 02:02 1996 raimundo tty2 Mar 25 01:58 1996 joao tty5 Mar 25 02:03 1996 16 Sistema Operacional UNIX O redirecionamento da entrada padrão é feito através do sinal de menor (‘<‘), também na linha de comando do shell. Exemplo: % sort < users joao tty5 raimundo zeca tty1 o comando sort ordena os dados recebidos na entrada padrão, exibindo-os na saída padrão Mar 25 02:03 1996 tty2 Mar 25 01:58 1996 Mar 25 02:02 1996 Pode-se também combinar o redirecionamento de entrada e de saída simultaneamente. Exemplo: % sort < users > users2 % cat users2 joao tty5 Mar 25 02:03 1996 raimundo tty2 Mar 25 01:58 1996 zeca tty1 Mar 25 02:02 1996 O redirecionamento da saída padrão para um arquivo cria um novo arquivo ou sobrescreve-o se já existir um com o mesmo nome. Quando a intenção é concatenar a saída de um comando no final de um arquivo já existente, utiliza-se o operador de concatenação, dois sinais de maior (‘>>‘). Exemplo: % sort -r < users >> users2 % cat users2 joao tty5 Mar 25 02:03 raimundo tty2 Mar 25 zeca tty1 Mar 25 02:02 zeca tty1 Mar 25 02:02 raimundo tty2 Mar 25 joao tty5 Mar 25 02:03 o parâmetro -r do sort inverte a ordenação 1996 01:58 1996 1996 1996 01:58 1996 1996 A saída de erros padrão pode ser redirecionada utilizando o operador sinal-de-maior + ecomercial (‘>&’). Exemplo: % cat -abc >& error erro: não existe a opção -a para o comando cat % cat error cat: illegal option -a 17 Sistema Operacional UNIX 4.2. Filtros - tail, cat, wc, sort, cut Filtros são utilitários que lêem da entrada padrão, processam e escrevem na saída padrão. O propósito geral dos filtros é o de modificar a saída de outros comandos. Por isso, geralmente são utilizados em combinação com mais comandos, seja através de redirecionamento, seja através de pipes (vide seção seguinte). Exemplos de filtros: Tail: mostra na saída padrão uma quantidade de linhas de texto do final dos dados que recebe como entrada. Sintaxe: tail [+|- número] [-cn] [arquivo] Parâmetros: arquivo: arquivo de entrada do qual serão mostradas uma quantidade de linhas de texto de seu final. Se este parâmetro for omitido, tail lê da entrada padrão; + número: mostra arquivo a partir da linha número. Se o parâmetro número não for especificado, tail mostra as 10 últimas linhas de arquivo; - número: mostra as número últimas linhas de arquivo. Se o parâmetro número não for especificado, tail mostra as 10 últimas linhas de arquivo; -c, --bytes=tamanho: mostra os últimos tamanho caracteres (bytes). O parâmetro tamanho pode vir precedido de um multiplicador: b (512 bytes), k (1 Kilobyte), m (1 Megabyte); -n, -l, --lines =número: mostra as número últimas linhas. Exemplo: % tail -n 5 /etc/passwd % tail --lines=5 /etc/passwd Cat: lê e/ou grava dados da entrada e saída padrões. O comando cat é também usado para concatenar arquivos. Sintaxe: cat [arquivo ...] 18 Sistema Operacional UNIX Parâmetros: arquivo: arquivo de entrada a ser exibido na saída padrão. Se este parâmetro for omitido, cat lê da entrada padrão; Exemplo: % cat /etc/passwd % cat users >> teste mostra o conteúdo do arq. /etc/passwd adiciona o conteúdo de users em teste Wc: conta palavras dos dados da entrada padrão e apresenta o resultado na saída padrão. Sintaxe: wc [-lwc] [arquivo ...] Parâmetros: arquivo: arquivo de entrada cujas palavras, linhas ou caracteres serão contados e exibidos na saída padrão. Se este parâmetro for omitido, wc lê da entrada padrão; -l: conta as linhas; -w: conta as palavras; -c: conta os caracteres. Exemplo: % wc -l users conta o número de linhas do arq. users Sort: ordena os dados de entrada, escrevendo-os na saída. Sintaxe: sort [+número1 [-número2] ] [-mr] [-t separador] [arquivo ...] Parâmetros: arquivo: arquivo de entrada a ordenar, que após ordenado será exibido na saída padrão. Se este parâmetro for omitido, sort lê da entrada padrão; +número1: considera para ordenação a partir da posição número1, sendo a 1ª posição 0; 19 Sistema Operacional UNIX -número2: considera para ordenação até a posição número2, sendo a 1ª posição 0; -t separador: utiliza separador como caractere para as posições especificados em +número1 e -número2; -m: intercala dois arquivos já ordenados, escrevendo a intercalação na saída padrão; -r: inverte a ordem da classificação, de ascendente para descendente. Exemplo: considera para ordenação o 3º caractere após o 1º ‘:’ % sort +2 -t : users.txt Cut: Mostra colunas especificadas do texto recebido na entrada, apresentando o resultado na saída padrão. Sintaxe: cut [-b=bytes] [-c=caracteres] [-d=delimitador] [-f=campos] [arquivo ...] Parâmetros: arquivo: arquivo de entrada do qual se deseja “cortar” colunas. Se este parâmetro for omitido, cut lê da entrada padrão; -b=bytes: exibe somente os bytes especificados, separados por vírgulas; -c=caracteres: exibe somente os caracteres especificados, separados por vírgulas; -d: caractere a ser usado como delimitador entre campos, ao invés do caractere de tabulação; -f: campos (colunas) a serem exibidos, numerados a partir de 1. Para exibir mais de uma coluna, basta separá-las por vírgulas. Exemplo % cut -f=1,3 -d=: arquivo.txt Outros comandos, como por exemplo, who, ls, cd, mv, não são filtros, porque lêem e/ou escrevem em dispositivos que não os padrão. 20 Sistema Operacional UNIX 4.3. Pipes - Conexão de Utilitários O UNIX possui outro recurso muito poderoso, o chamado pipping, que permite conectar a saída de um comando na entrada de outro, sem limitação do número de conexões entre comandos, mas desde que cada um deles leia e escreva na saída padrão. Apenas o primeiro comando do pipe não precisa ler da entrada padrão, e o último não precisa escrever na saída padrão. O operador de conexão entre utilitários é a barra vertical (‘|’). Basta digitá-la na linha de comando entre os utilitários a serem conectados no pipe. Para ilustrar esta idéia, vejamos os comandos para contar o número de usuários atualmente “logados” no sistema: % who > users % wc -l users 3 % rm users --> o comando rm remove o arquivo temporariamente criado Utilizando piping, o mesmo resultado poderia ser obtido apenas com uma linha de comando do shell: % who | wc -l 3 A saída intermediária de um pipe pode ser capturada com o comando tee. Este comando lê da entrada padrão e escreve na saída padrão e nos arquivos especificados como padrâmetros. Basta conectar o comando tee dentro do pipe no ponto onde se quer capturar os dados. Sintaxe: tee [arquivo ...] Parâmetros: arquivo: nome do arquivo onde os dados recebidos pela entrada padrão serão capturados. O exemplo abaixo captura no arquivo ‘users’ os dados resultantes do comando who, antes de serem enviados ao comando sort: % who | tee users | sort 21 Sistema Operacional UNIX 4.4. Sinônimos de Comandos - Alias e Unalias O comando alias lista e define sinônimos de comandos UNIX. Os sinônimos permitem criar novos “comandos” que correspondem a qualquer linha de comando válida do shell. Sintaxe: alias [sinônimo “comando”] Parâmetros: sinônimo: o nome que se quer dar ao alias. comando: a linha de comando completa que corresponderá à palavra definida no argumento sinônimo. Geralmente utiliza-se aspas para delimitar comandos que incluem caracteres especiais, como os de redirecionamento e de piping. O comando alias sem argumentos exibe a lista de aliases do shell corrente. Exemplos: % alias dir ls -aCF dir . .. usr/ home/ % alias users “who | cut -c1-9 | sort” % users celso joao raimundo zeca O comando unalias serve para desfazer um sinônimo já existente. Sintaxe: unalias sinônimo Exemplo: % unalias dir % dir dir: Command not found --> mensagem do shell para comando não aceito 4.5. Histórico de Comandos - history Todo shell do UNIX mantém uma lista (história) dos últimos comandos digitados recentemente. Além disso, o shell fornece meios de rapidamente chamar um comando 22 Sistema Operacional UNIX armazenado na lista de comandos recentes. O comando history fornece a lista de comandos do usuário. Alguns shells apresentam a lista dos comandos desde que o shell foi invocado, enquanto outros apresentam uma lista armazenada em um arquivo que contém comandos de sessões anteriores do usuário no sistema. De qualquer forma, o comando history relaciona cada comando do histórico a um número, permitindo referência posterior ao comando pelo seu número na lista. Pode-se chamar um comando do histórico com o símbolo de exclamação (‘!’), de quatro formas diferentes: !!: último comando digitado; !n: comando número n; !string: comando mais recente que começa com a seqüência de caracteres string; !-n: n-ésimo comando a partir do último. O operador ‘!’ pode ser utilizado em qualquer posição da linha de comando do shell, combinado com outros caracteres no comando. Sintaxe: history Exemplos: % history 7 cat /etc/passwd 8 who 9 pwd 10 history % !! 8 who 9 pwd 10 history 11 history % !8 > users who > users % cat users raimundo tty2 Mar 25 01:58 1996 zeca tty1 Mar 25 02:02 1996 celso tty5 Mar 25 03:29 1996 O comando ainda se utiliza de uma variável de ambiente pré-definida (vide seção seguinte) 23 Sistema Operacional UNIX chamada history, que contém o número máximo de comandos a armazenar. No exemplo anterior, history=4. 4.6. Variáveis do Shell - set, unset, setenv, unsetenv As variáveis do shell do UNIX são semelhantes às do MS-DOS. O objetivo é armazenar algum valor que modifique o comportamento dos programas que as acessam, inclusive o próprio shell. As variáveis do shell definem sua configuração. Dois tipos de variáveis são possíveis no shell do UNIX: variáveis de ambiente e variáveis pré-definidas do shell. As variáveis de ambiente são de propósito geral, e visíveis tanto para o shell como para outros programas. As variáveis pré-definidas do shell são em geral de uso somente do próprio shell, definindo suas características. Há distinção entre letras maiúsculas e minúsculas nos nomes das variáveis. As variáveis cujos nomes possuem somente letras maiúsculas são variáveis de ambiente, enquanto as compostas somente de letras minúsculas são variáveis pré-definidas do shell. Principais variáveis de ambiente: HOME: diretório inicial do usuário; TERM: tipo do terminal em uso; PATH: diretórios onde procurar os comandos; USER: nome de login do usuário; PWD: diretório corrente; SHELL: shell padrão. Principais variáveis do pré-definidas do shell: cwd: diretório corrente;; history: número de comandos salvos na lista de history; ignoreeof: ignora EOF do terminal para o SHELL; path: lista de diretórios onde procurar os comandos; prompt: seqüência de prompt do SHELL. 24 Sistema Operacional UNIX Os comandos para manipulação de variáveis podem diferir de shell para shell. O C-Shell utiliza os comandos setenv e unsetenv para declarar e remover, respectivamente, uma variável de ambiente. Para variáveis pré-definidas, o C-Shell utiliza os comandos set e unset, respectivamente, para declarar e remover variáveis. O Bourne Shell utiliza somente os comandos set e unset para declarar e remover variáveis, respectivamente. Sintaxe: setenv [var conteúdo] unsetenv var set [var = conteúdo] unset var Parâmetros: var: nome da variável a ser declarada ou removida. conteúdo: valor a ser atribuído à variável. Os comandos setenv e set sem argumentos mostram a lista corrente de variáveis de ambiente e pré-definidas, respectivamente. 4.7. Controle de Execução - ps, kill, jobs, bg, fg A maioria dos shells dos UNIX atuais possui o recurso de controle de jobs (tarefas). Sistemas operacionais mais antigos excluíam esta função para que se tornassem mais simples. O controle de execução de processos é outro recurso poderoso do UNIX. Este recurso permite colocar em execução um número praticamente ilimitado de programas em execução a partir de um único shell. Além disso, processos demorados podem ser deixados em estado de background (segundo plano), permitindo ao usuário encerrar sua sessão UNIX para então analisar os resultados da execução na próxima vez que se ‘logar’ no sistema. Um programa é uma seqüência de instruções que realizam determinada tarefa, e que está armazenado em algum tipo de memória auxiliar, aguardando ser carregado e posto em execução. Um processo é um programa em estado de execução. 25 Sistema Operacional UNIX Assim, quando mais de um usuário está executando um determinado programa, existe um processo sendo executado para cada usuário que chamou aquele programa. O shell é um exemplo de programa que constantemente está sendo executado por mais de um usuário, e algumas vezes é executado mais de uma vez por um mesmo usuário (em um ambiente gráfico de janelas, por exemplo). 4.7.1. Lista de Processos - ps O comando ps mostra o status dos processos em execução no sistema. Sem argumentos, o comando ps exibe informações somente dos processos associados ao terminal corrente. A saída do comando consiste de: process-id (PID), identificador do terminal, tempo de execução (acumulativo) e o nome do comando. Sintaxe: ps [-aelux] Parâmetros -e: apresenta a linha de comando completa. -l: gera a saída em formato longo. -a: inclui informações sobre processos pertencentes a outros usuários. -u: produz saída orientada a usuário. -x: inclui processos não associados a terminais. Exemplo: % ps -aux USER COMMAND celso celso root root bdflush root root sendmail root celso -aux PID %CPU %MEM SIZE RSS TTY STAT START TIME 148 190 1 6 0.0 0.0 0.0 0.0 3.4 2.2 1.5 1.0 376 120 52 36 520 pp0 S 336 pp0 S 236 ? S 164 ? S 02:00 02:13 01:22 01:22 0:00 -bash 0:00 telnet 0:00 init 0:00 7 60 0.0 0.0 1.1 2.9 36 255 168 440 S S 01:22 01:22 0:00 update 0:00 192 238 0.0 0.0 3.5 1.5 388 85 528 pp1 S 228 pp1 R 02:13 02:37 0:00 -bash 0:00 ps ? ? 26 Sistema Operacional UNIX 4.7.2. Cancelando Processos - kill Se, por algum motivo, um usuário quiser cancelar um processo que lhe pertença, o comando kill fará o trabalho. Em geral, utiliza-se o comando kill para cancelar processos que aparentemente “travaram” e não conseguem terminar sua execução normalmente, ou ainda, para processos que não respondem ao CTRL+C para cancelamento de execução. Somente o superusuário pode “matar” processos de outros usuários. Sintaxe: kill [-sinal] pid ... kill -l Parâmetros: sinal: se este parâmetro não for especificado, o comando kill envia o sinal 15 (terminate) para os processos especificados pelo parâmetro pid. Se um nome de sinal ou um número precedido de ‘-’ é dado, este é enviado ao invés do sinal TERM (terminate). Quando deseja-se cancelar um processo que não responde ao kill padrão (sinal 15), utiliza-se o sinal 9 (KILL). pid: o parâmetro pid especifica o process-id correspondente ao processo que se deseja enviar um sinal. Para descobrir o PID de um processo, basta utilizar o comando ps e olhar na coluna PID o número correspondente ao processo desejado. -l: invocando kill com a opção ‘-l’, é apresentada a lista dos nomes de sinais aceitos pelo comando. Exemplo: % ps PID TTY STAT TIME COMMAND 148 pp0 S 0:00 -bash 241 pp0 T 0:00 telnet 242 pp0 R 0:00 ps % kill -9 241 % [1]+ Killed telnet 4.7.3. Execução em Background e Controle de Jobs - bg e fg Uma das habilidades do UNIX é a de executar processos em background, liberando a linha de 27 Sistema Operacional UNIX comando para o usuário imediatamente. Por exemplo, o usuário poderia querer copiar um determinado arquivo para disquete, enquanto continua pesquisando seus diretórios por outros arquivos para copiar. A maneira mais simples de colocar um processo em background é adicionar o operador e-comercial (‘&’) ao final da linha de comando: Exemplo: % mcopy teste.txt a: & mcopy copia um arquivo para um disco MS-DOS % ls docs o usuário pode invocar outros comandos [1]+ Done mcopy teste.txt a: o shell avisa o término do comando em background Pode-se também suspender a execução de um processo pressionando-se as teclas CTRL+Z, como no exemplo abaixo: % mcopy teste.txt a: ^Z [1]+ stopped mcopy teste.txt a: Para descobrirmos quais os processos que estão sendo executados em background ou que estão parados (suspensos), utilizamos o comando jobs. Sintaxe: jobs Exemplo: % jobs [1] + mcopy teste.txt a: [2] - more /etc/passwd stopped Outro método para colocar um processo em background consiste em primeiramente parar a execução deste, através do das teclas CTRL+Z, e em seguida dar o comando bg. Sintaxe: bg [%n] Parâmetros: n: refere-se ao número do job desejado. Use o comando jobs para descobrir o número de um job. Se este parâmetro não for especificado o valor 1 é assumido. 28 Sistema Operacional UNIX Para colocar um job novamente em foreground (primeiro plano), basta usar o comando fg. Sintaxe: fg [%n] Parâmetros: n: refere-se ao número do job desejado. Use o comando jobs para descobrir o número de um job. Se este parâmetro não for especificado o valor 1 é assumido. Exemplo: % mcopy teste.txt a: ^Z [1]+ stopped mcopy teste.txt a: % jobs [1] + more /etc/passwd stopped [2] - mcopy teste.txt a: stopped % bg %2 mcopy teste.txt a: & % fg more /etc/passwd 29 Sistema Operacional UNIX 5. Sistema de Arquivos do UNIX No sistema operacional UNIX, costuma-se dizer que “tudo” é arquivo. Isto se deve ao fato do sistema operacional tratar uniformemente arquivos comuns e dispositivos do sistema. Dessa forma, operações de E/S (entrada e saída) com arquivos e com dispositivos não são distintas a nível de usuário. Um determinado usuário pode, por exemplo, copiar um arquivo para um diretório, como pode copiá-lo para o dispositivo impressora, já que uma impressora está presente no sistema sob a forma de um arquivo especial, que é tratado como um arquivo qualquer. O sistema de arquivos do UNIX é hierárquico, distribuindo os vários arquivos em uma árvore de diretórios. A base desta árvore é um diretório chamado diretório raiz, que possui o nome especial de / (o caractere barra). Enquanto outros sistemas operacionais consideram discos individualmente, cada um possuindo seu diretório raiz, arquivos e subdiretórios, o UNIX considera todos os dispositivos, discos, arquivos e diretórios como um todo, alocando-os na mesma árvore do sistema de arquivos. Assim, o usuário não precisa especificar o disco ou dispositivo onde está um arquivo, somente o diretório onde ele está armazenado. O próprio sistema operacional se encarrega de mapear o acesso ao disco ou dispositivo correspondente. A figura 5.1 ilustra uma árvore de diretórios típica de um sistema UNIX. / (raiz) bin etc usr tmp home dev bin include lib spool joao zeca Figura 5.1 - Árvore de Diretórios Típica no UNIX Geralmente a árvore de diretórios em um sistema UNIX é mais ou menos padronizada, como na figura 5.1, sendo que cada diretório armazena tipicamente arquivos segundo sua função: /bin - Utilitários principais do UNIX; /dev - Arquivos especiais de dispositivo; 30 Sistema Operacional UNIX /etc - Programas e arquivos administrativos; /lib - Bibliotecas de funções, programas e dados; /tmp - Arquivos temporários; /home/joao - Arquivos do usuário “joao”; /usr/bin - Outros utilitários do UNIX; /usr/include - Arquivos de cabeçalho (por exemplo da linguagem C); /usr/lib - Bibliotecas de funções; /usr/spool - Áreas de spool (por exemplo de mail e impressora). Os arquivos são dinâmicos, isto é, não possuem tamanho previamente determinado. Quanto à estrutura interna dos arquivos, o UNIX não faz nenhuma restrição. Um arquivo pode conter qualquer seqüência de bytes. A segurança de acesso a arquivos e diretórios é provida através de um esquema de posse de arquivos e de permissões de acesso a estes. Cada arquivo possui um usuário dono do arquivo, bem como um grupo dono. Os conceitos de usuário e grupo serão vistos mais à frente. As seções seguintes discutem os aspectos de proteção e acesso a arquivos. Os nomes de arquivos podem ter quantidades máximas de caracteres diferentes para sistemas operacionais diferentes. Nos UNIX tradicionais (System V), o limite é 14 caracteres. Nos UNIX baseados no BSD, o limite é 256 caracteres. 5.1. Posses de Arquivos - chown, chgrp O conceito de “donos” de arquivos no UNIX é um pouco mais complexo do que na maioria dos outros sistemas operacionais. Um arquivo no UNIX possui tanto um usuário dono, quanto um grupo dono do arquivo. Apesar de usualmente o usuário dono de um arquivo pertencer ao grupo dono do mesmo arquivo, isso não é obrigatório. Um arquivo pode ter um usuário dono que não tenha nenhuma ligação com seu grupo dono. Assim, as permissões de acesso para grupo em um arquivo não se aplicam ao grupo ao qual pertence o usuário dono do arquivo, e sim aos usuários que pertencem ao grupo dono do 31 Sistema Operacional UNIX arquivo. A flexibilidade neste esquema se dá devido ao fato de que um usuário pode pertencer a vários grupos. Dessa forma, pode-se atribuir direitos para um usuário acessar determinado conjunto de arquivos apenas acrescentando-o ao grupo dono do conjunto de arquivos. É claro que as restrições de acesso dependerão das permissões para grupo definidas para cada arquivo em questão. Para uma exemplificação mais concreta, suponha que o usuário zeca, que pertence ao grupo programador, precise acessar alguns arquivos normalmente acessados por usuários do grupo professores. Há várias maneiras de permitir este acesso: Criar cópias dos arquivos para o usuário zeca. Entretanto, se os arquivos originais forem modificados, as cópias deverão ser atualizadas. Por outro lado, se o usuário zeca fizer suas próprias alterações na suas cópias dos arquivos, os arquivos originais precisarão ser atualizados também; Fazer com que os arquivos desejados pelo usuário zeca tenham permissão de acesso para qualquer usuário. O problema é que outros usuários poderão também acessar os arquivos; Fazer o usuário zeca ser um membro do grupo professores. Esta é a melhor alternativa, e também a mais simples. Ela envolve apenas mudar o arquivo de configuração de grupos para adicionar o usuário zeca ao grupo professores. As permissões nos arquivos não precisam ser modificadas, uma vez que já existe permissão para acesso dos usuários do grupo professores. Operações administrativas como a adição de um usuário a um grupo somente podem ser feitas pelo superusuário, ou por outros usuários que tenham acesso ao arquivo de configuração de grupos. Operações de mudança de dono de arquivo ou dono de grupo também só podem ser executadas pelo superusuário (comando chown). Em algumas versões do UNIX (System V), o usuário dono de um arquivo pode mudar seu usuário e grupo donos. Um usuário pode, entretanto, mudar o grupo de um arquivo, desde que ele seja o usuário dono do arquivo e pertença ao novo grupo do arquivo. O comando que faz essa mudança é o chgrp. Sintaxe: chgrp [-f] [-R] grupo arquivo Parâmetros: 32 Sistema Operacional UNIX arquivo: arquivo a mudar o grupo dono; grupo: nome do novo grupo dono do arquivo. O usuário deve pertencer ao grupo especificado; -f: não reporta erros caso ocorram, como por exemplo, o usuário não pertencer a grupo; -R: executa o comando recursivamente, aplicando-se a todos os sub-diretórios. Exemplo: % groups users alunos % chgrp alunos teste3.doc O comando chown tem formato idêntico ao chgrp, mas somente o superusuário pode executá-lo na maioria dos sistemas. 5.2. Proteção de Arquivos Uma vez que as posses de arquivos estão definidas, o próximo passo é proteger os arquivos de acessos não desejados. A proteção em um arquivo no UNIX é muitas vezes referida como o modo do arquivo. 5.2.1. Tipos de Acesso a Arquivos O UNIX suporta três tipos de acesso a arquivos e diretórios: leitura, escrita, e execução, designados, respectivamente, pelas letras r (read), w (write), x (execute). Estas permissões têm significados diferentes para arquivos e para diretórios, conforme a tabela 5.2.1.1 abaixo. Acesso Significado em Arquivos Significado em Diretórios r Ver conteúdo do arquivo Listar o conteúdo do diretório w Alterar conteúdo do arquivo Alterar conteúdo do diretório (apagar arquivos, criar novos arquivos) x Rodar um arquivo executável Tornar corrente o diretório (entrar no diretório) Tabela 5.2.1.1 - Tipos de Acesso a Arquivos O uso dos tipos de acesso é bastante simples. Se a intenção é deixar o arquivo somente diponível para leitura, o acesso r resolve a questão. O acesso w permite ao usuário apagar ou 33 Sistema Operacional UNIX modificar o arquivo. Entretanto, para modificar o arquivo a permissão de leitura também deve estar habilitada, caso contrário o usuário não conseguirá ler o arquivo para que possa ser modificado. Se o arquivo for um programa executável ou um shell script, a permissão x deve estar ligada para que o usuário consiga executá-lo. Se o arquivo for um shell script, a permissão de leitura deve também estar habilitada, pois o shell precisa ler o arquivo para poder executar suas instruções. Para programas executáveis basta a permissão de execução. Para ver as permissões de um arquivo ou diretório, basta utilizar o comando ls com a opção -l (long listing), que mostra todos os detalhes dos arquivos. O comando ls será discutido em maiores detalhes mais adiante. Vale observar que para remover um arquivo em um determinado diretório, basta que se tenha permissão de escrita (w) naquele diretório, mesmo que o referido arquivo não possua permissão de escrita. Isto ocorre porque na verdade, para o sistema de arquivos do UNIX, um diretório nada mais é do que um arquivo especial que contém a lista de arquivos que ele contém, com seus respectivos i-nodos (veja sobre i-nodos na seção seguinte). Assim, se um usuário pode escrever em um diretório (que é um arquivo especial), ele pode modificá-lo, retirando a entrada correspondente a um arquivo. Se acontecer de um determinado arquivo não possuir permissão de escrita mas seu diretório correspondente sim, o que o UNIX faz é perguntar ao usuário se deseja remover o arquivo, mesmo que este não tenha permissão de escrita. O exemplo abaixo supõe o arquivo protegido sem permissão de escrita, em seu diretório pai arquivos com permissão de escrita para o usuário joao. % ls -l --> lista os arquivos com detalhes total 3 -rwxr-xr-x 1 root system 120 Mar 12 09:32 bronze -r--r--r-- 1 joao users 1452 Apr 20 10:40 prata drwx------ 2 joao users 1024 Apr 21 07:30 arquivos % cd arquivos --> entra no diretório % ls -l total 2 -r--r----- 1 joao users 23 Apr 21 07:31 protegido -rwxrwxrwx 1 joao users 157 Apr 21 07:31 desprotegido % rm desprotegido --> remove sem nenhum aviso % rm protegido --> pede confirmação para remover o arquivo rm: override protection 440 for protegido? y 5.2.2. Classes de Acesso a Arquivos O UNIX define três classes de acesso a arquivos cujos acessos podem ser especificados separadamente: 34 Sistema Operacional UNIX Acesso para o usuário (u): define permissões para o usuário dono do arquivo; Acesso para o grupo (g): define permissões para o grupo a que pertence o arquivo; Acesso para outros (o): define permissões para outros usuários que não sejam o dono e que não pertençam ao grupo dono do arquivo. Quando usamos o comando ls -l, obtemos a listagem dos arquivos com todos seus detalhes. A primeira informação corresponde ao que chamamos de modo do arquivo, composto de 10 caracteres. A tabela 5.2.2.1 explica o significado de cada caractere no modo do arquivo. Tipo do Arquivo Acesso ao Usuário (u) Acesso ao Grupo (g) Acesso a Outros (o) — r w x r w x r w x Posição do Caractere 1 2 3 4 5 6 7 8 9 10 Acesso de Leitura (r) — • Acesso de Escrita (w) — Acesso de Execução (x) — • • • • • • • • Tabela 5.2.2.1 - Interpretando Modos de Arquivos O primeiro caractere do modo do arquivo apenas indica seu tipo. Os 9 caracteres seguintes constituem três grupos de três caracteres. Em cada grupo, o primeiro caractere representa a permissão de leitura (r), o segundo a de escrita (w) e o terceiro a de execução (x). Se a permissão estiver desligada, um hífen (-) é apresentado, senão o caractere correspondente aparece. 5.2.3. Ajustando Permissões de Arquivos - chmod Para ajustar permissões em arquivos e diretórios (que é um arquivo que contém uma lista de arquivos), utilizamos o comando chmod. Sintaxe: chmod string-de-acesso[, ...] arquivo ... Parâmetros: 35 Sistema Operacional UNIX string-de-acesso: as strings de acesso definem que permissões serão dadas aos arquivos especificados no argumento arquivo do comando chmod. A figura 5.2.3.1 descreve como construir o argumento string-de-acesso; arquivo: os nomes dos arquivos cujas permissões serão mudadas. Classe de Acesso Um ou mais entre: u g o a (para todos os 3) ... + Operador Um entre: + (Adiciona acesso especificado) - (Remove acesso especificado) = (Ajusta para acesso especificado) Tipo de Acesso Um ou mais entre: + r w x ... Figura 5.2.3.1 - String de Acesso do Comando chmod Exemplo: % ls -l teste ---------- 1 zeca users % chmod u+w teste % ls -l teste --w------- 1 zeca users % chmod a+w teste % ls -l teste --w--w--w- 1 zeca users % chmod g+x,uo+r-w teste % ls -l teste -r---wxr-- 1 zeca users % chmod u=rwx teste % ls -l teste -rwx-wxr-- 1 zeca users 23 Apr 21 07:31 teste 23 Apr 21 07:31 teste 23 Apr 21 07:31 teste 23 Apr 21 07:31 teste 23 Apr 21 07:31 teste As permissões de acesso podem também ser especificadas numericamente com o comando chmod, ao invés de usar uma string-de-acesso (modo simbólico) como parâmetro. Para calcular o modo absoluto de um arquivo, basta substituir os 9 caracteres correspondentes às permissões, por 9 bits (dígitos 0 ou 1), que agrupados três a três e convertidos para decimal compõem um modo de acesso de três dígitos. Exemplo de uma conversão: Classe de Acesso usuário grupo outros Modo do Arquivo r w x r w x r w x Convertido para Binário 1 1 1 1 0 1 1 0 0 Convertido para Decimal 7 5 4 36 Sistema Operacional UNIX Modo absoluto (numérico) 754 Tabela 5.2.3.1 - Conversão de Modo Simbólico para Absoluto Assim, no exemplo abaixo, os dois comandos chmod são equivalentes: % chmod u=rwx,g=rx,o=r arq_teste % ls -l arq_teste -rwxr-xr-- 1 zeca users % chmod 754 arq_teste % ls -l arq_teste -rwxr-xr-- 1 zeca users 23 Apr 21 07:31 arq_teste 23 Apr 21 07:31 arq_teste 5.3. Mapeamento de Arquivos para Discos No sistema de arquivos do UNIX, cada arquivo possui um descritor único: i-nodo (i-node). Um i-nodo é a estrutura de dados no disco que descreve e armazena os atributos de um arquivo, incluindo sua localização. Quando uma partição em um disco é inicialmente preparada para aceitar arquivos, um número específico de i-nodos é criado. Este número passa a ser o número máximo de arquivos, de todos os tipos, que a partição poderá armazenar, incluindo diretórios, arquivos especiais (dispositivos), e ligações (links) para outros arquivos. Em geral, o número de i-nodos criado é suficiente para armazenar uma quantidade de arquivos de tamanho entre 2 KB a 8 KB que ocupem toda a partição. As principais informações que são armazenadas nos i-nodos são: identificadores de posse do arquivo para usuário e grupo; tipo de arquivo (regular, diretório, etc., ou 0 se i-nodo não usado); modos de acesso (permissões); data e hora da criação, acesso e última modificação do arquivo; data e hora da modificação do i-nodo; número de links para o arquivo (veja sobre links adiante); tamanho do arquivo; endereços físicos que indicam as localizações exatas em disco dos blocos que compõem o arquivo. 37 Sistema Operacional UNIX Os i-nodos não armazenam o nome e localização na árvore de diretórios de seus arquivos correspondentes. Os i-nodos podem estar armazenados em qualquer local físico no disco. 5.4. Tipos de Arquivos Em sistemas UNIX, é seguro dizermos que tudo é um arquivo: até mesmo a memória física da máquina é acessada pelo núcleo do sistema operacional como um arquivo especial. Por isso, existem diversos tipos de arquivos para diferentes funções: Arquivos regulares: arquivos normais que contenham dados ASCII ou binários, programas executáveis ou partes de programas executáveis carregadas dinamicamente durante a execução. Normalmente chamamos arquivos regulares simplesmente de “arquivos”; Diretórios: um diretório consiste em um arquivo binário cujo conteúdo é uma lista dos arquivos que ele contém, juntamente com cada i-nodo correspondente. Um diretório pode conter outros diretórios; Arquivos especiais: constituem o mecanismo para a comunicação de E/S entre o sistema operacional e os dispositivos. Estes arquivos ficam armazenados sob o diretório /dev e podem ser baseados em blocos ou caracteres; Links (ligações): um link é um mecanismo que permite que vários nomes de arquivos façam referência a um mesmo arquivo em disco. Existem dois tipos de links: os links simbólicos e os hard links. A seção seguinte aborda a criação de links; Sockets: um socket é um tipo especial de arquivo usado para comunicação entre processos, inclusive para processos rodando em diferentes máquinas conectadas a uma rede de computadores; Named pipes: são um tipo especial de arquivos também para a intercomunicação entre processos, e residem também sob o diretório /dev. O comando ls com a opção long listing (ls -l) mostra todos os detalhes dos arquivos, inclusive seu tipo (o primeiro caractere apresentado, antes do modo do arquivo). Para cada tipo de arquivo, existe um caractere correspondente (tabela 5.4.1). 38 Sistema Operacional UNIX Símbolo do Tipo do Arquivo d l b c s p Significado Arquivo normal ou hard link Diretório Link simbólico Arquivo especial bloco Arquivo especial caractere Socket Named pipe Tabela 5.4.1 - Tipos de Arquivos no UNIX O exemplo abaixo apresenta uma listagem de arquivos, contendo um arquivo de cada tipo. Note que o arquivo hlink.dat é um hard link para gold.dat (observe as permissões, donos, tamanho, data e hora), enquanto zn.dat é um link simbólico que aponta para o arquivo gold.dat. -rw------- 2 zeca users 28 Mar 12 -rw------- 2 zeca users 28 Mar drwx------ 2 zeca users 512 Mar lrwxrwxrwx 1 zeca users 8 Mar brw-r----- 1 root system 0 Mar crw-r----- 1 root system 0 Jun srw-rw-rw- 1 root system 0 Mar prw------- 2 root system 0 Mar 11:36 gold.dat 12 11:36 hlink.dat 12 11:36 old_data 12 11:37 zn.dat -> gold.dat 2 15:02 /dev/sd0a 12 1989 /dev/rsd0a 11 08:19 /dev/log 11 08:32 /usr/lib/cron/FIFO 5.4.1. Links e o comando ln No UNIX, os links permitem que diversos nomes de arquivos refiram-se a um mesmo arquivo no disco. Enquanto os hard links associam dois nomes de arquivo a um mesmo i-nodo, um link simbólico é um arquivo especial que contém o caminho completo da árvore de diretórios até o arquivo destino. O comando ln serve para criar ambos os tipos de links. Sintaxe: ln [-s] origem link Parâmetros: -s: esta opção indica que o link a ser criado é simbólico; origem: o nome do arquivo para onde o link fará referência; link: o nome do link sendo criado. Exemplo: 39 Sistema Operacional UNIX % ls -l -rw------- 1 zeca users % ln index hlink % ln -s index slink % ls -l -rw------- 2 zeca users -rw------- 2 zeca users lrwxrwxrwx 1 zeca users 5228 Mar 12 11:36 index 5228 Mar 12 11:36 index 5228 Mar 12 11:36 hlink 5 Mar 12 11:37 slink -> index Observe que no exemplo acima, os arquivos index e hlink ficaram com número de links, permissões, donos, tamanho, data e hora idênticos. Por outro lado, o arquivo slink foi criado com outras permissões, e possui tamanho e data e hora diferentes. O resultado do comando ls -l mostra inclusive para onde aponta o arquivo slink. Quando um link simbólico é criado, suas permissões são 777, e não podem ser mudadas com chmod. Vale ainda obervar que o número de links (segundo campo na listagem dos arquivos) para os arquivos index e hlink é 2, e não 3, portanto não contando os links simbólicos no número de links. Outra observação é que na verdade o arquivo slink é um arquivo texto de 5 caracteres, exatamente os 5 caracteres do nome para o qual aponta, index. 40 Sistema Operacional UNIX 6. Operações com o Sistema de Arquivos Conforme já vimos, o sistema de arquivos do UNIX está estruturado sob uma única árvore de diretórios. O diretório inicial do sistema, chamado de diretório raiz e representado por um caractere / (barra), contém arquivos e outros diretórios que compõem o sistema de arquivos. Em um determinado momento, um usuário tem associado a seu shell um diretório corrente, ou seja, o diretório em que o usuário se encontra naquele momento. Sob ambientes gráficos ou em algumas versões de UNIX baseadas em PCs, é possível ter vários shells em uso. Cada shell pode ter um diretório corrente independente dos outros. Cada usuário possui também um diretório próprio para armazenar seus arquivos. Este diretório é chamado de diretório home do usuário, e geralmente tem o mesmo nome do login name do usuário. Na figura abaixo, os diretórios home dos usuários “zeca” e “joao” são, respectivamente, “/home/zeca” e “/home/joao”. Normalmente, logo após o início de uma sessão UNIX, o diretório corrente do usuário fica sendo seu próprio diretório home. Figura 6.1 - Diretórios home dos usuários “zeca” e “joao” 6.1. Caminhos de Diretórios (paths) Um caminho de diretórios especifica uma seqüência de diretórios a percorrer para chegar a algum ponto na árvore de diretórios do sistema de arquivos. Para que se possa caminhar entre os diretórios, cada vez que se cria um diretório no UNIX, diretórios especiais são criados dentro deste: os diretórios “.” e “..”. O único diretório que não possui estes diretórios especiais é o diretório raiz (“/”). O diretório “.” referencia o diretório corrente, enquanto o “..” faz referência a seu diretório pai na árvore de diretórios. 41 Sistema Operacional UNIX Na especificação de caminhos, a separação entre os vários diretórios que compõem o caminho é feita com o caractere “/”. Por exemplo, de acordo com a figura 6.1 acima, o caminho para chegar ao diretório home do usuário “joao” é “/home/joao”. Uma especificação de diretórios deste tipo é chamada de caminho absoluto, pois não importa qual seja o diretório corrente, “/home/joao” sempre leva ao diretório home do usuário “joao”. Por outro lado, especificações de diretório podem ser do tipo caminho relativo, onde a referência a um diretório é feita baseada no diretório corrente. Por exemplo, baseando-se na árvore de diretórios da figura 6.1, se o diretório atual fosse “/home/joao”, poderíamos fazer referência ao diretório home do usuário “zeca”, utilizando o caminho relativo “../zeca”. O caminho absoluto para o mesmo diretório seria “/home/zeca”. 6.2. Manipulação de Diretórios - cd, pwd, ls, mkdir, rmdir Como vimos, em um dado momento um usuário possui associado um diretório corrente. O comando pwd (print working directory) permite saber qual é o diretório corrente, imprimindo na tela o caminho completo para o diretório atual. Sintaxe: pwd Exemplo: % pwd /home/joao Para caminhar pela árvore de diretórios, utilizamos o comando cd (change directory). O comando cd serve apenas para mudar o diretório corrente, e tem a seguinte sintaxe: Sintaxe: cd [diretório] Parâmetros: diretório: o argumento diretório especifica o novo diretório corrente. Antes de executar a mudança de diretório corrente, as permissões de acesso são verificadas. Se o parâmetro diretório for omitido, o comando cd muda para o diretório home do usuário. 42 Sistema Operacional UNIX Exemplo: % pwd /home/joao/mails/web % cd /home/zeca sh: /home/zeca: permission denied % cd ../.. % pwd /home/joao Uma vez dentro de um determinado diretório, podemos ver seu conteúdo com o comando ls. Vale observar que no UNIX os arquivos são ocultos quando começam com um “.” (ponto). Pode-se utilizar os caracteres “?” e “*” como curingas para especificar vários arquivos. Enquanto o caractere “?” substitui um caractere no nome do arquivo, o “*” substitui qualquer quantidade de caracteres no nome de arquivo. Sintaxe: ls [-aCFlgit] [nome_arquivo] Parâmetros: nome_arquivo: se nome_arquivo é um diretório, ls lista seu conteúdo, caso contrário lista o arquivo com este nome, incluindo informações adicionais de acordo com as opções especificadas. Se este argumento não for especificado, ls lista o diretório corrente; -a: lista todas as entradas, incluindo as que iniciam com “.” (ocultas); -C: força saída com múltiplas colunas. Esta opção é padrão para alguns tipos de terminais; -F: exibe caracteres no final dos nomes dos arquivos para fácil visualização de seu tipo: “/” para diretório, “*” para executáveis e “@” para links); -l: listagem com formato longo, incluindo o tipo do arquivo (veja seção 5.4), o modo do arquivo, o número de links, o grupo e usuário donos, tamanho em bytes, e hora/data da última modificação; -g: inclui o nome do grupo na listagem longa; -i: inclui o número do i-node de cada arquivo na listagem; -t: ordena por data de alteração. Normalmente, os arquivos são listados em ordem 43 Sistema Operacional UNIX alfabética. A criação de diretórios é feita através do comando mkdir. Cada vez que um diretório é criado, as entradas especiais “.” (o próprio diretório) e “..” (o diretório pai) são criadas. Para que um diretório possa ser criado, o usuário deve ter permissão de escrita no diretório pai do diretório a ser criado. Sintaxe: mkdir [-p] nome_diretório Parâmetros: nome_diretório: o nome do diretório a ser criado, incluindo o caminho, quando necessário; -p: a opção -p permite que nome_diretório seja criado sob um diretório pai inexistente (especificado como caminho junto a nome_diretório). Exemplos: % pwd /home/zeca % mkdir /home/zeca/cartas % cd cartas % mkdir /home/zeca/textos/ingles mkdir: cannot make directory `/home/zeca/textos: No such file or directory % mkdir -p ../textos/ingles Para remover um diretório, utilizamos o comando rmdir. Sintaxe: rmdir nome_diretório Parâmetros: nome_diretório: o nome do diretório a remover. O diretório somente é removido se estiver vazio, e se o usuário possuir permissão de escrita no diretório pai. Exemplos: % ls cartas textos 44 Sistema Operacional UNIX % rmdir cartas % rmdir textos rmdir: textos: Directory not empty % rmdir textos/ingles % rmdir textos 6.3. Manipulação de Arquivos - cat, cp, mv, rm Em qualquer sistema operacional, o shell deve ser capaz de oferecer as operações básicas com arquivos: visualizar o conteúdo de arquivos; copiar/mover arquivos; renomear arquivos; apagar arquivos. No UNIX, o comando para visualizar arquivos é o cat. Conforme visto nos exemplos da seção 4, o comando cat pode ter sua entrada e sua saída redirecionadas. Sintaxe: cat [-] [nome_arquivo ...] Parâmetros: nome_arquivo: nome de arquivo cujo conteúdo vai ser exibido (ou redirecionado). Se vários nome_arquivo forem especificados, eles serão lidos um a um e apresentados na saída padrão. Se nenhum argumento for dado, ou se o argumento “-” for utilizado, o comando cat lê caracteres da entrada padrão. Quando a entrada padrão é um terminal, o texto é terminado com um CTRL+D (caractere EOF). Exemplo: % cat > texto.txt lê do teclado e grava em texto.txt Isto é um teste do cat. ^D % cat texto.txt Isto é um teste do cat. Copiamos arquivos com o comando cp. Este comando pode copiar arquivos para um arquivo destino com outro nome, copiar os arquivos de um diretório para outro diretório, ou copiar 45 Sistema Operacional UNIX arquivos para um diretório. Sintaxe: cp [-] [-ifprR] fonte ... destino Parâmetros: fonte: um ou mais arquivos ou diretórios fonte; destino: arquivo ou diretório destino. Se destino existir, este é sobrescrito, preservando suas permissões, data e hora; -: faz com que os parâmetros seguintes sejam interpretados como nomes de arquivos, permitindo assim especificar arquivos que comecem com “-”; -i: pede uma confirmação para sobrescrever o arquivo destino, caso já exista um com o mesmo nome; -f: não exibe mensagens de confirmação para sobrescrever arquivos; -p: copia também as permissões, data e hora para destino; -r, -R: copia recursivamente se fonte for um diretório. Exemplo: % cp teste.txt ../textos/teste2.txt % cp textos/teste* . % cp -r ./cartas ./textos De forma muito semelhante ao comando cp, o comando mv move arquivos para outros diretórios, inclusive trocando de nome. O comando mv é, portanto, o comando para renomear arquivos. Sintaxe: mv [-] [-fi] fonte ... destino Parâmetros: fonte: um ou mais arquivos ou diretórios fonte; destino: arquivo ou diretório destino. Se destino existir, este é sobrescrito; -: faz com que os parâmetros seguintes sejam interpretados como nomes de 46 Sistema Operacional UNIX arquivos, permitindo assim especificar arquivos que comecem com “-”; -f: não exibe mensagens de confirmação para sobrescrever arquivos; -i: pede uma confirmação para sobrescrever o arquivo destino, caso já exista um com o mesmo nome. Exemplo: % mv /home/joao/*.doc /home/joao/docs % cd /home/joao/docs % mv carta1.doc carta10.doc A remoção de arquivos no UNIX é feita através do comando rm. Este comando remove um ou mais arquivos especificados. Se a entrada é o último hard link para o arquivo, o conteúdo deste é perdido. O usuário deve ter permissão de escrita no diretório ao qual pertence o arquivo. Sintaxe: rm [-] [-fir] arquivo ... Parâmetros: arquivo: arquivo a remover. Se for especificada a opção -r, e arquivo for um diretório, este é removido recursivamente, isto é, primeiro os arquivos que contém são apagados, e em seguida o diretório é removido; -: faz com que os parâmetros seguintes sejam interpretados como nomes de arquivos, permitindo assim especificar arquivos que comecem com “-”; -f: não exibe mensagens de confirmação para sobrescrever arquivos; -i: pede uma confirmação para sobrescrever o arquivo destino, caso já exista um com o mesmo nome; -r: apaga recursivamente o conteúdo de um diretório. Exemplo: % ls -l total 3 -rwxr-xr-x 1 root -r--r--r-- 1 joao drwx------ 2 joao % cd arquivos system users users 120 Mar 12 09:32 bronze 1452 Apr 20 10:40 prata 1024 Apr 21 07:30 arquivos 47 Sistema Operacional UNIX % ls -l total 2 -r--r----- 1 joao users 23 Apr 21 07:31 protegido -rwxrwxrwx 1 joao users 157 Apr 21 07:31 desprotegido % rm desprotegido remove sem nenhum aviso % rm protegido pede confirmação para remover o arquivo rm: override protection 440 for protegido? y 6.4. Procurando Arquivos - find, grep Em situações onde é necessário localizar arquivos e/ou diretórios dentro do sistema de arquivos, pode-se recorrer aos comandos find e grep. A procura pelos arquivos pode ser baseada em informações que vão desde o nome do arquivo até suas permissões, tipo, etc. O comando find procura arquivos pelo nome ou outras características. Sintaxe: find [caminho ...] [expressão] Parâmetros: caminho: caminhos de diretório onde procurar pelos arquivos; expressão: define por quais características procurar. Pode ser uma combinação entre vários tipos de procura: -name nome: procura arquivos que tenham o nome especificado; -user usuário: procura arquivos que tenham usuário como dono; -group grupo: procura arquivos que tenham grupo como grupo dono; -perm num: procura arquivos que tenham a permissão absoluta num; -type c: procura por arquivos que tenham o tipo c, correspondente à letra do tipo do arquivo (d=diretório, l=link, etc ...); -print: esta opção faz com que os arquivos encontrador sejam exibidos na tela. Exemplos: % find . -name teste.doc -print % find /home/zeca -perm 440 -print 48 Sistema Operacional UNIX Quando queremos encontrar arquivos baseando-se em seu conteúdo, utilizamos o comando grep. Este comando identifica arquivos que contenham linhas com uma expressão especificada. Sintaxe: grep [-clinv] [expressão] [arquivo ...] Parâmetros: arquivo: arquivos onde procurar pelo padrão especificado. Se este argumento não é fornecido, grep lê da entrada padrão; expressão: texto a procurar dentro de arquivo, onde expressão pode ainda ser qualquer expressão regular; -c: somente a quantidade de linhas que casarem com uma expressão regular; -i: não diferencia maiúsculas e minúsculas na procura; -l: não mostra a linha encontrada, somente o nome do arquivo; -v: inverte a procura, mostrando somente as linhas que não casaram com a expressão especificada; -n: precede cada linha com seu número relativo dentro de arquivo. Exemplos: % grep printf *.c teste1.c: printf (“O resultado e’ %d”, a); 6.5. Imprimindo Arquivos - lpr, lpq, lprm No UNIX, o comando lpr imprime arquivos . Sintaxe: lpr [-Pimpressora] [-#cópias] [arquivo ...] Parâmetros: arquivo: o arquivo a imprimir. Se este parâmetro for omitido, lpr lê a partir da entrada padrão; 49 Sistema Operacional UNIX -Pimpressora: imprime na impressora especificada. Se não for especificada, o arquivo é impressora na impressora padrão; -#cópias: imprime o número de cópias especificado. Se cópias não for especificado, uma cópia é impressa. Exemplo: % lpr teste1.doc Para ver a lista de arquivos enfileirados para impressão, utilizamos o comando lpq. Sintaxe: lpq [-Pimpressora] Parâmetros: -Pimpressora: mostra a fila de impressão da impressora especificada. Se for omitida, mostra a fila da impressora padrão. Exemplo: % lpq lp is ready and printing Rank Owner Job Files active celsinho 1 nag.ps bytes 1st celsinho 2 lpg.lsm Total Size 1025024 565 bytes Para remover arquivos da fila de impressão, utilizamos o comando lprm. Sintaxe: lprm [-Pimpressora] [[job] [usuário] ... ] Parâmetros: -Pimpressora: remove impressões da fila da impressora especificada. Se não for especificada, a padrão é assumida; job: remove o job especificado. Se for omitido, remove todos os jobs da impressora; usuário: remove jobs do usuário especificado. 50 Sistema Operacional UNIX 51 Sistema Operacional UNIX 7. Backup e Compressão - tar, compress, uncompress, zcat As cópias de segurança (backup) são fundamentais em qualquer sistema. No caso de uma pane mais séria no sistema, somente as cópias de segurança podem devolver os arquivos do usuário de volta. Normalmente, o backup é uma tarefa administrativa de responsabilidade do próprio superusuário do sistema. Entretanto, pode ser que em determinados sistemas o backup dos arquivos dos usuários fique a cargo deles mesmos. No UNIX, podemos agrupar vários arquivos em um arquivo simples, ou mesmo em unidades de fita magnética, com o comando tar. Sintaxe: tar [-cfprtuvx] [arquivo_tar] [arquivo ...] Parâmetros arquivo: um ou mais arquivos a agrupar. Quando tar estiver sendo utilizado para desagrupar arquivos, este parâmetro é opcional; arquivo_tar: especifica onde será armazenado o conjunto de arquivos agrupados. Em geral, arquivo_tar é um dispositivo de fita magnética, mas pode-se agrupar os arquivos em um única arquivo especificando-o em arquivo_tar, e utilizando a opção -f; -c: cria um novo arquivo .tar e adiciona a ele os arquivos especificados; -f: indica que o destino é um arquivo em disco, e não uma unidade de fita magnética; -p: preserva permissões originais dos arquivos durante desagrupamento; -r: adiciona os arquivos especificados no final do arquivo .tar, sem criar um novo; -t: lista o conteúdo do arquivo .tar; -u: adiciona os arquivos especificados ao arquivo .tar, somente se estes ainda não existirem no arquivo .tar, ou se tiveram sido modificados desde quando foram agrupados por um comando tar; -v: mostra o nome de cada arquivo processado; 52 Sistema Operacional UNIX -x: retira os arquivos agrupados no arquivo .tar. Exemplos: % tar -tvf /dev/rmt0 . mostra o conteúdo do arquivo tar % tar -cf backup.tar /home/zeca/* O utilitário de compressão de arquivos padrão do UNIX é o compress. Este utilitário utiliza o algoritmo de compressão Lempel-Ziv, que é um método razoavelmente rápido e eficiente. O compress gera automaticamente um arquivo .Z correspondente compactado. Sintaxe: compress [-cvf] [arquivo ...] Parâmetros: arquivo: arquivo a comprimir. Se não for especificado, compress lê a partir da entrada padrão; -c: escreve na saída padrão, sem modificar o arquivo especificado; -f: força a compactação. Não compacta se o arquivo especificado não puder ser compactado ou se um arquivo compactado correspondente (extensão .Z) existir; -v: mostra informações sobre a porcentagem de compactação de cada arquivo. Exemplo: % compress -f mails.txt Para descompactar arquivos compactados com o compress (extensão .Z), utiliza-se o uncompress. Sintaxe: uncompress [-cv] [arquivo ...] Parâmetros: arquivo: arquivos a descompactar. Se não for especificado, uncompress lê a partir da entrada padrão; 53 Sistema Operacional UNIX -c: escreve na saída padrão, sem gerar arquivo descompactado; -v: mostra informações sobre a porcentagem de compactação de cada arquivo. Exemplo: % uncompress mails.txt.Z Existe ainda um utilitário especial, o zcat, que permite visualizar o conteúdo de arquivos compactados com o compress, sem que seja necessário descompactá-los previamente. Sintaxe: zcat arquivo ... Parâmetros: arquivo: os arquivos a serem exibidos descompactados na saída padrão. Exemplo: % zcat mails.txt.Z 54 Sistema Operacional UNIX 8. Bibliografia 1. DAVIS, William S. Sistemas Operacionais - Uma Visão Sistemática. Rio de Janeiro: Campus, 1990. 1. FRISCH, Aleen. Essential System Administration. USA: O’Reilly & Associates, 1996. 1. RNP. Apostila UNIX - Treinamento em Administração de Redes - RNP-BR. Florianópolis: RNP, 1995. 55