SAMBA Este é o SMB HOWTO. Descreve a maneira de usar o protocolo Session Message Block (SMB), também chamado protocolo NetBIOS ou LanManager, com o Linux. ______________________________________________________________________ Índice Geral: 1. Introdução 2. Mais Informação 3. Instalação 4. Executando os daemons 5. Configuração Geral ( /etc/smb.conf ) 6. Compartilhando Uma Unidade Linux Com Máquinas Windows 7. Compartilhando Uma Unidade Windows Com Máquinas Linux 8. Compartilhando Uma Impressora Linux Com Máquinas Windows 9. Compartilhando Uma Impressora Windows Com Máquinas Linux 10. Copyright 11. Reconhecimentos ______________________________________________________________________ 1. Introdução Este é o SMB HOWTO. Descreve como usar o protocolo Session Message Block (SMB), também chamado protocolo NetBIOS ou LanManager, com o Linux. Este documento é mantido por David Wood (dwood@plugged.net.au). Qualquer anexo, modificação ou correção pode enviá-la para incluí-la na seguinte versão. O protocolo SMB é usado por Microsoft Windows 3.11, NT e 95 para compartilhar discos e impressoras. Usando o pacote de ferramentas Samba criado por Andrew Tridgell, as máquinas UNIX (incluindo Linux) podem compartilhar discos e impressoras com servidores Windows. Há quatro cosas que s pode fazer com Samba: 1. Compartilhar uma unidade de Linux com máquinas Windows. 2. Compartilhar uma unidade de Windows com máquinas Linux. 3. Compartilhar uma impressora de Linux com máquinas Windows. 4. Compartilhar uma impressora de Windows com máquinas Linux. Todos estes pontos estão cobertos neste documento. NOTA: Os procedimentos e scripts funcionam ao autor ou se sabe que funcionam aos que os criaram. Algumas configurações podem dar problemas com a informação que aqui se dá. Se te encontras em tal situação, pode mandar um e-mail ao autor com sugestões para melhorar este documento, mas o autor não garante nada. O que esperava? 2. Mais Informação Este HOWTO tenta explicar a configuração de serviços SMB básicos de arquivos e impressoras em uma máquina Linux. Samba é um pacote muito complexo e completo. Não deveria haver razão para duplicar toda a documentação de Samba aqui. Para maior informação, por favor leia algum destes documentos: A documentação de Samba, disponível no pacote de distribuição do Samba. O pacote está disponível em: ftp://nimbus.anu.edu.au/pub/tridge/samba/ O HOWTO Imprimindo em Linux". (Linux Printing HOWTO) O Mini-HOWTO Print2Win. 3. Instalação A última versão do código do Samba está disponível em: ftp://nimbus.anu.edu.au/pub/tridge/samba/ De todas maneiras, se tem instalado a distribuição RedHat de Linux, tens a opção de instalá-lo como pacote. Algumas outras distribuições também inclusos executáveis de Samba. Se requer dois daemons seguintes para o pacote Samba. Se costuma instalar em /usr/sbin e se podem executar tanto dos scripts de inicialização do sistema como desde inetd. Alguns scripts de exemplo podem ser vistos em ``Executando os daemons''. smbd (O daemon de SMB) nmbd (Provê um nameserver de NetBIOS para suporte de clientes) Habitualmente, se instalam em /usr/bin os seguintes executáveis de Samba, sendo que a localização (como de costume) é opcional. smbclient (Um cliente SMB para maquinas UNIX) smbprint (Um script para imprimir a uma impressora em um servidor SMB) smbprint.sysv (Como o de encima, mas para máquinas UNIX SVR4) smbstatus (Lista das conexões SMB em andamento no servidor local) smbrun (Um script 'cola' para facilitar a execução de aplicações em servidores ) Adicionalmente, se inclui neste HOWTO um script chamado 'print', que serve como um útil front end para o script smbprint. O pacote Samba é facílimo de instalar. Simplesmente consiga o código fonte do servidor que nomeamos antes, e leia o arquivo README da distribuição. Há também um arquivo chamado docs/INSTALL.txt na distribuição que te dá um facílimo conjunto de instruções passo a passo. Seguindo com a instalação, ponha os daemons em /usr/sbin e os executáveis em /usr/bin. Instale as páginas do manual em /usr/local/man. Quando compila o pacote Samba, deveria especificar no Makefile a localização do arquivo de configuração, smb.conf. Geralmente deveria estar em /etc, mas pode pô-lo onde quiser. Há estas alturas, presumimos que especificaste a localização do arquivo de configuração como /etc/smb.conf, o arquivo de registro como /var/log/samba-log.%m e o diretório de bloqueio como /var/lock/samba Instale o arquivo de configuração, smb.conf. Vá ao diretório onde se compilou o Samba. Olhe no diretório examples/simple e leia o arquivo README. Neste diretório encontrarás o arquivo smb.conf. Copie-o em /etc. TENHA CUIDADO! Se tens uma distribuição de Linux que no Samba instalado, pode ser que já tenhas um arquivo de configuração em /etc. O correto é usar o antigo. Se não quiser que tua configuração esteja em /etc, ponha-a onde quiser e logo ponha um link simbólico em /etc: ln -s /path/to/smb.conf /etc/smb.conf 4. Executando os daemons Os dois daemons de SMB são /usr/bin/smbd e /usr/sbin/nmbd. Podes executar os daemons do Samba desde inetd ou como processos independentes . Se estiver configurando um servidor de arquivos permanente, deveriam executar-se a partir do inetd para que sejam reexecutados se 'morrerem'. Se somente quiser usar os serviços SMB de vez em quando ou como ajuda na administração do sistema, pode executá-los com um script em /etc/rc.d/init.d ou inclua a mão quando os necessitar. Para executar os daemons a partir de inetd, ponha as seguintes linhas no arquivo de configuração de inetd, /etc/inetd.conf: # Serviços SAMBA NetBIOS (para compartilhamento de arquivos e # impressoras em PC) netbios-ssn stream tcp nowait root /usr/sbin/smbd smbd netbios-ns dgram udp wait root /usr/sbin/nmbd nmbd Então reexecute inetd com o seguinte comando: kill -HUP 1 Para executá-los a partir dos scripts de inicio do sistema, ponha as seguintes linhas em /etc/rc.d/init.d/smb e faça um link simbólico com os arquivos indicados nos comentários: ______________________________________________________________________ #!/bin/sh # # /etc/rc.d/init.d/smb - começa e termina os serviços SMB. # # Se devem criar os seguintes arquivos como links simbólicos neste arquivo: # symlinks: /etc/rc.d/rc1.d/K35smb (Termina os serviços SMB ao finalizar o sistema) # /etc/rc.d/rc3.d/S91smb (Inicia os serviços SMB em modo multiusuário) # /etc/rc.d/rc6.d/K35smb (Termina os serviços SMB ao fazer um reboot) # # Biblioteca de funções . /etc/rc.d/init.d/functions # Configuração de rede . /etc/sysconfig/network # Assegurar-se que a rede está no ar [ ${NETWORKING} = no" ] && exit 0 # Comprovar como fomos chamados case $1" in empezar) echo -n Pondo em uso os serviços SMB: " daemon smbd -D daemon nmbd -D echo touch /var/lock/subsys/smb ;; parar) echo -n Terminando os serviços SMB: " killproc smbd killproc nmbd rm -f /var/lock/subsys/smb echo " ;; *) echo Modo de uso: smb {parar}" exit 1 esac ______________________________________________________________________ 5. Configuração Geral ( /etc/smb.conf ) A configuração do Samba em um Linux (ou outra máquina UNIX) é controlada por somente um arquivo, /etc/smb.conf. Este arquivo determina que recursos do sistema se quer compartilhar com o mundo exterior e que restrições desejas pôr neles. Como as seguintes seções 'direcionarão' o compartilhamento de unidades e impressoras de Linux com máquinas Windows, o arquivo smb.conf mostrado nesta seção é o mais simples possível, somente para propósitos introdutórios. Não se preocupe com os detalhes, ainda. Outras seções mais adiante introduzirão os conceitos mais importantes. Cada seção do arquivo tem um cabeçalho como [global], [impressoras], etc. A seção [global] define umas poucas variáveis que Samba usará para definir o compartilhamento de todos os recursos. A seção [homes] permite a os usuários remotos acessar a seus respectivos diretórios principais na máquina Linux local (cada um no seu e nada mais). Isto é, se um usuário de Windows tenta se conectar neste recurso a partir de sua máquina Windows, será conectado a seu diretório pessoal. Tendo em conta que para fazer isto, tem que ter uma conta na máquina Linux. ;-) O arquivo smb.conf que vem abaixo como exemplo permite aos usuários remotos acessar a seu diretório principal na máquina local e gravar em um diretório temporário. Para que um usuário de Windows veja estes recursos, a máquina Linux deve estar na rede local. Então o usuário simplesmente conecta uma unidade de rede a partir do Explorer do Windows ou o Windows File Manager. Finja que nas seguintes seções, se darão entradas adicionais neste arquivo para permitir o compartilhamento de mais recursos. ______________________________________________________________________ ; /etc/smb.conf ; ; Reinicia o servidor cada vez que faças mudanças neste arquivo: ; /etc/rc.d/init.d/smb parar ; /etc/rc.d/init.d/smb empezar [global] ; Ponha o comentário na seguinte linha se quiser contas de convidado ; guest account = nobody log file = /var/log/samba-log.%m lock directory = /var/lock/samba share modes = yes [homes] comment = Diretórios principais browseable = no read only = no create mode = 0750 [tmp] comment = Espaço de arquivos temporários path = /tmp read only = no public = yes ______________________________________________________________________ 6. Compartilhando Uma Unidade Linux Com Máquinas Windows Como se mostra no arquivo smb.conf anterior, compartilhar uma unidade Linux com usuários Windows é fácil. De todas maneiras, como todo o demais com Samba, pode ter as cosas MUITO controladas. Aqui tens uns poucos exemplos: Para compartilhar um diretório com todo mundo, crie uma copia da seção [tmp] anexando algo como isto ao smb.conf: ______________________________________________________________________ [public] comment = Coisas públicas path = /home/public public = yes writable = yes printable = yes ______________________________________________________________________ Para que este diretório possa ser lido por todo mundo, mas que só o podem modificar gente do grupo 'laboratórios', modifique a entrada desta maneira: ______________________________________________________________________ [public] comment = Coisas públicas path = /home/public public = yes writable = yes printable = no write list = @laboratórios ______________________________________________________________________ Para aprender outros truques para trabalhar com as unidades compartidas, olhe a documentação do Samba ou as páginas do man. 7. Compartilhando Uma Unidade Windows Com Máquinas Linux Se inclui um programa cliente de SMB para máquinas UNIX com a distribuição do Samba. Provê uma interface estilo ftp para a linha de comandos. Podes usar esta utilidade para transferir arquivos entre um 'servidor' Windows e um cliente unix. Para ver que recursos estão disponíveis em um host dado, execute: /usr/sbin/smbclient -L host onde 'host' é o nome da máquina que quiser 'ver'. Isto devolverá um lista de nomes de 'serviços' --isto é, nomes de unidades ou impressoras que pode compartilhar contigo--. A menos que o servidor SMB não tenha a segurança configurada, te perguntará por uma chave. Dá-lhe a chave da conta de 'convidados' ou de tua conta pessoal nessa máquina. Por exemplo: smbclient -L zimmerman A saída deste comando deveria ser algo parecido com isto: Server time is Sat Aug 10 15:58:27 1996 Timezone is UTC+10.0 Password: Domain=[WORKGROUP] OS=[Windows NT 3.51] Server=[NT LAN Manager 3.51] Server=[ZIMMERMAN] User=[] Workgroup=[WORKGROUP] Domain=[] Sharename Type Comment --------- ---- ------- ADMIN$ Disk Remote Admin public Disk Public C$ Disk Default share IPC$ IPC Remote IPC OReilly Printer OReilly print$ Disk Printer Drivers This machine tem a browse list: Server Comment --------- ------- HOPPER Samba 1.9.15p8 KERNIGAN Samba 1.9.15p8 LOVELACE Samba 1.9.15p8 RITCHIE Samba 1.9.15p8 ZIMMERMAN A lista mostra outros servidores SMB com recursos para compartilhar com a rede. Para usar o cliente, execute: /usr/sbin/smbclient serviço onde 'serviço' é uma máquina e um serviço. Por exemplo, se estiver tentando entrar em um diretório que foi compartido como 'public' em uma máquina chamada zimmerman, o serviço deveria chamar-se \zimmermanublic. De todas maneiras, devido a restrições do shell, necessitará pôr as barras invertidas com seqüências de escape, sendo que ao final sairá algo parecido a isto: /usr/sbin/smbclient \\\\zimmerman\\public minhachave onde 'minhachave' é uma cadeia literal com teu password. Então te aparecerá o 'prompt' do smbclient: Server time is Sat Aug 10 15:58:44 1996 Timezone is UTC+10.0 Domain=[WORKGROUP] OS=[Windows NT 3.51] Server=[NT LAN Manager 3.51] smb: \> Digite 'h' para obter uma ajuda de como usar o cliente: smb: \> h ls dir lcd cd pwd get mget put mput rename more mask do rm mkdir md rmdir rd prompt recurse translate lowercase print printmode queue cancel stat quit q exit newer archive tar blocksize tarmode setmode help ? ! smb: \> Se sabe usar o ftp, não deveria necessitar as páginas do man do smbclient. 8. Compartilhando Uma Impressora Linux Com Máquinas Windows Para compartilhar uma impressora Linux com máquinas Windows, necessitas assegurar-se de que a impressora esta preparada para trabalhar no Linux. Se pode imprimir a partir do Linux, preparar um 'compartilhamento' SMB da impressora é automático. Olhe o HOWTO Imprimir (Printing HOWTO) para pôr no ar a impressora com Linux. Como o autor usa uma impressora conectada a uma máquina Windows NT, esta seção não deveria ser vista como algo definitivo, e sim como mera sugestão. Qualquer um que tenha mais detalhes, que compartilhe com o autor. Que os mande a dwood@plugged.net.au para que esta seção possa ser completada. Anexando a configuração da impressora a tua smb.conf: ______________________________________________________________________ [global] printing = bsd printcap name = /etc/printcap load printers = yes log file = /var/log/samba-log.%m lock directory = /var/lock/samba [printers] comment = Todas as impressoras security = server path = /var/spool/lpd/lp browseable = no printable = yes public = yes writable = no create mode = 0700 [ljet] security = server path = /var/spool/lpd/lp printer name = lp writable = yes public = yes printable = yes print command = lpr -r -h -P %p %s ______________________________________________________________________ Assegure-se de que o 'path' da impressora (neste caso [ljet]) se corresponde ao diretório de 'spool' em /etc/printcap! NOTA: Há alguns problemas compartilhando impressoras conectadas a UNIX com máquinas Windows NT usando Samba. Um problema é que NT 'vê' a impressora compartilhada corretamente. Para consegui-lo, olhe as notas na distribuição de Samba no arquivo docs/WinNT.txt. Olhe os comentários nesse mesmo arquivo para conseguir uma modesta quantia de conhecimentos e falhas (hehehe) para resolver o problema. 9. Compartilhando Uma Impressora Windows Com Máquinas Linux Para compartilhar uma impressora em uma máquina Windows, deve fazer o seguinte: a) Deve ter as entradas adequadas em /etc/printcap e devem corresponder-se à estrutura de diretórios local (o diretório de spool, etc) b) Deve ter o script /usr/bin/smbprint. Venha com os fontes de Samba, mas não com a distribuição de executáveis do Samba. Mais abaixo comentamos uma copia ligeiramente modificada. c) Se quiser converter arquivos ASCII a PostScript, deve ter o 'nenscript' ou seu equivalente. nenscript é um conversor de PostScript e habitualmente esta instalado em /usr/bin. d) Podes desejar que as impressões de Samba sejam mais sensíveis tendo um front end fácil de usar. Mais abaixo tem um facílimo script em perl para manejar ASCII, PostScript ou PostScript gerado. A entrada para /etc/printcap que temos abaixo é para uma impressora HP 5MP em um host Windows NT. As entradas são as seguintes: ______________________________________________________________________ cm - comentário lp - nome do dispositivo a abrir para saída sd - o diretório de spool da impressora (na máquina local) af - o arquivo de contas mx - o tamanho máximo do arquivo (é ilimitado) if - nome do arquivo de entrada (script) ______________________________________________________________________ Para mais informação, leia o HOWTO Imprimir (Printing HOWTO) ou a página do man de printcap. ______________________________________________________________________ # /etc/printcap # # //zimmerman/oreilly via smbprint # lp:\ :cm=HP 5MP PostScript OReilly em zimmerman:\ :lp=/dev/lp1:\ :sd=/var/spool/lpd/lp:\ :af=/var/spool/lpd/lp/acct:\ :mx#0:\ :if=/usr/bin/smbprint: ______________________________________________________________________ Assegure-se de que os diretórios de spool e contas existem e se pode gravar neles. Assegure também que a linha 'if' esteja no path adequado para o script smbprint (que damos abaixo) e que aponta ao dispositivo adequado. (o arquivo /dev especial). O seguinte é o próprio script smbprint. Normalmente está em /usr/bin e é atribuído a Andrew Tridgell, a pessoa que criou o Samba (que eu saiba). Venha com a distribuição das fontes do Samba, mas ausente de algumas distribuições de executáveis, pois iremos recriá-los aqui. Poderia te interessar olhá-lo com cuidado. Há algumas pequenas alterações que têm demonstrado serem úteis. ______________________________________________________________________ #!/bin/sh -x # Este script é um filtro de entrada para a impressão de printcap em # uma maquina unix. Usa o programa smbclient para imprimir um arquivo # no servidor e serviço baseados em smb especificados. # Por exemplo, pode ter uma entrada em printcap como esta # # smb:lp=/dev/null:sd=/usr/spool/smb:sh:if=/usr/local/samba/smbprint # # que criará uma impressora unix chamada smb" que imprimirá através # deste script. Necessitará criar o diretório de spool /usr/spool/smb # com as permissões e propriedades apropriados para teu sistema. # Agora prepará-los com o servidor e serviço em que quiser imprimir # Neste exemplo tenho um PC WfWg chamado lapland" que tem uma # impressora exportada chamada printer" sem password. # # Script alterado por hamilton@ecnz.co.nz (Michael Hamilton) # para que serviço, servidor e chave podem ser lidos a partir de um # arquivo /usr/var/spool/lpd/PRINTNAME/.config # # Para que isto funcione a entrada em /etc/printcap deve incluir um # arquivo de contas (af=...): # # cdcolour:\ # :cm=CD IBM Colorjet on 6th:\ # :sd=/var/spool/lpd/cdcolour:\ # :af=/var/spool/lpd/cdcolour/acct:\ # :if=/usr/local/etc/smbprint:\ # :mx=0:\ # :lp=/dev/null: # # O arquivo /usr/var/spool/lpd/PRINTNAME/.config deveria conter: # servidor=SERVIDOR_PC # serviço=NOME_IMP # chave= chave" # # Ej. # servidor=PAULS_PC # serviço=CJET_371 # chave= " # # Arquivo de registro para correções, modificar a /dev/null se se quiser # fichreg=/tmp/smb-print.log # fichreg=/dev/null # # O ultimo parâmetro para o filtro é o nome do arquivo de # contas # dir_spool=/var/spool/lpd/lp fich_config=$dir_spool/.config # Deveria ler as seguintes variáveis ativadas no arquivo de # configuração: # servidor # serviço # chave # usuário eval `cat $fich_config` # # Algo de ajuda na correção de erros. Mude o >> por > se # quiser salvar algo de espaço. # echo servidor $servidor, serviço $serviço" >> $fichreg ( # NOTA: Pode se querer anexar a linha `echo translate' se quiser CR/LF # automático quando imprimes. echo translate echo print -" cat ) | /usr/bin/smbclient \\\\$servidor\\$serviço" $chave -U $usuário -N -P >> $fichreg ______________________________________________________________________ A maioria das distribuições de Linux vêm com o nenscript para converter os documentos ASCII em Postscript. O seguinte script perl torna a vida mais fácil dando um interface facílimo para que o linux imprima a través de smbprint. ______________________________________________________________________ Forma de uso: print [-a|c|p] -a imprime como ASCII -c imprime formatado como código fonte -p imprime como Postscript Se não se passa nenhum parâmetro, print tenta averiguar o tipo de arquivo e imprimi-lo adequadamente. ______________________________________________________________________ smbprint tende a truncar as linhas muito largas quando imprime arquivos ASCII. Este rompe as linhas largas onde havia um espaço em branco (em lugar de em metade de uma palavra), se é possível. O formatado de código fonte se faz com nenscript. Crie um arquivo ASCII e o formate em 2 colunas nome de arquivo , etc). Ademais enumera as linhas. Usando-o como exemplo, se podem lograr outros tipos de formatado. Os documentos Postscript também se imprimem corretamente, pois passam diretamente. ______________________________________________________________________ #!/usr/bin/perl # Script: print # Autores: Brad Marshall, David Wood # Plugged In Communications # Fecha: 960808 # Alterações: Ricardo Javier Cardenes Medina # Razão: Tradução de comentários e código ao português para # maior compreensão. # Fecha: 961109 (Sab 9 de Novembro de 1996) # # Script para imprimir a Oreilly que esta atualmente em zimmerman. # Propósito: Toma arquivos de vários tipos como parâmetros e # os processa apropriadamente para mandá-los ao script de impressão de Samba. # # Tipos suportados atualmente: # # ASCII - Assegure que as linhas com mais de $largo_linha caracteres # serão divididas aproveitando os espaços em branco. # PostScript - No faça nada. # Código - O formate em PostScript (usando nenscript) para uma melhor # apresentação (fonte, etc...). # # Máxima longitude permitida para cada linha de texto ASCII. $largo_linha = 76; # Path e nome do script 'print' de Samba. $prog_print = /usr/bin/smbprint"; # Path e nome do nenscript (o conversor ASCII-->PostScript) $nenscript = /usr/bin/nenscript"; unless ( -f $prog_print ) { die Não encontro $prog_print!"; } unless ( -f $nenscript ) { die Não encontro $nenscript!"; } &InterpLinCom(@ARGV); # DBG print O tipo de arquivo é $tipofich\n"; if ($tipofich eq ASCII") { &Rompe($largo_linha); } elsif ($tipofich eq código") { &FormataCodigo; } elsif ($tipofich eq postscript") { &CriaTabela; } else { print Tipo de arquivo desconhecido.\n"; exit 0; } # Enviar o array a smbprint open(IMPRESORA, |$prog_print") || die Não posso abrir $prog_print: $!\n"; foreach $linha (@newlines) { print IMPRESORA $linha; } # Enviar um avance de linha extra em caso de que o arquivo tenha uma # ultima linha incompleta. print IMPRESORA \n"; close(IMPRESORA); print Terminado\n"; exit 0; # --------------------------------------------------- # # Todo o conteúdo abaixo é uma subrotina # # --------------------------------------------------- # sub InterpLinCom { # Interpreta a linha de comando, averiguando o tipo de arquivo # Toma $par e $fich como parâmetro (se existe) e nome do # arquivo. if ($#_ < 0) { &FormaUso; } # DBG # foreach $elemento (@_) { # print *$elemento* \n"; # } $par = shift(@_); if ($par =~ /\-./) { $com = $par; # DBG # print \Encontrado $com.\n"; $fich = shift(@_); } else { $fich = $par; } # Defining the file type unless ($com) { # No temos parâmetro if ($fich =~ /\.ps$/) { $tipofich = postscript"; } elsif ($fich =~ /\.java$|\.c$|\.h$|\.pl$|\.sh$|\.csh$|\.m4$|\.inc$|\.html$|\.htm$/) { $tipofich = código"; } else { $tipofich = ASCII"; } # Processa $fich buscando o tipo e devolve $tipofich } else { # Temos o tipo em $par if ($com =~ /^-p$/) { $tipofich = postscript"; } elsif ($com =~ /^-c$/) { $tipofich = código"; } elsif ($com =~ /^-a$/) { $tipofich = ASCII" } } } sub FormaUso { print Forma de uso: print [-a|c|p] -a imprime como ASCII -c imprime formatado como código fonte -p imprime como Postscript Se no se passa nenhum parâmetro, print tenta averiguar o tipo de arquivo e imprimi-lo adequadamente.\n ; exit(0); } sub Rompe { # Cria uma tabela com as linhas do arquivo, onde cada linha é # menor que o numero de caracteres especificado, e as rompe # somente nos espaços em branco # Toma o número de caracteres aos que limitar a linha. $limite = pop(@_); # DBG #print Entrando na subrotina Rompe\n"; #print O limite de caracteres é $limit\n"; # Lê no arquivo, o interpreta e põe na tabela. open(FICHERO, <$fich") || die Não posso abrir $fich: $!\n"; while() { $linha = $_; # DBG #print A linha é:\n$linha\n"; # Rompe a linha se passa do limite. while ( length($linha) > $limite ) { # DBG #print Rompendo..."; # Toma os primeiros $limite +1 caracteres. $cacho = substr($linha,0,$limite +1); # DBG #print A linha parcial é:\n$cacho\n"; # Olhe se o último caracter é um espaço. $último_car = substr($cacho,-1, 1); if ( " eq $último_car ) { # Se é, imprime o resto. # DBG #print O último caracter era um espaço\n"; substr($linha,0,$limite + 1) = "; substr($cacho,-1,1) = "; push(@newlines, $cacho\n"); } else { # Se não é, busca o último espaço na # sub-linha e imprime até ali. # DBG #print O último caracter não era um espaço\n"; # Apaga o último caracter que passa de $limite substr($cacho,-1,1) = "; # Dá a volta à linha para fazer mais # fácil buscar o espaço. $cachoreves = reverse($cacho); $indice = index($revpart, "); if ( $indice > 0 ) { substr($linha,0,$limite-$indice) = "; push(@newlines,substr($cacho,0,$limite-$indice) . \n"); } else { # Não há espaços na linha, por isso # se imprime até $limite. substr($linha,0,$limite) = "; push(@newlines,substr($cacho,0,$limite) . \n"); } } } push(@newlines,$linha); } close(ARQUIVO); } sub FormataCodigo { # Chama à subrotina Rompe quando filtrar através de nenscript &Rompe($largo_linha); # Manda os resultados através de nenscript para criar um # arquivo Postscript que de uma forma decente a nosso código # fonte para imprimi-lo (fonte Courier, número de linhas, ...). # E imprime tudo isto num arquivo temporário. $fichtmp = /tmp/nenscript$$"; open(FICHERO, |$nenscript -2G -i$fich -N -p$fichtmpfich -r") || die Não pude abrir nenscript: $!\n"; foreach $linha (@newlines) { print ARQUIVO $linha; } close(ARQUIVO); # Mova o arquivo temporário em uma tabela para que possa # ser passado ao script de impressão de Samba. @newlines = ( "); open(ARQUIVO, <$fichtmp") || die No posso abrir $fichtmp: $!\n"; while() { push(@newlines,$_); } close(ARQUIVO); system( rm $fichtmp"); } sub CriaTabela { # Criar a tabela para postscript open(ARQUIVO, <$fich") || die Não posso abrir $fich: $!\n"; while() { push(@newlines,$_); } close(ARQUIVO); } ______________________________________________________________________ 10. Copyright Este HOWTO tem um copyright de 1996 por David Wood. Pode ser reproduzido em qualquer forma e distribuído livremente ou arquivo se mantenha intacto , incluindo esta linha. 11. Reconhecimentos Tão pronto como me mande sugestões, te porei aqui na seguinte versão. Endereços com os novos HOWTOS http://www.insflug.nova.é em suas versões html, e listas para baixar, em http://ftp.insflug.nova.é Outro bom ponto de busca de consulta, e obtenção da documentação traduzida, em formato HTML, com links aos demais formatos, assim como as traduções dos guias traduzidos por LuCAS é: http://www.infor.é/LuCAS/ junto com seu ftp: ftp://ftp.infor.é/pub/LuCAS/