


<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
	xmlns:media="http://search.yahoo.com/mrss/"
>

<channel>
	<title>DeServ - Info &#187; Tutoriais</title>
	<atom:link href="http://blog.deserv.info/category/geral/softwares-adicionais/tutoriais/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.deserv.info</link>
	<description>Seu Caderno de Anotações de Informática</description>
	<lastBuildDate>Wed, 08 Feb 2012 18:50:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<copyright>Copyright &#xA9; DeServ - Info 2011 </copyright>
	<managingEditor>flavio.aparecido@gmail.com (DeServ - Info)</managingEditor>
	<webMaster>flavio.aparecido@gmail.com (DeServ - Info)</webMaster>
	<image>
		<url>http://blog.deserv.info/wp-content/plugins/podpress/images/powered_by_podpress.jpg</url>
		<title>DeServ - Info</title>
		<link>http://blog.deserv.info</link>
		<width>144</width>
		<height>144</height>
	</image>
	<itunes:subtitle></itunes:subtitle>
	<itunes:summary>Seu Caderno de Anotações de Informática</itunes:summary>
	<itunes:keywords></itunes:keywords>
	<itunes:category text="Society &#38; Culture" />
	<itunes:author>DeServ - Info</itunes:author>
	<itunes:owner>
		<itunes:name>DeServ - Info</itunes:name>
		<itunes:email>flavio.aparecido@gmail.com</itunes:email>
	</itunes:owner>
	<itunes:block>no</itunes:block>
	<itunes:explicit>no</itunes:explicit>
	<itunes:image href="http://blog.deserv.info/wp-content/plugins/podpress/images/powered_by_podpress_large.jpg" />
		<item>
		<title>Configurando Apache para Performance Maxima</title>
		<link>http://blog.deserv.info/2011/11/17/configurando-apache-para-performance-maxima-2/</link>
		<comments>http://blog.deserv.info/2011/11/17/configurando-apache-para-performance-maxima-2/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 17:34:54 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[Softwares Adicionais]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[AllowOverride]]></category>
		<category><![CDATA[Apache-performance]]></category>
		<category><![CDATA[Apache2]]></category>
		<category><![CDATA[FollowSymLinks]]></category>
		<category><![CDATA[KeepAlive and KeepAliveTimeout]]></category>
		<category><![CDATA[MaxClients]]></category>
		<category><![CDATA[MaxRequestsPerChild]]></category>
		<category><![CDATA[MaxSpareServers]]></category>
		<category><![CDATA[MinSpareServers]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[StartServers]]></category>
		<category><![CDATA[SymLinksIfOwnerMatch]]></category>
		<category><![CDATA[Vishnu Ram]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=624</guid>
		<description><![CDATA[Introdução Apache é a implementação open source de um servidor HTTP. Ele é o webserver mais popular na Internet. Uma pesquisa realizada em 2005 pela NetCraft mostra que cerca de 70% dos sites na Internet rodam sobre o Apache. Opções de Configuração em tempo de Compilação Carrege apenas os módulos necessários O servidor Apache é [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.deserv.info%252F2011%252F11%252F17%252Fconfigurando-apache-para-performance-maxima-2%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Configurando%20Apache%20para%20Performance%20Maxima%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><h2>Introdução</h2>
<p align="justify">Apache é a implementação open source de um servidor HTTP. Ele é o webserver mais popular na Internet. Uma pesquisa realizada em 2005 pela NetCraft mostra que cerca de 70% dos sites na Internet rodam sobre o Apache. <span id="more-624"></span></p>
<h2>Opções de Configuração em tempo de Compilação</h2>
<h3>Carrege apenas os módulos necessários</h3>
<p align="justify">O servidor Apache é um programa modular onde o administrador pode escolher entre as funcinalidade que deseja incluir no servidor selecionando um pacote de módukis. Os módulos podem ser compilados estaticamente no binário httpd ou dinamicamente como DSOs(Dynamic Shared Objects). Módulos DSO podem ser compilados quando o servidor for compilado ou poem ser compilados utilizando o apxs para adicioná-los mais tarde. O modulo mod_so deve ser compilado estaticamente no Apache para que o suporte a DSO seja ativo.</p>
<p align="justify">Execute o apache apenas com os módulos necessários. Isto reduz o consumo de memória aumenta a performance do servidor. Compilar os módulos estaticamente irá reduzir o consumo de RAM que é utilizado para suportar módulos compilados dinamicamente, mas será necessário recompilar o apache toda vez que um módulo for adicionado ou removido. È aqui que o DSO se torna útil. Uma vez que o modulo mod_so seja compilado estaticamente, qualquer outro módulo pode ser inserido ou removido utilizando o comando LoadModule no arquivo httpd.conf &#8211; , mas você terá que compilar os módulos utilizando apxs se ele não foi compilado quando o servidor foi feito.</p>
<h3>Escolha o MPM apropriado</h3>
<p align="justify">O apache vem com uma selação de Módulos Multi-Processadores (MPMs) que são responsáveis por abrir as portas de rede na máquina, aceitando requisições, e despachando processos para cuidar das requisições. Apenas um MPM pode ser carregado por vez.</p>
<p align="justify">Escolher o MPM depende de vários fatores, por exemplo se o SO suporta threads, quanta memória está disponível, escalabilidade versus estabilidade, modulos externos,etc .. Sistemas Linux podem escolher entr utilizar um MPM com suporte (worker) a threads ou um prefork sem threads:</p>
<p align="justify">O MPM Worker utiliza múltiplos processos. Ele é multi-threaded com cada processo e cada thread cuidando de uma única conexão. Esté é mais rápido e mais escalável e a memória consumida e relativamente baixa. Funciona bem com múltiplos processadores. Porém, o worker é menos tolerante a módulos defeituosos, e threads defeituosas podem afetar todas as outras threads de um processo.</p>
<p align="justify">O MPM Prefork utiliza múltiplos processos filhos, cada filho cuidad de apenas uma conexão por vez. Prefork é muito bem gerenciada por processadores simples ou múlitplos, a velocidade é comparável ao worker e é mais tolerante a falhas em modulos e processos que terminam inesperadamente. Mas o consumo de memória é alto, mais tráfego leva a mais consumo de memória.</p>
<h2>Opções de Configuração em Tempo de Execução</h2>
<h3>DNS lookup</h3>
<p align="justify">A diretiva HostnameLookips habilita a consulta de DNS, então os hostnames podem ser logados ao invés de endereços IP. Isto adiciona latência em cada requisição desde que a consulta do DNS tem que ser completada antes que a requisição seja terminada. Esta opção é desabilitada por padrão no Apache 1.3 e superiores. Deixe isto inativo e utilize programas pós-processamento como o logresolve para determinar os IPs dos logs. Logresolve vem com Apache.</p>
<p align="justify">Quando utilizar as diretivas Allow from ou Deny from, utilize endereços IP ao invés de nomes de domínios. Caso contrário uma consulta dupla ao DNS será executada para ter certeza de que o domínio ou host não está sendo spoofado.</p>
<h3>AllowOverride</h3>
<p align="justify">Se o AllowOverride está setado para &#8216;None&#8217;, então o Apache irá tentar abrir o arquivo .htaccess (especificada pela diretiva AccessFileName) em cada diretório que for acessado. Por exemplo:</p>
<blockquote>
<pre>DocumentRoot /var/www/html
&lt;Directory /&gt;
AllowOverride all
&lt;/Directory&gt;</pre>
</blockquote>
<p align="justify">Se uma requisição for feita para acessar /index.html, o Apache irá tentar abrir /.htaccess, /var/.htaccess, /var/www/.htaccess, and /var/www/html/.htaccess. Estas tentativas aumentam a latência. Se o arquivo .htaccess for necessário para um diretório, habilite apenas para este diretório.</p>
<h3>FollowSymLinks e SymLinksIfOwnerMatch</h3>
<p align="justify">Se a opção FollowSymLinks estiver setada, então o servidor permitirá que links simbólicos possam ser seguidos neste diretório. Se a opção SymLinksIfOwnerMatch estiver setada, então o servidor permitirá acessar o link apenas se o destino dele bater com o dono do link.</p>
<p align="justify">Se a opção SymLinksIfOwnerMatch estiver setada, então o Apache terá que realizar consultas adicionais ao sistema para verificar se os donos coincidem. Chamadas adicionais também são necessárias quando a opção FollowSymLinks NÃO está setada. Por exemplo:</p>
<blockquote>
<pre>DocumentRoot /vaw/www/html
&lt;Directory /&gt;
Options SymLinksIfOwnerMatch
&lt;/Directory&gt;</pre>
</blockquote>
<p align="justify">Para uma requisição feita para /index.html, o Apache irá executar lstat() em /var, /var/www, /var/www/html, and /var/www/html/index.html. Estas requisições adicionais também irão aumentar a lantência. Os resultados do lstat não são cacheados, então as consultas irão ocorrer em cada requisição.</p>
<p align="justify">Para uma máxima performance, sete FollowSymLinks em cada lugar e nunca sete SymLinksIfOwnerMatch. Ou então, se SymLinksIfOwnerMatch for necessário para um diretório, sete ele para apenas este diretório.</p>
<h3>Content Negotiation</h3>
<p align="justify">Evite utilizar content negotiation para respostas mais rápidas. Se content negotiation é necessário para o site, utilize arquivos type-map ao invés da diretiva Options MultiViews. Com MultiViews, Apache precisa scanear o diretório em busca de arquivos, o que adiciona latência.</p>
<h3>MaxClients</h3>
<p align="justify">O MaxClients seta o número máximo de clientes simultâneos que pode ser suportada por cada servidor. Nenhum processo além do que está definido será aberto. Ele não deve conter um número muito baixo já que as requisições serão colacadas em fila, o que eventualmente irá dar time-out e os recursos do servidor continuarão não utilizados. Setar este valor muito alto irá causar o início de swap e o tempo de resposta irá cair drasticamente. O valor apropriado para MaxClientes pode ser calculado por: MaxClientes = Total RAM / Tamanho Máximo de Processos . O tamanho dos processos para arquivos estáticos é de mais ou menos 2-3MB. Para dinâmicos como PHP, deve ser por volta de 15MB. A coluna RSS de:</p>
<blockquote>
<pre># ps -ylC httpd --sort:rss</pre>
</blockquote>
<p align="justify">Mostra a memória física non-swapped utilizada pelos processos do Apache em kilo Bytes.</p>
<p align="justify">Se existem mais usuários concorrentes do que MaxClients, as requisições serão colocadas em fila até o número baseado na diretiva ListenBacklog. Aumente o ServerLimit para setar o MaxClients acima de 256.</p>
<h3>MinSpareServers, MaxSpareServers, e StartServers</h3>
<p align="justify">MaxSpareServers e MinSpareServers determina quantos processos filhos devem ser mantidos rodando. Se MinSpareServers for muito baixo e muitas requisições forem iniciadas, então o Apache terá que abrir processos adicionais para atender as requisições. Criar processos filhos é relativamente caro. Se o servidor estiver ocupado criando processos, ele não estará disponível para servir as requisições imediatamente. MaxSpareServers não deve ser muito alto, ele pode causar problemas de recursos desde que cada processo consome os recursos da máquina.</p>
<p align="justify">Sete MinSpareServers e MaxSpareServers para um valor com que o Apache não precise frequentemente abrir mais de 4 processos por segundo. (O Apache pode abrir o máximo de 32 processos por segundo). Quando mais de 4 processos por segundo forem abertos, uma mensagem será logada no ErrorLog.</p>
<p align="justify">A diretiva StartServers define o número de processos criados na inicialização do Apache. O Apache irá continuar abrir os processos até que alcance o número de MinSpareServers. Não afeta muito a performance já que o servidor não é reiniciado frequentemente. Se existem muitas requisições e o Apache é reiniciado frequentemente, sete este valor para um número alto.</p>
<h3>MaxRequestsPerChild</h3>
<p align="justify">A diretiva MaxRequestsPerChild definie o número de requisições que um processo do servidor irá gerenciar. Depois as requisições MaxRequestsPerChild irão morrer. É definido para 0 por padrão, o que significa que o processo não irá expirar nunca. É apropriado setar este valor para alguns milhares. Isto pode ajudar a previnir vazamento de memória desde que o processo morre depois de servir um número de requisições. Não sete este valor muito baixo, já que criar novos processos causa overhead.</p>
<h3>KeepAlive and KeepAliveTimeout</h3>
<p align="justify">A diretiva KeepAilve permite que múltiplas requisições possam ser enviadas pela mesma conexão TCP. Isto é útil para páginas com muitas imagens. Se o KeepAlive estiver Off, então para cada imagem, uma nova conexão TCP precisa ser aberta.</p>
<p align="justify">KeepAliveTimeout determinada quanto tempo deve esperar até a próxima requisição. Sete para um valor baixo, por volta de 2 a 5 segundos. Se for setado para um valor muito alto, os processos ficam amarrados esperando pelo cliente quando eles poderiam ser utilizados para servir novos clientes.</p>
<h2>Compressão HTTP &amp; Caching</h2>
<p align="justify">O servidor utiliza os métodos gzip ou deflate para as respostas payload antes que ele seja enviado para os clientes. Então o cliente descompacta o payload. Não existe necessidade de instalar softwares adicionais no lado do cliente desde que a maioria dos navegadores suporta isto. Utilizar compressão irá economizar banda e irá aumentar o tempo de resposta, estudos mostram que em média o ganho da compressão é de 75%. A compressão pode ser habilitada utilizando módulo mod_deflate. O Payload é compactado apenas se o navegador requisitar a compactação, ou então o conteúdo descompactado será enviado. Um navegador capaz de utilizar o conteúdo compactado envia o seguinte cabeçalho na requisição: &#8220;Accept-Encoding: gzip,deflate&#8221;. Então o servidor irá enviar o payload compactado e o cabeçalho da reposta é &#8220;Content-Encoding: gzip&#8221;</p>
<p align="justify">O exemplo a seguir utiliza o telnet para verificar os cabeçalhos de requisição e de resposta:</p>
<blockquote>
<pre>bash-3.00$ telnet www.webperformance.org 80
Trying 24.60.234.27...
Connected to www.webperformance.org (24.60.234.27).
Escape character is '^]'.
HEAD / HTTP/1.1
Host: www.webperformance.org
Accept-Encoding: gzip,deflate

HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 02:29:22 GMT
Server: Apache/2.0
X-Powered-By: PHP/5.1.1
Cache-Control: max-age=0
Expires: Sat, 31 Dec 2005 02:29:22 GMT
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 20
Content-Type: text/html; charset=ISO-8859-1</pre>
</blockquote>
<p align="justify">O module mod_cache pode ser utilizado no lado do servidor, está em produção estável na versão 2.2 do Apache.</p>
<h2>Servidor separado para conteúdo estático e dinâmico</h2>
<p align="justify">Processos do apache para conteúdo dinâmico consome cerca de 3-20MB de RAM. E cresce para acomodar o conteúdo e nunca diminui até que o processo termine. Digamos que um processo cresca até os 20MB para servir um conteúdo dinâmico. Depois de completar a requisição, ele está libre para servir outra requisição. Se vier uma requisição para uma imagem, então esses 20MB de processos está servindo um conteúdo estático que poderia ser executado por um processo de 1MB. A memória é utilizada ineficientemente.</p>
<p align="justify">Utilize uma pequena compilação do Apache (com o mínimo de módulos compilados estaticamente) como sendo o servidor front-end para servir conteúdos estáticos. As requisições para conteúdos dinâmicos serão encaminhadas para um apache robusto (compilado com todos os módulos necessários). Utilizar um servidor front-end leve tem a vantagem de que os conteúdos estáticos são enviados rapidamente sem o consumo alto de memória e apenas o conteúdo dinâmico é passado para o servidor robusto.</p>
<p align="justify">Encaminhamento de requisições pode ser implementado utilizando os módulos mod_proxy e mod_rewrite. Suponha que exista um servidor apache leve rodando na porta 80 e o robusto na porta 8088. Então a configuração a seguir pode ser utilizada no apache leve para encaminhar todas as requisições de conteúdo dinâmico para o servidor robusto.</p>
<blockquote>
<pre>ProxyPassReverse / http://%{HTTP_HOST}:8088/
RewriteEngine on
RewriteCond   %{REQUEST_URI} !.*\.(gif|png|jpg)$
RewriteRule ^/(.*) http://%{HTTP_HOST}:8088/$1 [P]</pre>
</blockquote>
<p align="justify">Todas as requisições, exceto as imagens serão encaminhadas para o apache robusto. As respostas são recebidas pelo servidor front-end que as encaminha para o cliente. Todas as respostas aparentam vir de um único servidor.</p>
<h2>Conclusão</h2>
<p align="justify">Configurar o Apache para obter o máximo de performance pode ser traiçoeiro, não existem regras rápidas. Entenda as necessidades do servidor web e experimente com várias opções. Utiliza ferramentas como ab e httperf para medir a performance do servidor. Servidores leves como tux, thttpd também podem ser utilizados como servidores front-end. Se um servidor de banco de dados é utilizado, tenha certeza de que ele está otimizado para que ele não crie nenhum gargalo. No caso do MySQL, mtop pode ser utilizado para monitorar querys lentas. Performance de scripts PHP pode ser melhorada utilizando produtos de cache como o Turck MMCache. Ele elimina o overhead da compilação realizando cache dos scripts em seu estado compilado.</p>
<p>&nbsp;</p>
<h2>Fonte</h2>
<ul>
<li><a href="http://www.howtoforge.net/configuring_apache_for_maximum_performance" rel="nofollow">http://www.howtoforge.net/configuring_apache_for_maximum_performance</a></li>
<li>http://under-linux.org/wiki/Tutoriais/Apache/Apache-performance</li>
</ul>
<h2>Autor</h2>
<p align="justify">Escrito por: Vishnu Ram is an MTech. in Communication Systems from IIT Madras. He joined Bobcares in 2003 and has been working for Poornam since then.</p>
<div class="shr-publisher-624"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2011/11/17/configurando-apache-para-performance-maxima-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iRedMail: Servidor de e-mails fácil e rápido</title>
		<link>http://blog.deserv.info/2011/11/01/iredmail-servidor-de-e-mails-facil-e-rapido/</link>
		<comments>http://blog.deserv.info/2011/11/01/iredmail-servidor-de-e-mails-facil-e-rapido/#comments</comments>
		<pubDate>Tue, 01 Nov 2011 20:36:28 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[E-mails - Anti Virus]]></category>
		<category><![CDATA[Instalação e Compilação de SW]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[imap]]></category>
		<category><![CDATA[MTA]]></category>
		<category><![CDATA[pop]]></category>
		<category><![CDATA[servidor de email; iRedMail]]></category>
		<category><![CDATA[smtp]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=611</guid>
		<description><![CDATA[Introdução O e-mail é a forma de comunicação mais utilizada hoje em dia. Se o servidor de e-mails de uma empresa parar, é como se o mundo acabasse para os usuários! O telefone não vai parar de tocar, e-mails importantes não serão entregues/recebidos podendo gerar grandes prejuízos financeiros para empresas. Imaginando um cenário desses, você [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.deserv.info%252F2011%252F11%252F01%252Firedmail-servidor-de-e-mails-facil-e-rapido%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22iRedMail%3A%20Servidor%20de%20e-mails%20f%C3%A1cil%20e%20r%C3%A1pido%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><img title="iredmaillogo" src="http://images.pedropereira.net/2009/05/iredmaillogo.png" alt="iredmaillogo" width="126" height="53" /></p>
<p><strong>Introdução</strong></p>
<p>O e-mail é a forma de comunicação mais utilizada hoje em dia. Se o servidor de e-mails de uma empresa parar, é como se o mundo acabasse para os usuários! O telefone não vai parar de tocar, e-mails importantes não serão entregues/recebidos podendo gerar grandes prejuízos financeiros para empresas.</p>
<p>Imaginando um cenário desses, você com certeza não escolheria qualquer solução para implantar na sua empresa, certo? Atualmente, um dos melhores, mais seguros e mais estáveis softwares MTA (Mail Transport Agent) disponíveis é o Postfix. <span id="more-611"></span></p>
<p>Embora ele seja simples para quem já possui experiência na administração de servidores Linux, ele pode ser um pouquinho complicado para quem está apenas começando na administração de sistemas.</p>
<p>Por isso, neste artigo vou mostrar uma solução para facilitar a configuração do Postfix: o iRedMail. Este é um software que automatiza todo o processo de instalação e configuração de um servidor de e-mails utilizando as distribuições CentOS e Red Hat. Ele permite que você escolha o backend de gerenciamento de usuários (MySQL ou OpenLDAP), qual o webmail que você quer utilizar, gerenciador MySQL ou OpenLDAP, entre várias outras opções.</p>
<p>Aqui, vou assumir que você já possui um servidor CentOS configurado e funcional com acesso à Internet.</p>
<p><strong>Quais os softwares que o iRedMail utiliza?</strong></p>
<p>O iRedMail faz o download de todos os softwares automaticamente. Porém, obviamente você precisa saber quais são estes softwares que ele utiliza e suas versões também.</p>
<p>Segue uma lista de alguns dos softwares utilizados por ele:</p>
<ul>
<li>Amavisd-new 2.6.2-2</li>
<li>Clamav 0.94.2-1</li>
<li>Dovecot 1.1.11</li>
<li>Postfix 2.5.6</li>
</ul>
<p>Claro que esta não é a lista completa. Para verificar todos os pacotes que foram baixados para a sua máquina entre no diretório pkgs/rpms dentro do diretório criado quando você descompacta o iRedMail.</p>
<p><strong>Download do iRedMail</strong></p>
<p>O site oficial do iRedMail é <a href="http://code.google.com/p/iredmail/">http://code.google.com/p/iredmail/</a><a href="http://code.google.com/p/iredmail/">.</a></p>
<p>Vá até a seção “Downloads”. Lá você irá encontrar todas as versões do iRedMail que foram publicadas. Até a data de publicação deste texto, a versão mais recente é a 0.4.0, que pode ser obtida no link: <a href="http://iredmail.googlecode.com/files/iRedMail-0.4.0.tar.bz2">http://iredmail.googlecode.com/files/iRedMail-0.4.0.tar.bz2</a>.</p>
<p><strong>Instalação</strong></p>
<p>O script de instalação do iRedMail cuida de todo o processo, inclusive do download de todos os RPM’s necessários para que a instalação seja feita sem problemas. Vamos à instalação.</p>
<p>Primeiro, descompacte o arquivo que você baixou do site oficial:</p>
<p><strong># tar xjvf iRedMail-0.4.0.tar.bz2</strong></p>
<p>Será criado um diretório chamado iRedMail-0.4.0. Entre nele:</p>
<p><strong># cd iRedMail-0.4.0</strong></p>
<p>O seu diretório se parecerá com este:</p>
<p><img title="listagemdirprin" src="http://images.pedropereira.net/2009/05/listagemdirprin.png" alt="listagemdirprin" width="720" height="448" /></p>
<p>Entre no diretório pkgs e execute o script que faz o download de todos os pacotes necessários:</p>
<p><strong># bash get_all.sh</strong></p>
<p>E vá tomar um café. Dependendo da velocidade da sua conexão esta etapa poderá demorar um pouco para ser concluída. Quando ela terminar, podemos começar a configuração do nosso servidor de e-mail.</p>
<p>Para isso, faça o seguinte. Suba um nível em relação ao diretório pkgs (o diretório raíz do iRedMail) e execute o script iRedMail.sh:</p>
<p><strong># cd .. ; bash iRedMail.sh</strong></p>
<p>Você verá a tela inicial da instalação do iRedMail:</p>
<p><img title="tela1" src="http://images.pedropereira.net/2009/05/tela1.png" alt="tela1" width="720" height="448" /></p>
<p>Esta tela é apenas informativa. Aperte enter para passarmos para a próxima tela.</p>
<p><img title="tela2" src="http://images.pedropereira.net/2009/05/tela2.png" alt="tela2" width="720" height="448" /></p>
<p>Esta tela permite que você escolha qual será o diretório home do usuário vmail. Como não serão criados usuários no sistema (todos os usuários serão virtuais), todos os e-mails serão entregues ao vmail e ele irá “distribuir” estas mensagens aos usuários certos.</p>
<p>Como este diretório irá conter todos os e-mails que chegam ao sistema, pode ser que ele cresça bastante com o tempo, portanto pense no futuro e reserve um espaço considerável para o home do usuário vmail.</p>
<p>Você pode deixar o padrão ou modificar para outro diretório que você queira. Depois selecione “OK”.</p>
<p><img title="tela3" src="http://images.pedropereira.net/2009/05/tela3.png" alt="tela3" width="720" height="448" /></p>
<p>Agora, devemos escolher qual vai ser o backend do nosso servidor de e-mail. Isto irá informar ao iRedMail como nós queremos que ele guarde as informações de contas de usuários, autenticação, etc.</p>
<p>Se você escolher MySQL, o webmail será o RoundCube (um webmail excelente) e a ferramenta de administração será o PostfixAdmin. Se você escolher o OpenLDAP ele irá utilizar o SquirrelMail como webmail (o RoundCube não suporta OpenLDAP) e a ferramenta de administração será o phpLDAPadmin.</p>
<p>O MySQL é o recomendado, aqui iremos utilizá-lo. Obviamente, os passos daqui para frente serão diferentes dependendo do que você escolher aqui. Em outro artigo tratarei a configuração do OpenLDAP como backend. Vamos para a próxima tela.</p>
<p><img title="tela4" src="http://images.pedropereira.net/2009/05/tela4.png" alt="tela4" width="720" height="448" /></p>
<p>Aqui devemos informar ao iRedMail qual a senha queremos utilizar para o usuário root do MySQL. Informe a senha com cuidado pois não haverá chance de confirmá-la mais tarde. Tenha certeza que digitou a senha corretamente.</p>
<p><img title="tela5" src="http://images.pedropereira.net/2009/05/tela5.png" alt="tela5" width="720" height="448" /></p>
<p>Nesta tela devemos informar a senha do usuário administrador do Vmail. Aqui acontece a mesma coisa que aconteceu com a senha do root do MySQL: você não vai poder confirmar a senha que escreveu. Portanto, tenha certeza que digitou a senha corretamente.</p>
<p><img title="tela6" src="http://images.pedropereira.net/2009/05/tela6.png" alt="tela6" width="720" height="448" /></p>
<p>Aqui acabam as diferenças de configuração entre MySQL e OpenLDAP.</p>
<p>Você precisa informar o domínio que você quer utilizar. Lembre-se, este é um domínio virtual. Você poderá adicionar outros domínios sem problema algum quando precisar.</p>
<p><img title="tela7" src="http://images.pedropereira.net/2009/05/tela7.png" alt="tela7" width="720" height="448" /></p>
<p>Nesta tela você deve definir qual será o nome de usuário do administrador do domínio. O padrão em todos os servidores de e-mail é definir “postmaster” para este usuário. Seguiremos o padrão aqui.</p>
<p><img title="tela8" src="http://images.pedropereira.net/2009/05/tela8.png" alt="tela8" width="720" height="448" /></p>
<p>Aqui devemos definir qual será a senha da conta “postmaster”, o administrador do domínio.</p>
<p><img title="tela9" src="http://images.pedropereira.net/2009/05/tela93.png" alt="tela9" width="720" height="448" /></p>
<p>Nesta tela você pode criar o primeiro usuário “normal” do seu domínio. Ele não terá direito especial algum, é apenas um usuário.</p>
<p><img title="tela10" src="http://images.pedropereira.net/2009/05/tela10.png" alt="tela10" width="720" height="448" /></p>
<p>Nesta tela você pode definir a senha para o usuário. Ele irá utilizar esta senha quando for ler o e-mail ou acessar o webmail.</p>
<p><img title="tela11" src="http://images.pedropereira.net/2009/05/tela11.png" alt="tela11" width="720" height="448" /></p>
<p>Aqui você deve escolher se quer habilitar ou não o suporte a SPF e DKIM. Segue uma breve descrição sobre o que são ambos:</p>
<ul>
<li><strong>DKIM: </strong>DomainKeys Identified Mail. Basicamente, o DKIM oferece um método para validar um nome de domínio associado a um e-mail através de autenticação criptográfica.</li>
<li><strong>SPF:</strong> O objetivo do SPF é impedir que worms, vírus e spammers utilizem endereços arbitrários (ou inexistentes) no campo “sender” do envelope do e-mail. Os administradores do domínio devem publicar registros SPF no DNS e os administradores do servidor de e-mail devem utilizar MTAs (como o Postfix) que possuam suporte ao SPF para que ele compreenda os registros SPF. Estes registros informam quais servidores possuem autoridade para enviar e-mails. Qualquer outro servidor enviando e-mails destes domínios não possui credibilidade e os e-mails são descartados.</li>
</ul>
<p>Você pode habilitar ambos ou nenhum, fica à sua escolha.</p>
<p><img title="tela12" src="http://images.pedropereira.net/2009/05/tela12.png" alt="tela12" width="720" height="448" /></p>
<p>O pysieved é um serviço que gerencia scripts Sieve que os usuários utilizam.</p>
<p>&nbsp;</p>
<p>Sieve é uma linguagem especializada no tratamento e filtragem de e-mails. Não é uma linguagem de programação completa.</p>
<p>&nbsp;</p>
<p>Ela permite que se desenvolva pequenos scripts (que podem ser implementados no cliente ou no servidor de e-mails) que filtram e-mails, como por exemplo recusando e-mails maiores de 1MB e enviando uma mensagem de aviso de volta à origem da mensagem (ao remetente).</p>
<p>&nbsp;</p>
<p>O pysieved permite que os usuários executem scripts Sieve no servidor sem precisar de uma conta nele.</p>
<p><img title="tela13" src="http://images.pedropereira.net/2009/05/tela13.png" alt="tela13" width="720" height="448" /></p>
<p>Nesta tela você pode escolher se vai prover suporte a POP3/IMAP utilizando SSL.</p>
<p>&nbsp;</p>
<p>É recomendado que se utilize o SSL pois ele criptografa todo o conteúdo das mensagens impedindo que sniffers e ataques como “man in the middle” consigam ler todo o conteúdo transferido por estas mensagens.</p>
<p><img title="tela14" src="http://images.pedropereira.net/2009/05/tela14.png" alt="tela14" width="720" height="448" /></p>
<p>Nesta tela você pode escolher o webmail que deseja utilizar no seu servidor. Escolha o seu favorito e selecione “OK”.</p>
<p><img title="tela15" src="http://images.pedropereira.net/2009/05/tela15.png" alt="tela15" width="720" height="448" /></p>
<p>Neste passo da instalação você poderá definir qual será a língua principal utilizada no seu webmail. Basta utilizar a seta para baixo para rolar por todas as opções e utilizar a barra de espaço para selecionar.</p>
<p><img title="tela16" src="http://images.pedropereira.net/2009/05/tela16.png" alt="tela16" width="720" height="448" /></p>
<p>Nesta tela você pode escolher se quer instalar o phpMyAdmin (para administrar o banco de dados MySQL via web), o PostfixAdmin (para gerenciar domínios e contas de usuários via web) e o AwStats (para verificar estatísticas sobre o servidor de e-mails).</p>
<p><img title="tela17" src="http://images.pedropereira.net/2009/05/tela17.png" alt="tela17" width="720" height="448" /></p>
<p>Aqui você escolhe o usuário administrador do PostfixAdmin (não do domínio). O padrão é usar o “postmaster”, mas você pode usar qualquer usuário que deseje.</p>
<p><img title="tela18" src="http://images.pedropereira.net/2009/05/tela18.png" alt="tela18" width="720" height="448" /></p>
<p>Aqui você irá criar um “alias”, um nome alternativo, para o usuário root. Isso é necessário pois é o usuário root quem irá receber as mensagens de falhas, problemas, etc do sistema.</p>
<p>Isso conclui toda a configuração do seu servidor de e-mail.</p>
<p>Depois, responda “Y” e pressione a tecla “enter” para dar continuidade ao processo de instalação do sistema.</p>
<p>Agora o iRedMail irá instalar e configurar (de acordo com os parâmetros passados a ele nos passos anteriores) todos os softwares envolvidos com o serviço de entrega de e-mails. Além disso, ele também irá atualizar todos os pacotes que já estão na máquina. O processo irá levar bastante tempo, seja paciente e aguarde até o final.</p>
<p>Quando o iRedMail perguntar se você deseja remover o sendmail, diga que sim.</p>
<p>Depois, o programa irá perguntar se você quer utilizar as regras de IPTables configuradas no iRedMail ou não. Se você quiser fazer as suas próprias regras, responda não. Caso deseje utilizar estas regras, responda sim. Se utilizar as regras, reinicie o IPTables quando for questionado.</p>
<p>Se você já estiver utilizando o MySQL para outras finalidades, responda não quando for questionado se quer sobrescrever o arquivo de configuração do MySQL utilizando um modelo fornecido pelo iRedMail. Caso não esteja utilizando o MySQL para outras finalidades, pode resopnder afirmativamente sem problemas.</p>
<p>Logo após, ele irá perguntar se você quer atualizar o Clamav. É recomendado que já faça isso para que você não corra o risco de esquecer de fazê-lo mais tarde. Para atualizar, responda “Y”.</p>
<p>Por último, o software irá perguntar se você quer inicializar o Postfix. Responda que sim. Ele irá inicializar o Postfix e todos os serviços que ele necessitar para funcionar corretamente.</p>
<p>Pronto! Seu servidor de e-mail está ativo! Basta agora você adicionar outros usuários ao banco de dados para que os outros usuários também possam utilizar o seu servidor (você pode utilizar o PostfixAdmin para isso).</p>
<p><strong>Acessando webmail e o PostfixAdmin</strong></p>
<p>Para acessar todos os serviços web configurados no seu servidor de e-mails, recomendo que configure um registro no seu DNS para facilitar as coisas.</p>
<p>Para acessar o webmail utilize a URL <a href="http://servidor/mail">http://servidor/mail</a> ou <a href="http://servidor/webmail">http://servidor/webmail</a>. Isto irá acessar o webmail que você escolheu durante a configuração do iRedMail.</p>
<p>O Postfixadmin ficará ativo no endereço <a href="http://servidor/postfixadmin">http://servidor/postfixadmin</a>.</p>
<p>Estas e muitas outras informações como localização de logs, arquivos de configuração utilizados, etc. estão localizados no arquivo dentro do diretório criado quando você descompacta o pacote do iRedMail, chamado iRedMail.tips. Nele você irá encontrar todas as informações que precisar.</p>
<p><strong>Conclusão</strong></p>
<p>O iRedMail é uma excelente ferramenta que simplifica e muito o processo de configurar um servidor de e-mails para a sua empresa. Porém, não confie 100% nele.</p>
<p>Faça todas as análises de segurança necessárias para garantir que seu servidor não será comprometido. Atualize sempre os softwares utilizados, tente configurar CHRoot, atualize sempre o anti-vírus, utilize senhas fortes, etc. Sempre tente garantir que seu servidor está o mais seguro possível.</p>
<p>&nbsp;</p>
<p>Fonte: http://www.pedropereira.net</p>
<div class="shr-publisher-611"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2011/11/01/iredmail-servidor-de-e-mails-facil-e-rapido/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Detecção de Intrusos no Sistema</title>
		<link>http://blog.deserv.info/2010/12/31/deteccao-de-intrusos-no-sistema/</link>
		<comments>http://blog.deserv.info/2010/12/31/deteccao-de-intrusos-no-sistema/#comments</comments>
		<pubDate>Fri, 31 Dec 2010 17:02:05 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Acesso Remoto]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[Deteção de Invasão em Host]]></category>
		<category><![CDATA[Deteção de Invasão em Rede]]></category>
		<category><![CDATA[hacker]]></category>
		<category><![CDATA[intrusos]]></category>
		<category><![CDATA[rootkit]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[snort]]></category>
		<category><![CDATA[Systems]]></category>
		<category><![CDATA[tripwire]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=516</guid>
		<description><![CDATA[(Por Pedro Ortale Neto) &#8211; Percebendo a falta de documentos relativos a Detecção de Intrusos em Portugues, escrevi este artigo (O primeiro de uma série), tratando da teoria básica sobre IDS e o uso de uma ferramenta para deteccao e check de integridade de arquivos, o tripwire, assim como detecção em Rede, usando o Snort. [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.deserv.info%252F2010%252F12%252F31%252Fdeteccao-de-intrusos-no-sistema%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FfEGQBg%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Detec%C3%A7%C3%A3o%20de%20Intrusos%20no%20Sistema%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>(Por Pedro Ortale Neto) &#8211; Percebendo a falta de documentos relativos a  Detecção de Intrusos em Portugues, escrevi este artigo (O primeiro de  uma série), tratando da teoria básica sobre IDS e o uso de uma  ferramenta para deteccao e check de integridade de arquivos, o tripwire,  assim como detecção em Rede, usando o Snort. Em breve estarei  publicando novo artigo, só que aprofundado ao IDS em rede, utilizando  como base o SNORT &amp; PortSentry.  <span id="more-516"></span><br />
INTRUSION DETECTION SYSTEMs<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
Pedro Ortale Neto &lt; ortale@unsecurity.com.br &gt;<br />
Unsecurity Systems</p>
<p>http://www.unsecurity.com.br</p>
<p>A internet hoje é um veículo imenso para disseminação do comércio,<br />
quebra de barreiras entre povos e nações e ao mesmo tempo, um meio<br />
de acesso de grande valia na mão de vândalos virtuais.<br />
Existe uma necessidade muito grande para que o mercado que circula<br />
por meio da Internet funcione e seja confiável: Segurança. Existem<br />
inúmeras ferramentas para que o grau de segurança  seja  um  pouco<br />
mais elevado, porém, o único sistema realmente seguro é aquele que<br />
não está  conectado  a  nenhuma  rede.  Sendo  assim, uma  solução<br />
obrigatória para qualquer rede que circula dados de missão crítica<br />
é um Sistema IDS, Intrusion Detection System.</p>
<p>Existem pelo menos dois tipos de IDS:</p>
<p>* Deteção de Invasão em Host<br />
* Deteção de Invasão em Rede</p>
<p>DETECÇÃO DE INVASÃO EM HOST<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>É importante realçar que um sistema de detecção de invasão eficaz não<br />
é  aquele  que  simplesmente  registra  dados  em um sistema que está<br />
sofrendo ataque, mas sim aquele que ao perceber qualquer anormalidade<br />
na rede inicia uma série de procedimentos que possam impedir o ataque<br />
ou minimizar as perdas.<br />
O  sistema  de  deteção  de  invasão  em  host é geralmente útil para<br />
detectar ataques já consagrados e localizar aquivos modificados com a<br />
intenção  de abrir portas  para  futuro  uso do host, seja como ponte<br />
de  ataque para  outras  redes,  capturar os dados da rede interna ou<br />
simplesmente alterar aquivos vitais do host.</p>
<p>A  primeira  ferramenta  que  usaremos  de  exemplo é  o TripWare, da<br />
Tripwire (R) Security Systems, Inc.</p>
<p>INSTALANDO O TRIPWARE<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>Faça o download do Tripwire em: http://www.tripwire.com/downloads/</p>
<p>Crie um diretório e mova o arquivo .tar.gz para dentro</p>
<blockquote><p># mkdir tripwire<br />
# cp Tripwire_221_for_Linux_x86.tar.gz tripwire</p></blockquote>
<p>Descompresse o arquivo e em seguida execute a instalação</p>
<blockquote><p># tar zxpvf Tripwire_221_for_Linux_x86.tar.gz<br />
#./install.sh</p></blockquote>
<p>Leia e aceite  a  licença de uso (é preciso rolar até o fim e digitar<br />
accept).  Em  seguida,  a  instalação  iniciará  após confirmação dos<br />
diretórios de destino.</p>
<p>O TripWare baseia-se  em  guardar  informações  sobre  estrutura  dos<br />
arquivos em seus sistema, sendo assim, para garantir a integridade do<br />
índice de verificação dos arquivos, são  usadas duas frases, uma para<br />
a chave do SITE e outra para LOCAL, respectivamente.<br />
Escolha a Frase, lembrando que quanto  mais diversos  caracteres você<br />
colocar, mais difícil de descriptografar esse arquivo será, impedindo<br />
o cracker de modificar seu sistema e alterar também os indices do IDS.</p>
<p>Após você digitar as frases, o Tripwire cria uma política padrão e<br />
para  acessá-la,  você  deve  digitar   novamente  as   frases.</p>
<p>Inicie o tripwire para criar um banco de dados primário</p>
<blockquote><p>#cd /usr/TSS/bin<br />
#./tripwire &#8211;init</p></blockquote>
<p>Em seguida,  digite  sua senha/frase de acesso LOCAL. Alguns erros de<br />
aquivos  não  encontrados  poderão surgir, mas é uma etapa normal. Os<br />
erros serão corrigidos nos  procedimentos descritos logo mais abaixo.</p>
<p>Antes  de  atualizar  o  banco  de  dados de arquivos, primeiramente,<br />
procure por  todos os arquivos setuid/setgid e grave  a lista  em um<br />
arquivo  de  log. Estes arquivos  fornecem  privilégios  especiais ao<br />
usuário que esta executando o mesmo, sendo assim esses arquivos podem<br />
ser usado paraaccessar partes restritas do sistema.</p>
<blockquote><p># find / -type f -perm +6000 -ls &gt;&gt; setgiduid.log</p></blockquote>
<p>É bom monitorar arquivos que possuem permissão de gravação configurada<br />
para todos usuários e arquivos que nao possuem dono ou grupo.  Grave a<br />
lista em um arquivo de log</p>
<blockquote><p># find / -perm -2 ! -type l -ls &gt;&gt; todosrwx.log<br />
# find / -nouser -o -nogroup &gt;&gt; sem.log</p></blockquote>
<p>A partir de agora, você tem uma lista de arquivos potênciais em relação<br />
a  segurança,  o  próximo  passo é adicioná-los no arquivo de políticas</p>
<blockquote><p># joe /usr/TSS/policy/twpol.txt (Use o editor de texto de sua preferência)</p></blockquote>
<p>Procure por:</p>
<blockquote><p>setuid/setgid root programs<br />
(rulename = &#8220;setuid/setgid&#8221;, severity = $(SIG_HI))<br />
{</p></blockquote>
<p>Apague todas as linhas entre os dois colchetes ( { &amp; } ) e adicione toda a<br />
lista dos arquivos setgid/uid, respeitando a seguinte sintaxe:</p>
<blockquote><p>/caminho/do/arquivo -&gt; $(SEC_SUID);</p></blockquote>
<p>Exemplo:</p>
<blockquote><p>{<br />
/usr/X11R6/bin/Xwrapper -&gt; $(SEC_SUID);<br />
/usr/X11R6/bin/xterm -&gt; $(SEC_SUID);<br />
/usr/X11R6/bin/xhextris -&gt; $(SEC_SUID);<br />
/usr/X11R6/bin/kterm -&gt; $(SEC_SUID);<br />
/usr/X11R6/bin/XConsole -&gt; $(SEC_SUID);<br />
}</p></blockquote>
<p>Configure  todas  as partes do arquivo de configuração conforme seu sistema,<br />
assim como  arquivos de  shells,  configurações,  segurança e diretórios de<br />
arquivos temporários.</p>
<p>Atualize o arquivo de políticas e em seguida Entre com a sua password/frase<br />
do  Site,  em  seguida  atualize  o banco de dados de arquivos do tripwire:</p>
<blockquote><p># ./twadmin -m p ../policy/twpol.txt<br />
# ./tripwire &#8211;init</p></blockquote>
<p>Para verificar a Integridade dos arquivos, simplesmente digite:</p>
<blockquote><p># ./tripwire &#8211;check</p></blockquote>
<p>Todas as modificações nos arquivos configurados são informadas.</p>
<p>Recomendo que os arquivos de configuração sejam gravados em uma mídia não<br />
regravável, assim como um cd-rom, sendo  assim  jamais os dados do índice<br />
poderão ser alterados.</p>
<p>Para maiores informações sobre o uso do tripwire, consulte a documentação.</p>
<p>DETECÇÃO DE INVASÃO EM REDE<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>Detecção  de  invasão  em  redes não é uma tarefa fácil, depende de muita<br />
análise, às vezes a nível de protocolo  e  muito  conhecimento   técnico,<br />
mas não é por isso  que  o  administrador   deve  se  desencorajar,  pelo<br />
contrário,  faça experiências,  experimente  produtos  e  simule  ataques<br />
para maior compreensão dos dados  obtidos  por  programas  dessa  classe.</p>
<p>Utilizaremos dois softwares  para  detecção  de  intrusão (Ou tentativa<br />
de intrusão), PortSentry, da Psionic e o Snort.</p>
<p>INSTALAÇÃO E USO DO PORTSENTRY<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>Faça o download de http://www.psionic.com/tools/portsentry-1.0.tar.gz,<br />
descompresse, compile e instale a distribuição:</p>
<blockquote><p># tar zxpvf portsentry-1.0.tar.gz<br />
# cd portsentry-1.0<br />
# ./configure<br />
# make<br />
# make install</p></blockquote>
<p>O Portsentry será instalado no diretório /usr/local/psionic/portsentry</p>
<p>Basicamente, o portsentry opera em quatro modos (Plataforma Linux)</p>
<blockquote><p>- Simples Detecção de Portas TCP<br />
# ./portsentry -tcp<br />
- Simples Detecção de Portas UDP<br />
# ./portsentry -udp<br />
- Detecção de Stealth Portscan TCP<br />
# ./portsentry stcp<br />
- Detecção de Stealth Portscan UDP<br />
# ./portsentry sudp</p></blockquote>
<p>Para maiores informações sobre configuração/instalação do portsentry,<br />
leia o texto de Renato Murilo Langona:</p>
<p>http://www.linuxsecurity.com.br/renato/antiscan.html</p>
<p>INSTALAÇÃO E USO DO SNORT<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>Antes de iniciar a instalação do software, precisamos planejar como<br />
o  Snort  será instalado,  respondendo  algumas  questões  simples:</p>
<p>A máquina é dedicada?<br />
A máquina possui uma ou mais placas de rede?<br />
Qual o Sistema Operacional?</p>
<p>O modo mais simples de instalar o Snort é uma máquina dedicada, com uma<br />
placa  de rede e Linux, porém, o recomendado é uma máquina dedicada com<br />
duas placas de rede, então vamos la&#8230;</p>
<p>Quando se trata de duas placas de redes no Snort, uma é usada em modo<br />
Promíscuo, ou seja, agindo com um sniffer  e  outra  como  porta para<br />
administraçào remota (Via outra máquina na rede interna).<br />
Sendo assim, teremos o seguinte diagrama:</p>
<p>[ADMINISTRATIVO]&#8212;&#8212;&#8211;[SNORT]&#8212;&#8211;INTERNET<br />
|                      |<br />
[COMP 1]                 [DMZ]<br />
|<br />
[COMP 2]</p>
<p>Após escolhermos esse modelo de implantação, iniciaremos a instalação</p>
<p>Puxe e instale o pacote para RedHat em:</p>
<p>http://www.linuxsecurity.com/programs/snort-1.6.2.2-1.i386.rpm</p>
<blockquote><p># rpm -i snort-1.6.2.2-1.i386.rpm</p></blockquote>
<p>Após instalar via RPM, é nescessário configurar algumas definições no<br />
arquivo /etc/snort/rules.base</p>
<p>Será algo parecido com:</p>
<blockquote><p>var INTERNAL 192.168.1.0/24<br />
var EXTERNAL 63.87.101.0/24<br />
var DNSSERVERS 63.87.101.90/32 63.87.101.92/32</p></blockquote>
<p>Substitua usando os dados de sua rede, lembre-se de adicionar os hosts<br />
confiáveis  no  arquivo  rules.base  respeitando  o  formato  abaixo:</p>
<p>preprocessor portscan-ignorehosts: 63.87.101.90/32 63.87.101.92/32</p>
<p>Adicione no arqivo /etc/passwd:<br />
snort:x:201:201:Snort:/etc/snort:/bin/false</p>
<p>e no arquivo /etc/group<br />
snort:x:201:</p>
<p>Teste a configuração pelo comando abaixo;</p>
<blockquote><p># snort -d -l /var/log/snort -c /etc/snort/rules.base</p></blockquote>
<p>Irá resultar em algo parecido com:</p>
<p>Initializing Network Interface&#8230;<br />
User level filter, protocol ALL, raw packet socket<br />
Decoding Ethernet on interface eth0<br />
Initializing Preprocessors!<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
Keyword     |       Preprocessor @<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
http_decode  :       0&#215;8053070<br />
minfrag      :       0&#215;8053290<br />
portscan     :       0x8053ce0<br />
portscan-ignorehosts:       0&#215;8054340<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>Initializing Plug-ins!<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
Keyword     |      Plugin Registered @<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
content      :      0&#215;8052050<br />
offset       :      0&#215;8052080<br />
depth        :      0x80520f0<br />
nocase       :      0&#215;8052160<br />
flags        :      0&#215;8052710<br />
itype        :      0x80528f0<br />
icode        :      0x8052a00<br />
ttl          :      0x8052b10<br />
id           :      0x8052bf0<br />
ack          :      0x8052cd0<br />
seq          :      0x8052dc0<br />
dsize        :      0x8052ec0<br />
ipopts       :      0&#215;8054420<br />
rpc          :      0&#215;8054670<br />
icmp_id      :      0&#215;8054830<br />
icmp_seq     :      0&#215;8054930<br />
session      :      0&#215;8055300<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>Initializating Output Plugins!<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
Keyword     |          Output @<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
alert_syslog :       0x8054a20<br />
log_tcpdump  :       0x8054ff0<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>+++++++++++++++++++++++++++++++++++++++++++++++++++<br />
Initializing rule chains&#8230;<br />
255 Snort rules read&#8230;<br />
255 Option Chains linked into 140 Chain Headers<br />
+++++++++++++++++++++++++++++++++++++++++++++++++++</p>
<p>Performing Rule List Integrity Tests&#8230;<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
Alert TCP Chains    : OK<br />
Alert UDP Chains    : OK<br />
Alert ICMP Chains   : OK<br />
Log TCP Chains      : Empty list&#8230;<br />
Log UDP Chains      : Empty list&#8230;<br />
Log ICMP Chains     : Empty list&#8230;<br />
Pass TCP Chains     : Empty list&#8230;<br />
Pass UDP Chains     : Empty list&#8230;<br />
Pass ICMP Chains    : Empty list&#8230;<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>-*&gt; Snort! &lt;*-<br />
Version 1.6<br />
By Martin Roesch (roesch@clark.net, www.clark.net/~roesch)</p>
<p>Pressione Control + C para cancelar</p>
<p>A partir de agora você pode usar o Daemon pelo comando:</p>
<blockquote><p># /usr/sbin/snort -s -d -D -i eth0 -l /var/log/snort<br />
-c /etc/snort/rules.base</p></blockquote>
<p>ou</p>
<blockquote><p>#./etc/rc.d/init.d/snortd start</p></blockquote>
<p>Exemplificando um portscan: (Onde Hacker é o host de quem ataca)</p>
<blockquote><p>[HACKER]#nmap -p 25,53 -sX -P0 -D 1.2.3.4,5.6.7.8 192.168.200.189</p></blockquote>
<p>Starting nmap V. 2.54BETA1 by fyodor@insecure.org (www.insecure.org/nmap/)<br />
Interesting ports on smtp.mydomain.com (192.168.200.189):<br />
Port       State       Service<br />
25/tcp     open        smtp<br />
53/tcp     open        domain</p>
<p>Nmap run completed &#8212; 1 IP address (1 host up) scanned in 19 seconds</p>
<p>No host do snort (/var/log/snort/portscan.log)</p>
<p>Jun 18 15:57:52 krypton snort[9131]: spp_portscan: PORTSCAN DETECTED from<br />
1.2.3.4<br />
Jun 18 15:57:52 krypton snort[9131]: spp_portscan: PORTSCAN DETECTED from<br />
5.6.7.8<br />
Jun 18 15:57:58 krypton snort[9131]: spp_portscan: portscan status from<br />
192.168.1.100: 2 connections across 1 hosts: TCP(2), UDP(0) STEALTH<br />
Jun 18 15:57:58 krypton snort[9131]: spp_portscan: portscan status from<br />
1.2.3.4: 2 connections across 1 hosts: TCP(2), UDP(0) STEALTH<br />
Jun 18 15:57:58 krypton snort[9131]: spp_portscan: portscan status from<br />
5.6.7.8: 2 connections across 1 hosts: TCP(2), UDP(0) STEALTH</p>
<p>CONCLUSAO<br />
&#8212;&#8212;&#8212;</p>
<p>Este artigo foi apenas uma demonstração sobre  os  dois tipos de<br />
sistemas IDS, o de Host e o de Network, exemplificando o emprego<br />
de 3 aplicações de excelência (Tripwire,  PortSentry  &amp;  Snort).<br />
Estas ferramentas ajudam  o administrador a posicionar-se diante<br />
a ataques que muitas  vezes  não  sabem que siquer ocorrem. Este<br />
é o  primeiro  de  uma série de artigos exclusivos para a o site<br />
Linuxsecurity  Brasil  sobre  a área de Detecção de Intrusão, em<br />
breve os principais utilitários em IDS serão comentados. Até lá.</p>
<p>Fonte: http://www.linuxsecurity.com.br/</p>
<div class="shr-publisher-516"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/12/31/deteccao-de-intrusos-no-sistema/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Uma introdução ao shell-script</title>
		<link>http://blog.deserv.info/2010/11/23/uma-introducao-ao-shell-script/</link>
		<comments>http://blog.deserv.info/2010/11/23/uma-introducao-ao-shell-script/#comments</comments>
		<pubDate>Tue, 23 Nov 2010 22:14:50 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Linguagem de Programação]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Scripts Shell]]></category>
		<category><![CDATA[Shell Scripts]]></category>
		<category><![CDATA[ShellScripts]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=457</guid>
		<description><![CDATA[Imagine que, em um futuro distante, o Google decida transformar o Android em um sistema para robôs pessoais. Seu robô com o Android poderia ser então instruído a executar qualquer tipo de tarefa, desde que você conseguisse explicar para ele o que precisa fazer na forma de instruções simples. Uma ida até a geladeira para [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.deserv.info%252F2010%252F11%252F23%252Fuma-introducao-ao-shell-script%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2Ffmg0qD%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Uma%20introdu%C3%A7%C3%A3o%20ao%20shell-script%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Imagine que, em um futuro distante, o Google decida transformar o Android em um sistema para robôs pessoais. Seu robô com o Android poderia ser então instruído a executar qualquer tipo de tarefa, desde que você conseguisse explicar para ele o que precisa fazer na forma de instruções simples. Uma ida até a geladeira para pegar uma lata de refrigerante poderia ser explicada dessa forma: <span id="more-457"></span></p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><span style="font-size: x-small;">Ir até a cozinha.<br />
Abrir a geladeira.<br />
Olhar a prateleira da direita.<br />
Se encontrar uma lata de coca-cola, trazer para mim.<br />
Senão, trazer a lata de guaraná.<br />
Se não encontrar lata alguma, fechar a geladeira e voltar.</span></span></p>
<p>Este mesmo princípio, de dividir a tarefa a ser feita em instruções simples, é comum a todas as linguagens de programação. Elas podem variar em complexidade, mas a ideia central é sempre a mesma: explicar ao sistema o que fazer, em uma linguagem que ele seja capaz de entender.</p>
<p>No caso do shell-script, você precisa apenas pensar em uma maneira de &#8220;explicar&#8221; o que você quer que seja feito através de comandos de terminal. Conforme você vai adquirindo mais familiaridade com o sistema, este acaba se tornando um processo natural, já que qualquer conjunto de comandos para executar uma determinada tarefa pode ser transformado em um script rapidamente. Vamos então a alguns exemplos básicos para quebrar o gelo.</p>
<p>O tipo mais simples de script consiste em um bloco de comandos, que automatiza alguma tarefa repetitiva. Estes scripts &#8220;burros&#8221; são uma excelente forma de simplificar o uso do sistema, evitando que você precise memorizar sequências de comandos. Um bom exemplo é este mini-script que uso para conectar um mouse bluetooth:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><span style="font-size: x-small;">#!/bin/sh<br />
# Checagem para ter certeza que o suporte a bluetooth está ativado:<br />
hciconfig hci0 down<br />
/etc/init.d/bluetooth restart<br />
hciconfig hci0 up<br />
# Ativa o mouse:<br />
hidd &#8211;connect 00:07:61:62:cb:bb</span></span></p>
<p>Estes quatro comandos permitem ativar o mouse em qualquer distribuição, de forma que preciso apenas executar o script e colocá-lo para ser inicializado automaticamente, sem precisar me preocupar com as peculiaridades de cada uma.</p>
<p>Para usá-lo, é necessário apenas criar um arquivo de texto chamado &#8220;btmouse.sh&#8221; (ou qualquer outro nome que escolher), colocá-lo dentro do seu home, ou da sua partição de dados (para que ele não seja perdido ao reinstalar o sistema) e marcar a permissão de execução (&#8220;chmod +x btmouse.sh&#8221;).</p>
<p>A partir daí, você pode passar a executar o script quando precisar ativar o mouse:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><strong># /mnt/sda6/btmouse.sh</strong></span></p>
<p>&#8230; ou adicionar o comando no final do arquivo &#8220;/etc/rc.d/rc.local&#8221; (ou outro arquivo de inicialização) para que ele passe a ser executado automaticamente.</p>
<p>O problema com esses scripts simples é que eles servem para propósitos bem específicos, já que os passos executados são sempre os mesmos. Este script para ativar o mouse bluetooth, por exemplo, funciona apenas com o meu mouse, já que o endereço de conexão está gravado dentro do próprio script.</p>
<p>Scripts mais complexos começam quase sempre com alguma pergunta. Um gerenciador de downloads precisa saber qual é a URL do arquivo a baixar, um discador precisa saber qual modem será utilizado e qual o número de acesso do provedor, um instalador de programas precisa saber qual programa deve ser instalado e assim por diante.</p>
<p>Dependendo da situação, as perguntas podem ser feitas diretamente, no estilo &#8220;digite a URL do arquivo a baixar&#8221;, ou através de um menu de seleção, onde você lista as funções oferecidas pelo script e o usuário clica na opção desejada.</p>
<p>Para fazer uma pergunta direta (que é o formato mais simples), usamos o comando &#8220;<strong>read</strong>&#8220;, que lê uma resposta e a armazena em uma variável. Quase sempre ele é usado em conjunto com o &#8220;echo&#8221;, que permite escrever texto na tela, fazendo a pergunta, como em:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><span style="font-size: x-small;">echo &#8220;Digite a URL do arquivo a baixar&#8221;<br />
read arquivo<br />
wget -c $arquivo</span></span></p>
<p>Com estes três comandos, criamos um gerenciador de downloads primitivo, que pede a URL do arquivo (que você poderia colar no terminal usando o botão central do mouse) e faz o download usando o wget, que é um gerenciador em modo texto, muito usado em scripts.</p>
<p><span style="font-family: Bitstream Vera Sans,sans-serif;">A URL digitada é armazenada na variável &#8220;arquivo&#8221;, que pode ser usada ao </span>longo do script. Ao usá-la, é necessário incluir um &#8220;$&#8221;, que faz com que o shell entenda que se trata da variável &#8220;arquivo&#8221; e não de um trecho de texto qualquer. Quando o script fosse executado, o &#8220;<span style="font-family: Bitstream Vera Sans Mono,sans-serif;">wget -c $arquivo</span>&#8221; seria transformado em  algo como &#8220;wget -c http://gdhpress.com.br/arquivo.zip&#8221;, iniciando o download.</p>
<p><span style="font-family: Bitstream Vera Sans,sans-serif;">O &#8220;-c&#8221; é uma opção para o wget, que faz com que ele continue o download caso interrompido. Se você pressionasse &#8220;Ctrl+C&#8221; durante o download para encerrar o script e o executasse novamente, fornecendo a mesma URL, ele continuaria o download de onde parou. </span></p>
<p><span style="font-family: Bitstream Vera Sans,sans-serif;">Você poderia incrementar o script, incluindo mais perguntas e usando mais opções do wget. A primeira parada nesse caso seria o &#8220;man wget&#8221;, onde você poderia garimpar as opções suportadas pelo comando e selecionar algumas que poderiam ser úteis dentro do script. Um bom exemplo é a opção &#8220;&#8211;limit-rate=&#8221; que permite limitar a taxa de download. Você poderia incluir a opção no script adicionando mais uma pergunta, como em:</span></p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><span style="font-size: x-small;">echo &#8220;Digite a URL do arquivo a baixar&#8221;<br />
read arquivo<br />
echo &#8220;Digite a taxa máxima de download, em kbytes. ex: 48&#8243;<br />
read taxa<br />
wget -c &#8211;limit-rate=$taxa $arquivo </span></span></p>
<p>Este formato simples funciona bem para scripts rudimentares, destinados a simplesmente automatizarem alguma tarefa específica, a partir de algumas perguntas simples. Para scripts mais completos, precisamos começar a usar as operações lógicas, que permitem que o script tome decisões. O formato mais básico é o &#8220;se, então, senão&#8221;, que no shell script é representado pelos operadores &#8220;if&#8221;, &#8220;then&#8221; e &#8220;else&#8221;.</p>
<p>Imagine que você está fazendo um script conversor de vídeos, que é capaz de gerar arquivos em quatro diferentes formatos. O script começa perguntando qual formato usar e, de acordo com a resposta, executa os comandos apropriados para fazer a conversão.</p>
<p>Para simplificar, vamos fazer com que o script simplesmente converta todos os arquivos dentro do diretório atual, em vez de perguntar quais arquivos converter ou de exibir uma caixa de seleção.</p>
<p>A parte da pergunta poderia ser feita com o &#8220;echo&#8221;, como no exemplo anterior. Como agora são várias linhas de texto, usei aspas simples ( &#8216; ) em vez de aspas duplas. As aspas simples permitem que você inclua quebras de linha e caracteres especiais dentro do texto, fazendo com que o shell simplesmente escreva tudo literalmente:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><span style="font-size: x-small;">echo <strong>&#8216;</strong>Escolha o formato de saída:<br />
1) MPEG4, 320&#215;240 (vídeos no formato 4:3)<br />
2) MPEG4, 320&#215;176 (vídeos em formato wide)<br />
3) Real Player, 320&#215;240 (vídeos no formato 4:3)<br />
4) Real Player, 320&#215;176 (vídeos em formato wide)<br />
(Responda 1, 2, 3 ou 4, ou qualquer outra tecla para sair)<strong>&#8216;</strong><br />
read resposta</span></span></p>
<p>No final deste trecho, teríamos a variável &#8220;resposta&#8221;, que armazenaria um número de 1 a 4. Precisamos agora fazer com que o script decida o que fazer de acordo com a resposta.</p>
<p>O jeito mais simples de fazer isso seria simplesmente colocar um bloco com 4 comandos &#8220;<strong>if</strong>&#8221; (se), um para cada possibilidade. Cada &#8220;if&#8221; é sempre acompanhado por um &#8220;<strong>then</strong>&#8221; (então) e um &#8220;<strong>fi</strong>&#8221; (fim do se), como em:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><span style="font-size: x-small;">if [ "$resposta" = "1" ]; then<br />
[comandos ...]<br />
fi<br />
if [ "$resposta" = "2" ]; then<br />
[comandos ...]<br />
fi<br />
if [ "$resposta" = "3" ]; then<br />
[comandos ...]<br />
fi<br />
if [ "$resposta" = "4" ]; then<br />
[comandos ...]<br />
fi</span></span></p>
<p>Uma forma mais elegante (e mais à prova de falhas), seria usar o &#8220;<strong>elif</strong>&#8221; (que poderia ser traduzido para &#8220;senão se&#8221;) e o &#8220;<strong>else</strong>&#8221; (senão), como em:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><span style="font-size: x-small;">if [ "$resposta" = "1" ]; then<br />
[comandos ...]<br />
elif [ "$resposta" = "2" ]; then<br />
[comandos ...]<br />
elif [ "$resposta" = "3" ]; then<br />
[comandos ...]<br />
elif [ "$resposta" = "4" ]; then<br />
[comandos ...]<br />
else<br />
echo &#8220;Você digitou uma opção inválida. O script termina aqui.&#8221;<br />
fi</span></span></p>
<p>Como pode ver, ao usar o elif você não precisa mais incluir um &#8220;fi&#8221; para cada possibilidade. Outra vantagem é que você pode agora incluir um &#8220;else&#8221; no final, que faz com que o script responda com uma mensagem de erro ao receber alguma resposta que não estava esperando. Dentro de cada uma das condições, você incluiria um bloco de comandos destinado a gerar os arquivos convertidos com os parâmetros correspondentes, como em:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><span style="font-size: x-small;">if [ "$resposta" = "1" ]; then<br />
for i in *; do<br />
mencoder -oac mp3lame -lameopts cbr:br=128 -ovc lavc -lavcopts \<br />
vcodec=mpeg4:vbitrate=512 -ofps 16 -vf scale=320:176 -o &#8220;c-<strong>$i</strong>&#8221; &#8220;<strong>$i</strong>&#8221;<br />
done</span></span></p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><span style="font-size: x-small;">elif [ "$resposta" = "2" ]; then<br />
[o resto do script...]</span></span></p>
<p>Esse comando gigante que se esparrama pela terceira e a quarta linha é um comando de conversão do mencoder (um pequeno utilitário de conversão de arquivos de mídia em modo texto, que é bastante flexível), que gera um arquivo de vídeo otimizado para ser assistido em smartphones. Esse é o tipo de comando que é longo demais para ser escrito manualmente, mas que pode perfeitamente ser usado através de um script.</p>
<p>Veja que a variável &#8220;i&#8221; é usada no final da quarta linha, para indicar o nome do arquivo. <span style="font-family: Bitstream Vera Sans,sans-serif;">O &#8220;c-$i&#8221; &#8220;$i&#8221; faz com que o script adicione o prefixo &#8220;c-&#8221; no nome dos arquivos convertidos, permitindo que eles sejam incluídos na pasta sem apagar os arquivos originais. </span></p>
<p><span style="font-family: Bitstream Vera Sans,sans-serif;">O comando do mencoder é colocado dentro de outra condicional, agora usando o &#8220;<strong>for</strong>&#8221; (enquanto), que permite que o script</span> execute um conjunto de comandos repetidamente.</p>
<p>No exemplo, ele é usado para fazer com que o comando de conversão do mencoder seja executado uma vez para cada arquivo dentro da pasta. Ao ser executado, a variável &#8220;i&#8221; (poderia ser qualquer outro nome) recebe o nome do primeiro arquivo, o que faz com que ele seja convertido.</p>
<p>Ao chegar no &#8220;done&#8221;, o interpretador volta à linha inicial e a variável &#8220;i&#8221; recebe agora o nome do segundo arquivo. O processo é então repetido para cada um dos arquivos da pasta, até o último (a lista dos arquivos a converter é gerada pelo interpretador no início do script, por isso não existe o risco do conversor ficar em loop). O &#8220;for i in *; do&#8221; poderia ser traduzido como &#8220;para cada arquivo dentro da pasta atual, execute&#8221;.</p>
<p><span style="font-family: Bitstream Vera Sans,sans-serif;">Você pode baixar o script pronto, incluindo os comandos de conversão no:<br />
</span><a href="http://www.gdhpress.com.br/blog/converter-video/">http://www.gdhpress.com.br/blog/converter-video/</a></p>
<p>Outro exemplo de uso para o &#8220;for&#8221; seria baixar uma lista de arquivos ISO especificada em um arquivo de texto. Imagine que você goste de testar novas distribuições e, de vez em quando, queira deixar o PC ligado durante a madrugada colocando os downloads em dia. Você poderia facilitar as coisas usando um script como:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><span style="font-size: x-small;">#!/bin/sh<br />
echo &#8220;Digite a taxa máxima de download, em kbytes. ex: 48&#8243;<br />
read taxa</span></span></p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><span style="font-size: x-small;">for i in `cat /home/$USER/downloads.txt`; do<br />
wget -c &#8211;limit-rate=$taxa $i<br />
done</span></span></p>
<p>Para usá-lo, você precisaria apenas criar um arquivo &#8220;downloads.txt&#8221; dentro do seu diretório home, colocando os links de download dos ISOs das distribuições, um por linha, como em:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><span style="font-size: x-small;">http://ftp.heanet.ie/pub/linuxmint.com/stable/6/LinuxMint-6.iso<br />
ftp://ftp.nluug.nl/pub/os/Linux/distr/dreamlinux/stable/DL3.5_20092802.iso</p>
<p>http://sidux.c3sl.ufpr.br/release/sidux-2009-01-ouranos-kde-lite-i386.iso</span></span></p>
<p>Ao executar o script, ele começaria perguntando a taxa máxima de download (com a resposta sendo armazenada na variável &#8220;taxa&#8221;), leria o arquivo e baixaria os arquivos listados para o diretório atual. A linha do wget inclui duas variáveis: a taxa de download e o arquivo a baixar. Por causa do &#8220;for&#8221;, o comando é repetido para cada um dos links listados no arquivo, fazendo com que eles sejam baixados um de cada vez.</p>
<p>Embora simples, este script introduz algumas idéias novas. A primeira é o uso das crases (&#8220;), que permitem usar o resultado de um comando. Graças a elas, podemos usar o &#8220;cat&#8221; para ler o arquivo de texto e assim fazer com que o script carregue as URLs dentro da variável &#8220;i&#8221;, uma de cada vez.</p>
<p>Outra novidade é o uso do &#8220;/home/$USER&#8221;, uma variável de sistema que contém sempre o diretório home do usuário que executou o script. Isso faz com que o script procure pelo arquivo &#8220;downloads.txt&#8221; dentro do seu diretório home, e não em uma localização específica.</p>
<p>Uma prática um pouco mais avançada é o uso de funções. Elas permitem que você crie blocos de código destinados a executarem tarefas específicas que podem ser usados ao longo do script. Em outras palavras, as funções são pequenos scripts dentro do script.</p>
<p>A grande vantagem de criar funções (em vez de simplesmente repetir os comandos quando precisar) é que, ao atualizar o script, você precisa alterar apenas um bloco de comandos, em vez de precisar procurar e alterar os comandos manuais em vários pontos do script. Por permitirem reaproveitar o código, as funções fazem com que o script seja mais organizado e fique com menos linhas, o que facilita muito a manutenção em scripts complexos.</p>
<p>Imagine, por exemplo, que você precisa repetir uma mesma mensagem de erro várias vezes ao longo do script. Você poderia usar uma função como esta:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><span style="font-size: x-small;"><strong>msgerro</strong>()<br />
{<br />
echo &#8220;Algo deu errado durante a conexão. O erro foi:&#8221;<br />
echo &#8220;$msg&#8221;<br />
}</span></span></p>
<p>Veja que a função começa com uma declaração (&#8220;msgerro()&#8221;), onde você especifica um nome e adiciona o &#8220;()&#8221;, que faz com que o sistema entenda que se trata de uma função e não de um outro bloco de comandos qualquer. Os comandos são, em seguida, colocados dentro de um par de chaves ( { &#8230;. } ), que indicam o início e o final. A partir daí, você pode executar os comandos dentro do script chamando o nome da função (msgerro), como se fosse um comando qualquer.</p>
<p>Um exemplo é o script para conectar usando modems e smartphones 3G que escrevi em 2008, que está disponível no: <a href="http://www.gdhpress.com.br/blog/script-vivo-zap/">http://www.gdhpress.com.br/blog/script-vivo-zap/</a></p>
<p>Ele prevê o uso de diversos tipos de conexão e inclui várias funções de checagem e solução de problemas (que são usadas repetidamente ao longo do script), por isso ele é bastante longo e complexo, com quase 900 linhas. Se tiver curiosidade em acessar o tópico e olhar o código, vai ver que crio diversas funções no início do script (a &#8220;bpairing()&#8221; contém os comandos para fazer o pareamento com smartphones e conectar via Bluetooth, enquanto a &#8220;checaporta()&#8221; verifica em que porta o modem ou smartphone está conectado, por exemplo) que são usadas ao longo do script.</p>
<p>Outra necessidade comum é salvar parâmetros e configurações, evitando que o script precise perguntar tudo novamente cada vez que for executado. Uma forma simples de implementar isso é fazer com que o script salve as variáveis com as configurações usadas em arquivo de texto (é geralmente usado um arquivo oculto dentro do diretório home), como em:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><span style="font-size: x-small;">echo &#8220;tel=\&#8221;$tel\&#8221;" &gt; /home/$USER/.myscript<br />
echo &#8220;porta=\&#8221;$porta\&#8221;" &gt;&gt; /home/$USER/.myscript</span></span></p>
<p>Esses comandos criariam o arquivo &#8220;.myscript&#8221; dentro do diretório home do usuário que executou o script. Graças ao uso do ponto, ele se torna um arquivo oculto, assim como os demais arquivos de configuração do sistema.</p>
<p>O arquivo de configuração pode ser carregado dentro <span style="font-family: Bitstream Vera Sans,sans-serif;">do script com um &#8220;. /home/$USER/.myscript&#8221; (ou seja, ponto, espaço e a localização do arquivo), o que faz com que o interpretador processe os comandos dentro do arquivo como se fossem parte do script principal.</span></p>
<p><span style="font-family: Bitstream Vera Sans,sans-serif;">Um exemplo de uso seria uma versão aperfeiçoada do script para ativar mouses Bluetooth que mostrei a pouco, que perguntasse o endereço do mouse da primeira vez que fosse executado e passasse a usar a configuração salva daí em diante:</span></p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><span style="font-size: x-small;">#!/bin/sh</span></span></p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><span style="font-size: x-small;">if [ -e "/home/$USER/.btmouse" ]; then<br />
echo &#8220;Carregando configuração salva no arquivo /home/$USER/.btmouse.&#8221;<br />
. /home/$USER/.btmouse<br />
else<br />
# Se o arquivo não existir, pergunta o endereço e salva a configuração.<br />
echo &#8220;Digite o endereço do mouse que será usado (ex: 00:07:61:62:cb:bb):&#8221;<br />
read addr<br />
echo &#8220;addr=\&#8221;$addr\&#8221;" &gt; /home/$USER/.btmouse<br />
fi</span></span></p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><span style="font-size: x-small;"># Mensagem explicativa:<br />
echo &#8220;Conectando a $addr&#8221;<br />
echo &#8220;Delete o arquivo /home/$USER/.btmouse para trocar o endereço.&#8221;</span></span></p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><span style="font-size: x-small;"># O script propriamente dito:<br />
hciconfig hci0 down<br />
/etc/init.d/bluetooth restart<br />
hciconfig hci0 up<br />
hidd &#8211;connect $addr</span></span></p>
<p>Embora estes exemplos utilizem apenas perguntas simples, em texto, os shell-scripts podem também exibir janelas, avisos, perguntas e menus de seleção gráficos de maneira muito simples, utilizando o Xdialog, Kdialog ou o Zenity, que permitem mostrar janelas gráficas de forma surpreendentemente fácil.</p>
<p>Para mostrar uma mensagem de texto, por exemplo, você usaria o &#8220;zenity &#8211;info &#8211;text&#8221; seguido da mensagem a mostrar, como em:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;">zenity &#8211;info &#8211;text &#8220;Conexão ativa.&#8221;</span></p>
<p>Para abrir uma janela de seleção de arquivo, você usaria o &#8220;zenity &#8211;file-selection&#8221;, que exibe uma janela similar à do gerenciador de arquivos, permitindo escolher o arquivo que será usado.</p>
<p>Normalmente, a localização do arquivo seria simplesmente escrita no terminal. Para que ela seja armazenada em uma variável (permitindo que você a use posteriormente ao longo do script), você usaria:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;">arquivo=`zenity &#8211;file-selection &#8211;title &#8220;Escolha o arquivo&#8221;`</span></p>
<p>Estes dois comandos simples poderiam ser usados para criar um aplicativo rudimentar de gravação de CDs, veja só:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><span style="font-size: x-small;">#!/bin/sh</span></span></p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><span style="font-size: x-small;">zenity &#8211;info &#8211;text &#8220;Coloque uma mídia virgem no drive&#8221;<br />
iso=`zenity &#8211;file-selection &#8211;title &#8220;Escolha o arquivo ISO para gravar:&#8221;`<br />
wodim dev=/dev/scd0 speed=16 -dao -eject -v $iso</span></span></p>
<p>Quando executado, o script mostraria as duas janelas e gravaria o arquivo ISO selecionado usado o wodim, que é um aplicativo de gravação de CDs via linha de comando, usado por diversos outros aplicativos. Quando você queima um CD usando o Brasero ou o K3B, é o wodim quem faz o trabalho pesado, assim como no caso do nosso script:</p>
<p><img src="http://www.gdhpress.com.br/linux/leia/cap1-19_html_m55db5c2c.png" border="0" alt="" align="BOTTOM" /></p>
<p><img src="http://www.gdhpress.com.br/linux/leia/cap1-19_html_m13d18a3a.png" border="0" alt="" align="BOTTOM" /></p>
<p>Graças à opção &#8220;-eject&#8221; adicionada à linha de gravação, o script ejeta a mídia depois de gravada, o que torna desnecessário incluir mais uma janela avisando que a gravação foi concluída. O wodim suporta diversas outras opções de gravação (que você pode consultar no &#8220;man wodim&#8221;), que poderiam ser usadas para aperfeiçoar o script. Você precisaria apenas incluir algumas perguntas adicionais, salvar as respostas em variáveis e incluí-las na linha de gravação.</p>
<p>Concluindo essa breve introdução, dois outros comandos fundamentais em se tratando de shell-scripts são o pipe e o grep. Aqui vai uma explicação resumida sobre eles:</p>
<p><strong>pipe</strong>: Junto com as setas de redirecionamento (&gt; e &gt;&gt;), o pipe ( | ) é muito usado em scripts e comandos diversos. Ele permite fazer com que a saída de um comando seja enviada para outro ao invés de ser mostrada na tela. Parece uma coisa muito exótica, mas acaba sendo incrivelmente útil, pois permite &#8220;combinar&#8221; diversos comandos que originalmente não teriam nenhuma relação entre si, de forma<span style="font-family: Bitstream Vera Sans,sans-serif;"> que eles façam alguma coisa específica. Um exemplo simples é o &#8220;modprobe -l | more&#8221;, que vimos no tópico sobre o kernel, onde o pipe é usado para que a enorme lista gerada pelo comando &#8220;modprobe -l&#8221; seja enviada ao &#8220;more&#8221;, que se encarrega de criar as quebras de página.</span></p>
<p><strong>grep</strong>: O grep permite filtrar a saída de um determinado comando, de forma que ao invés de um monte de linhas, você veja apenas a informação que está procurando. Ele é frequentemente usado em conjunto com o pipe, sobretudo em scripts.</p>
<p>Um exemplo simples: sua placa de rede não está funcionando e você quer saber se o módulo de kernel &#8220;sis900&#8243;, que dá suporte a ela, está carregado. Você pode ver os módulos que estão carregados usando o comando &#8220;lsmod&#8221;, mas a lista é um pouco longa. Você poderia completar o lsmod com o &#8220;| grep sis900&#8243;, que vai filtrar usando o grep, mostrando na tela apenas as linhas contendo &#8220;sis900&#8243;. O comando ficaria então &#8220;lsmod | grep sis900&#8243;.</p>
<p>Se não aparecer nada na tela, você sabe de antemão que o módulo não está ativo. Neste caso, você poderia tentar carregá-lo manualmente usando o comando &#8220;modprobe sis900&#8243;, como root.</p>
<p>Em um script, o mesmo comando poderia ser usado para detectar se o módulo está carregado ou não e, a partir daí, mostrar uma mensagem na tela, ou carregá-lo automaticamente.</p>
<p>Ao longo do livro, veremos mais alguns exemplos de uso do shell-script, esta foi apenas uma introdução rápida destinada a apresentar alguns dos conceitos básicos. Uma característica importante do shell-script é que assim que você toma coragem e começa a escrever alguns scripts básicos, você acaba se empolgando e passa a, gradualmente, incorporar novos truques, aprendendo uma coisa aqui e outra ali, mesmo sem estudar especificamente sobre o assunto.<br />
Fonte: http://www.gdhpress.com.br</p>
<div class="shr-publisher-457"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/11/23/uma-introducao-ao-shell-script/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial básico/intermediário sobre programação  Shell</title>
		<link>http://blog.deserv.info/2010/09/22/tutorial-basicointermediario-sobre-programacao-shell/</link>
		<comments>http://blog.deserv.info/2010/09/22/tutorial-basicointermediario-sobre-programacao-shell/#comments</comments>
		<pubDate>Thu, 23 Sep 2010 01:32:36 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Shell Scripts]]></category>
		<category><![CDATA[Tutorial Basico]]></category>
		<category><![CDATA[Tutorial Intermediario]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=430</guid>
		<description><![CDATA[1) Introdução Muitos administradores de sistemas GNU/Linux irão, algum dia, se deparar com a situação de precisar automatizar uma tarefa – um backup, por exemplo. Nesta hora, surge a necessidade de se dominar bem a execução sequenciada de comandos. E mais! Encontrar um modo de colocar esta sequência de comandos em algum lugar para sua [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.deserv.info%252F2010%252F09%252F22%252Ftutorial-basicointermediario-sobre-programacao-shell%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2Fbr2U8u%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Tutorial%20b%C3%A1sico%2Fintermedi%C3%A1rio%20sobre%20programa%C3%A7%C3%A3o%20%20Shell%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>1) Introdução</p>
<p><span style="color: #000000;"><span style="font-size: x-small;"><span><br />
Muitos  administradores de sistemas GNU/Linux irão, algum dia, se deparar com a  situação de precisar automatizar uma tarefa – um backup, por exemplo.  Nesta hora, surge a necessidade de se dominar bem a execução sequenciada  de comandos. E mais! Encontrar um modo de colocar esta sequência de  comandos em algum lugar para sua execução. É neste momento que entra o  domínio, por parte do administrador, da criação de scripts! <span id="more-430"></span></p>
<p>Quando  se fala de/sobre Shell Script, temos que ter em mente que, ao que for  se aventurar nesta área, deve ter o domínio de comandos de Shell. Bem  como, entender como funciona uma Shell. O usuário (administrdor) deve  conhecer redirecionamentos e pipes (dutos). Conhecer comandos e suas  opções e, principalmente, sua sintaxe correta.</p>
<p>O aprendiz deve  conhecer, também, o processo de inicialização do sistema GNU/Linux e o  funcionamento dos arquivos de configuração de muitos serviços e módulos  do sistema. É bom que também tenha conhecimento de rede (endereçamento  IP, MAC Address, etc) e do funcionamento dos serviços de rede  (conceitos), tais como: DHCP, DNS, etc&#8230;</p>
<p>SHELL SCRIPT</p>
<p>Shell  Script é uma sequência de comandos que serão interpretados pela SHELL  sequencialmente, dentro de um arquivo (txt &#8211; ascii) que foi previamente  pré-programado (editado).</p>
<p>Um script contém uma sequência de  comandos que seriam executados na Shell interativa, permitindo que  tarefas longas (e/ou repetitivas), ou que exijam cuidados, sejam  executados de forma rápida e invariável.</p>
<p>A Shell do GNU/Linux permite (implementa) uma linguagem própria de programação.</p>
<p>- Sequência de comandos que serão interpretados pela SHELL sequencialmente, dentro de um arquivo pré-programado</p>
<p>-  Um script contém uma sequência de comandos que seriam executados na  shell interativa, permitindo que tarefas longas (e/ou repetitivas), ou  que exijam cuidados, sejam executados de forma rápida e invariável</p>
<p>- Todo SHELL SCRIPT deve ter sua permissão de execução habilitada</p>
<p>- Necessidade de cuidados com comandos de usuários em processos de root</p>
<p>O que é SHELL?</p>
<p>Shell  pode ser entendido como um programa (ou uma interface) em modo texto  que interage com o usuário, permitindo este, passar comandos ao sistema  operacional. Para quem usava DOS, como eu (que Deus o tenha! <img src='http://blog.deserv.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> ), deve  se lembar que a Shell que interagia com o usuário era o command.com.</p>
<p>No  GNU/Linux, existe não somente uma, mas algumas Shells que o usuário  poderá utilizar! A Shell padrão utilizada na maioria das distribuições é  a BASH (Bourne Again Shell). Esta deriva da SH (Bourne Shell). Dentre  outras Shells disponíveis para GNU/Linux, destacam-se: CSH (C Shell);  TCSH (Tenex/Tops C Shell); KSH (Korn Shell) muito comum no Unix.</p>
<p>*  Sempre que um Shell Script for necessário, deve-se, primeiro, criar um  arquivo texto padrão ascii. Isto pode ser providenciado com o editor VI –  você sabe usá-lo, não sabe!?</p>
<p>* Um Shell Script, por convensão,  recebe um nome – este pode ser de sua preferência – e um sufixo ( o  “.sh”), este, por causa da Shell. Um arquivo de script se chamaria, por  exemplo, de script1.sh. Muitos administradores adotam um nome que  indicam a funcionalidade do script. Por exemplo: backup.sh,  alerta_intruso.sh, renomeia.sh, firewall.sh, etc. Não invente muito!</p>
<p>*  A localização do script é outro fator que deve ser levado em conta. Por  definição do padrão LSB (Linux Standard Base – Base de Padronização  Linux), o diretório que contém arquivos de configuração e scripts é o  /etc. Entretanto, scripts que têm função de comando (como o ldd, por  exemplo), ficam no /usr/bin/ (aposto que muitos não sabiam disto!). A  localização de seu script dependerá de sua funcionalidade – eu costumo  colocar meus scripts no /etc/rc.d/ (quando uso Mandriva – ou  semelhante), ou então, no /etc/init.d/ (quando uso Debian – ou  semelhante). Seja coerente e, por favor, não fuja do padrão!</p>
<p>* Ao  se criar um arquivo no GNU/Linux (seja na Shell com o comando touch, ou  diretamente no editor vi), o arquivo terá as permissões 644 (ou 664) –  permissão de leitura e sem o bit (permissão) de execução habilitado.  Neste caso, você terá que, toda vez que criar o seu script,  alterar(habilitar) a permissão de execução nele.</p>
<p>* Ao se colocar o  script dentro do diretório /etc (ou abaixo deste), o caminho (PATH) não  aponta para este diretório. Ou seja, se seu script for colocado neste  diretório, terá que ser executado por alguém, ou chamado à partir de  algum lugar: outro script, cron, rc.local (se sua distro tiver!), etc.  Esteja ciente disto!* Um Shell Script é interpretado (executado)  sequencialmente. Ou seja, um comando é executado dentro do script e, o  próximo comando só é executado, quando do término do anteriror.</p>
<p></span></span></span></p>
<p><span style="color: #000000;"><span style="font-size: x-small;"> </span></span></p>
<p><span style="color: #000000;"><span style="font-size: x-small;"><span>2) Estrutura de um SHELL SCRIPT</p>
<p>#!/bin/bash    <strong>&lt;|=&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|</strong> <strong>Programa Interpretador (shell)</strong><br />
#<br />
#<br />
# Criado por Katan  <strong>&lt;|=&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;|</strong> <strong>Comentários iniciais</strong><br />
#<br />
##############</p>
<p>VAR=valor </span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span><strong>&lt;|=&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-|</strong></span></span></span><br />
<span style="color: #000000;"><span style="font-size: x-small;"><span>VAR2=valor2 </span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span><strong>&lt;|=&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-|</strong></span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span> <strong>Declaração de Variáveis</strong><br />
VAR3=`resultado_comando` </span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span><strong>&lt;|=&#8212;&#8212;-|</strong></span></span></span><br />
<span style="color: #000000;"><span style="font-size: x-small;"><span><br />
comando1 </span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span><strong>&lt;|=&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|</strong></span></span></span><br />
<span style="color: #000000;"><span style="font-size: x-small;"><span>comando2 </span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span><strong>&lt;|=&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-|</strong></span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span> <strong>Comandos do SHELL<br />
</strong>comandoN </span></span></span><span style="color: #000000;"><span style="font-size: x-small;"><span><strong>&lt;|=&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-|</strong></span></span></span></p>
<table border="0" cellspacing="0" cellpadding="4" width="100%">
<tbody>
<tr>
<td width="36%" height="14" valign="top"><span style="color: #000000;"><span style="font-size: x-small;"><span><br />
</span></span></span></td>
<td width="4%"></td>
<td width="59%" valign="top"></td>
</tr>
<tr>
<td width="36%" valign="top"></td>
</tr>
</tbody>
</table>
<p><span style="color: #000000;"><span style="font-size: x-small;">A primeira linha de um Shel Script deve conter, obrigatoriamente, o interpretador do script(!?). Viajou? Calma! Não se assuste!</span></span></p>
<p><span style="color: #000000;"><span style="font-size: x-small;"> A linguagem de Shell Script é interpretada. Diferentemente de um programa feito em C, Delphi, por exemplo, que necessita de ser compilado para ser executado, o Shell Script não tem esta necessidade. Entretanto, algum programa deverá interpretar o script e passá-lo ao kernel pra ser executado. Por se tratar de execução de comandos da Shell, na maioria das vezes, quem deverá interpretá-los é a própria Shell. A sintaxe para a definição deve ser o #! (hash e exclamação) seguido do interpretador (caminho completo), no caso da Shell, <em><strong>/bin/bash</strong></em>. Alguns scripts podem ser feitos em perl, por exemplo. Neste caso, o interpretdor seria <strong>#!/usr/bin/perl</strong>.</span></span></p>
<p><span style="color: #000000;"><span style="font-size: x-small;"> À partir da segunda linha, o script se inicia verdadeiramente. Mas, como de praxe em programação Shell, a sequência à seguir após o interpretador, é comum a adição da autoria do script (quem o fez), bem como sua versão, data de criação, etc.</span></span></p>
<p><span style="color: #000000;"><span style="font-size: x-small;"> Detalhe: Toda linha que começa com um “#” (hash) é tida como comentário (em script Shell). Ou seja, o interpretador <strong>/bin/bash</strong> irá ignorar sua existência – o hash (e o script) podem conviver com isto! <img src='http://blog.deserv.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </span></span></p>
<p><span style="color: #000000;"><span style="font-size: x-small;"> Após feitas as apresentações inciais no começo do script, é comum à partir deste ponto, a declaração (definição) de variáveis.</span></span></p>
<p><span><br />
</span></p>
<table border="0" cellspacing="0" cellpadding="4" width="100%">
<col width="256"></col>
<tbody>
<tr>
<td width="100%" valign="top"><span><span style="font-size: x-small;"><span style="text-decoration: underline;"><strong>Variável</strong></span>: 			<span style="color: #6633ff;"><em>Caractere, ou conjunto de caracteres que, agrupados, são 			utilizados para conter um valor correspondente. Este valor pode 			ser um número, letra, resultado de comando, etc</em></span></span></span></td>
</tr>
</tbody>
</table>
<p><span><br />
</span></p>
<p><span style="color: #000000;"><span style="font-size: x-small;"> O uso de variáveis em script, facilita a progração, pois, pode conter (guardar) um valor que poderá ser utilizado quantas vezes for ncessário em todo o script. </span></span></p>
<p><span style="color: #000000;"><span style="font-size: x-small;"> Imagine a situação de um script de firewall onde, o IP de sua conexão de internet terá que ser utilizado dezenas de vezes. Quando este valor de IP for alterado, terá que modificado em todo o script! Quando utilizamos variáveis, basta alterar no valor da variável declarado no início so script, que o novo valor será aproveitado em todo script!</span></span></p>
<p><strong> </strong><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
#script 1<br />
echo “Olá. Este é meu primeiro script!”<br />
date<br />
uname -a<br />
echo<br />
echo “Veja o calendário de Dezembro de 2012”<br />
echo<br />
cal 12 2012</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script1.sh">AQUI</a></strong><strong><br />
</strong></p>
<p>Executando o script<br />
<strong>[user@localhost ~] $ bash script1.sh</strong></p>
<p>OU</p>
<p><strong>[user@localhost ~] $ chmod +x script1.sh<br />
[user@localhost ~] $ ./script1.sh</strong></p>
<p><strong>#!/bin/bash<br />
# Script 2<br />
# Concatenação de comandos<br />
clear<br />
echo -n &#8220;O IP da placa de rede é:&#8221; ; /sbin/ifconfig eth0 | grep &#8220;inet end&#8221; | cut -d&#8221;:&#8221; -f2 | cut -d&#8221; &#8221; -f2<br />
echo<br />
echo -n &#8220;Hoje é: &#8221; ; date +%A<br />
uname -a</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script2.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
# Script 3<br />
# Trabalhando com variáveis<br />
clear<br />
# Definição das variáveis<br />
A=1<br />
B=&#8221;O valor de A é: $A&#8221;<br />
echo $B</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script3.sh">AQUI</a></strong><strong><br />
</strong></p>
<p>Variáveis de Ambiente</p>
<p>HOME                   Diretório home do usuário<br />
SHELL                  Shell do usuário<br />
TERM                    Tipo de terminal que o usuário está usando<br />
PATH                    Caminhos (diretórios) de pesquisa de comandos<br />
USER                   Nome de login do usuário<br />
LOGNAME            Nome de login do usuário – mesmo que USER<br />
HISTSIZE             Tamanho do histórico de comandos<br />
BASH                   Caminho da shell que está usando<br />
BASH_VERSION   Versão da SHELL<br />
OSTYPE                Tipo de sistema operacional<br />
LANG                   Codificação de caracteres – idioma<br />
HOSTNAME          Nome de host da máquina</p>
<p>Trabalhando com variáveis</p>
<p>set<br />
Retorna todas as variáveis locais</p>
<p>env<br />
Retorna todas as variáveis globais</p>
<p>Definindo uma variável:<br />
LINUX=semvirus<br />
export LINUX<br />
echo $LINUX</p>
<p>Zerando uma variável:<br />
unset LINUX</p>
<p><strong>[user@localhost ~]$ LINUX=semviruses<br />
[user@localhost ~]$ echo $LINUX<br />
semviruses<br />
[user@localhost ~]$ set | grep LINUX<br />
LINUX=semviruses<br />
[user@localhost ~]$ env | grep LINUX<br />
[user@localhost ~]$ export LINUX<br />
[user@localhost ~]$ env | grep LINUX<br />
LINUX=semviruses<br />
[user@localhost ~]$ unset LINUX<br />
[user@localhost ~]$ env | grep LINUX<br />
[user@localhost ~]$ </strong></p>
<p>Trabalhando com variáveis</p>
<p>VAR=”valor”<br />
valor poderá assumir qualquer valor, inclusive outras variáveis<br />
$, \ e `(crase) são interpretados com especiais &#8211; “\” anula “$”</p>
<p>VAR=&#8217;valor&#8217;<br />
valor irá assumir exatamente valor. Apostrofo anula valor de variáveis<br />
Nenhum caracter especial tem valor</p>
<p>VAR=`valor`   ou    VAR=$(valor)<br />
valor será resultado de comando</p>
<p>Trabalhando com variáveis</p>
<p>VAR1=”valor1”<br />
VAR2=”valor2 $VAR1”<br />
VAR1 recebe valor1 e VAR2 recebe valor2 mais o resultado de VAR1</p>
<p>[user@localhost ~]$ VAR1=”valor1”<br />
[user@localhost ~]$ VAR2=”valor2 e $VAR1”<br />
[user@localhost ~]$ echo $VAR2<br />
valor2 e valor1</p>
<p>##=-.__________<br />
VAR1=”valor1”<br />
VAR2=”valor2 &#8216;$VAR1&#8242; ”<br />
VAR1 recebe valor1 e VAR2 recebe valor2 mais o resultado de VAR1. Aspas anula efeito de apostrofo</p>
<p>[user@localhost ~]$ VAR1=”valor1”<br />
[user@localhost ~]$ VAR2=”valor2 e &#8216;$VAR1&#8242; ”<br />
[user@localhost ~]$ echo $VAR2<br />
valor2 e &#8216;valor1&#8242;</p>
<p>##=-.__________<br />
VAR1=”valor1”<br />
VAR2=”valor2 \$VAR1 ”<br />
VAR1 recebe valor1 e VAR2 recebe valor2 mais $VAR1 (literal). Contra-barra anula efeito do $ (dólar)</p>
<p>[user@localhost ~]$ VAR1=”valor1”<br />
[user@localhost ~]$ VAR2=”valor2 e \$VAR1”<br />
[user@localhost ~]$ echo $VAR2<br />
valor2 e $VAR1</p>
<p>##=-.__________<br />
VAR1=”valor1”<br />
VAR2=”valor2 $VAR1 e hoje é `date +%A`”<br />
VAR1 recebe valor1. VAR2 recebe valor2 mais resultado de $VAR1 e mais o resultado do comando date +%A.</p>
<p>[user@localhost ~]$ VAR1=”valor1”<br />
[user@localhost ~]$ VAR2=”valor2 $VAR1 e hoje é `date +%A`”<br />
[user@localhost ~]$ echo $VAR2<br />
valor2  valor1 e hoje é NNN</p>
<p>##=-.__________<br />
Trabalhando com variáveis</p>
<p>VAR1=&#8217;valor1&#8242;<br />
VAR2=&#8217;valor2 $VAR1&#8242;<br />
VAR1 recebe valor1 e VAR2 recebe valor2 mais $VAR1. Apostrofo anula efeito do $ (dólar).</p>
<p>[user@localhost ~]$ VAR1=&#8217;valor1&#8242;<br />
[user@localhost ~]$ VAR2=&#8217;valor2 e $VAR1&#8242;<br />
[user@localhost ~]$ echo $VAR2<br />
valor2 e $VAR1</p>
<p>##=-.__________<br />
VAR1=&#8217;valor1&#8242;<br />
VAR2=&#8217;valor2 “$VAR1” &#8216;<br />
VAR1 recebe valor1 e VAR2 recebe valor2 mais $VAR1. Apostrofo anula efeito da aspas e do $ (dólar).</p>
<p>[user@localhost ~]$ VAR1=&#8217;valor1&#8242;<br />
[user@localhost ~]$ VAR2=&#8217;valor2 e “$VAR1” &#8216;<br />
[user@localhost ~]$ echo $VAR2<br />
valor2 e “$VAR1”</p>
<p>##=-.__________<br />
VAR1=&#8217;valor1&#8242;<br />
VAR2=&#8217;valor2 &#8216;$VAR1&#8242; &#8216;<br />
VAR1 recebe valor1 e VAR2 recebe valor2 mais resultado de $VAR1. Apostrofo proteje efeito $ (dólar) – da variável.</p>
<p>[user@localhost ~]$ VAR1=&#8217;valor1&#8242;<br />
[user@localhost ~]$ VAR2=&#8217;valor2 e &#8216;$VAR1&#8242; &#8216;<br />
[user@localhost ~]$ echo $VAR2<br />
valor2 e valor1</p>
<p>##=-.__________<br />
VAR1=&#8217;valor1&#8242;<br />
VAR2=&#8217;valor2 \$VAR1&#8242;<br />
VAR1 recebe valor1 e VAR2 recebe valor2 mais $VAR1. Apostrofo anula efeito da \ (contra-barra).</p>
<p>[user@localhost ~]$ VAR1=&#8217;valor1&#8242;<br />
[user@localhost ~]$ VAR2=&#8217;valor2 e \$VAR1 &#8216;<br />
[user@localhost ~]$ echo $VAR2<br />
valor2 e \$VAR1</p>
<p>##=-.__________<br />
VAR1=&#8217;valor1&#8242;<br />
VAR2=&#8217;valor2 $VAR1 e hoje é `date +%A`&#8217;<br />
VAR1 recebe valor1 e VAR2 recebe valor2 mais $VAR1. Apostrofo anula efeito da \ (contra-barra).</p>
<p>[user@localhost ~]$ VAR1=&#8217;valor1&#8242;<br />
[user@localhost ~]$ VAR2=&#8217;valor2 $VAR1 e hoje é `date _%A` &#8216;<br />
[user@localhost ~]$ echo $VAR2<br />
valor2 $VAR1 e hoje é `date +%A`</p>
<p>##=-.__________<br />
VAR1=&#8217;valor1&#8242;<br />
VAR2=&#8217;valor2 $VAR1 e hoje é &#8216; `date +%A` &#8216; &#8216;<br />
VAR1  recebe valor1. VAR2 recebe valor2 mais $VAR1 (literal) e “e hoje é”  mais o resultado do comando date. Segundo uso do apostrofo protege a  execução do comando</p>
<p>[user@localhost ~]$ VAR1=&#8217;valor1&#8242;<br />
[user@localhost ~]$ VAR2=&#8217;valor2 $VAR1 e hoje é `date +%A` &#8216;<br />
[user@localhost ~]$ echo $VAR2<br />
valor2 $VAR1 e hoje é NNN</p>
<p>##=-.__________<br />
VAR=`valor`   ou    VAR=$(valor)<br />
valor será resultado de comando</p>
<p>[user@localhost ~]$ VAR1=`ifconfig  eth0 | grep &#8220;inet end&#8221; | cut -d&#8221;:&#8221; -f2 | cut -d&#8221; &#8221; -f2`<br />
[user@localhost ~]$ echo $VAR1<br />
192.168.0.2</p>
<p>[user@localhost ~]$ VAR1=$(ifconfig  eth0 | grep &#8220;inet end&#8221; | cut -d&#8221;:&#8221; -f2 | cut -d&#8221; &#8221; -f2)</p>
<p>##=-.__________</p>
<p><strong>#!/bin/bash<br />
# Script 4<br />
# Trabalhando com variáveis de ambiente<br />
clear</p>
<p>echo &#8220;Você pode visualizar os últimos $HISTSIZE comandos digitados&#8221; </strong></p>
<p><strong>echo &#8220;Seu diretório HOME é: $HOME&#8221;<br />
</strong></p>
<p><strong>echo &#8220;O tipo de terminal que está usando é: $TERM&#8221; </strong></p>
<p><strong>echo &#8220;E a SHELL de trabalho é: $SHELL&#8221;</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script4.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
# Script 5<br />
# Trabalhando com variáveis definidas pelo usuários<br />
clear</p>
<p># Definição das variáveis<br />
IP_ETH0=`/sbin/ifconfig eth0 | grep &#8220;inet end&#8221; | cut -d&#8221;:&#8221; -f2 | cut -d&#8221; &#8221; -f2</strong><strong> </strong><strong>`<br />
UID_ALUNO=$(grep aluno /etc/passwd | cut -d&#8221;:&#8221; -f3)</p>
<p># Exibição dos valores das variáveis<br />
echo &#8220;O IP da placa ETH0 é: $IP_ETH0&#8243;<br />
echo<br />
echo &#8220;O usuário ALUNO tem UID = $UID_ALUNO&#8221;</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script5.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
# Script 6<br />
# Executando comandos dentro do echo<br />
clear<br />
echo &#8220;hoje é: `date`&#8221;<br />
echo  &#8220;O usuário `who | cut -d&#8221; &#8221; -f1 | sort -u` está logado agora&#8221;</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script6.sh">AQUI</a></strong><strong><br />
</strong></p>
<p>Variáveis de SHELL (pré-definidas)</p>
<p>$$        PID do shell em execução</p>
<p>$?        Código de retorno do último comando<br />
0 = verdadeiro – executado com sucesso<br />
1 = falso – executado com falha<br />
2 = permissão negada / diretório inexistente<br />
126 = Comando não executável (sem permissão)<br />
127 = comando inexistente (NOT_FOUND)<br />
128 = O parâmetro para o &#8216;exit&#8217; não é um decimal<br />
128+n = 128 + código do sinal que o matou.<br />
130 = O programa interrompido com o Ctrl+C (128 + 2)<br />
255 = Parâmetro para o &#8216;exit&#8217; não está entre 0 e 255</p>
<p>$!                Código de retorno do último comando executado em segundo plano<br />
$0               Nome do arquivo contendo o shell script em execução<br />
$1, $2, &#8230;    Cada parâmetro passado ao script na linha de comando<br />
$#              Número parâmetros passados ao script na linha de comando<br />
“$*”           Mesmo que “$1 $2 $3 &#8230;”</p>
<p>“$@”          Mesmo que “$1” “$2” “$3” &#8230;</p>
<p><strong>#!/bin/bash<br />
# Script 7<br />
# Trabalhando com variáveis de SHEL<br />
clear</p>
<p>echo “O comando executado para o script foi: $0”</p>
<p>date<br />
</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script7.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
# Script 8<br />
# Trabalhando com variáveis de SHEL<br />
#<br />
echo “O nome do script é $0”<br />
echo “Foram recebidos $# argumentos”<br />
echo “Argumento 1: $1”<br />
echo “Argumento 2: $2”<br />
echo “Argumento 3: $3” </strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script8.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong></p>
<p></strong>Execute:</p>
<p><strong>[root@localhost ~]# ./script8.sh linux free opensource</strong></p>
<p><strong>#!/bin/bash<br />
# Script 9<br />
# Rotacionando variável<br />
#<br />
echo “$1” “$2”<br />
# Rotacionando<br />
shift<br />
echo “$1” “$2”<br />
# Rotacionando<br />
shift<br />
echo “$1” “$2” </strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script9.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong><br />
</strong></p>
<p>Execute:</p>
<p><strong>[root@localhost ~]# ./script9.sh linux free opensource noviruses<br />
linux  free<br />
free  opensource<br />
opensource  no</strong><strong>viruses </strong></p>
<p><strong>#!/bin/bash<br />
# Script 10<br />
# Interagindo com o usuário<br />
#<br />
echo -n “Por favor, digite seu nome: “<br />
read NOME<br />
echo<br />
echo “Seu nome é: $NOME”<br />
date<br />
#FIM</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script10.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
# Script 11<br />
# Interagindo com o usuário – calculando tamanho da variável<br />
#<br />
echo -n “Por favor, digite seu nome: “<br />
read NOME<br />
echo<br />
echo “Seu nome é: $NOME”<br />
echo “Seu nome possui `expr length $NOME` letras”<br />
#FIM</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script11.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
# Script 12<br />
# Interagindo com o usuário – condicionando digitação<br />
#<br />
echo -n “Por favor, digite seu nome: “<br />
read NOME<br />
echo<br />
echo -n “Digite sua senha: “<br />
read -s SENHA<br />
echo<br />
echo -n “Digite uma letra: “<br />
read -n 1 KEY<br />
clear<br />
echo “Seu nome é: $NOME”<br />
echo “Sua senha é: $SENHA”<br />
echo “A letra digitada foi: $KEY” </strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script12.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
# Script 13<br />
# Interagindo com o usuário – condicinando digitação<br />
#<br />
clear<br />
echo -ne “Digite uma letra: [S] ou [N]: [ ]“ &#8216;\033[3D'<br />
read -n 1 KEY<br />
echo<br />
clear<br />
echo  “A letra digitada é: $KEY” </strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script13.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong><br />
</strong></p>
<p>Opções do echo:<br />
-n        Não pula linha<br />
-e        Interpreta após o “ (aspas)</p>
<p>Caracteres de “escape”: \033[XN<br />
Onde:</p>
<p>\033[    Código hexadecimal para ESC<br />
X          Código hexadecimal de cores e/ou casas de movimentação<br />
N          Código de movimento (uma letra) ou m para cores</p>
<p>N para movimentação:<br />
xA       x linhas para cima, na mesma coluna<br />
xB       x linhas para baixo, na mesma coluna<br />
xC       x colunas para direita, na mesma linha<br />
xD       x colunas esquerda, na mesma linha<br />
xE       x linhas para baixo, na mesma coluna<br />
xF        x linhas para cima, na mesma coluna<br />
xG       para a coluna x da coluna atual<br />
x;yH    para a coluna y da linha x</p>
<p>X para cores:<br />
Cor             Letra     Fundo       ##         Atributo     Valor     ##     Exemplos: ESC [ &lt;N&gt;;&lt;N&gt; m<br />
preto          30         40             ##         reset          0         ESC[0m texto normal (desliga cores)<br />
vermelho   31         41             ##         negrito        1         ESC[1m negrito<br />
verde         32         42             ##         sublinhado  4         ESC[33;1m amarelo<br />
amarelo     33         43             ##         piscando     5         ESC[44;37m fundo azul, letra cinza<br />
azul            34         44             ##        reverso        7         ESC[31;5m vermelho piscando<br />
rosa           35         45<br />
ciano         36         46<br />
branco       37         47</p>
<p>Na linha de comando:</p>
<p>[root@localhost ~]# echo -e &#8216;\033[33;1m amarelo \033[0m'<br />
[root@localhost ~]# echo -e &#8216;\033[42;31;1m Seja livre. Use Linux \033[0m'<br />
[root@localhost ~]# echo -e &#8216;\033[42;31;5m Seja livre. Use Linux \033[0m'</p>
<p><strong>#!/bin/bash<br />
# Script 14<br />
# Interagindo com o usuário – formatando  exibição<br />
#<br />
clear<br />
echo -ne “\033[42;31;1m Digite uma letra: [S] ou [N]: [ ]“&#8217;\033[2D''\033[0m'<br />
read -n 1 KEY<br />
echo<br />
clear<br />
echo  “A letra digitada é: $KEY”</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script14.sh">AQUI</a></strong><strong><br />
</strong></p>
<p>Expansão de variáveis</p>
<p>${var:-texto}     Se var não está definida, retorna 'texto'<br />
${var:=texto}   Se var não está definida, defina-a com 'texto'<br />
${var:?texto}    Se var não está definida, retorna o erro 'texto'<br />
${var:+texto}   Se var está definida, retorna 'texto', senão retorna o vazio</p>
<p><strong>#!/bin/bash<br />
# Script 15<br />
# Expandindo variáveis<br />
#<br />
clear<br />
VAR1=Linux<br />
echo “$VAR1 ${VAR1:-free}”<br />
echo “$VAR1 ${VAR2:-free}”<br />
echo “A variável \$VAR1  é: $VAR1”<br />
echo “A variável \$VAR2  é: $VAR2”</p>
<p>VAR2=”Open Source”<br />
echo “$VAR1 ${VAR2:-free}”<br />
echo “A variável \$VAR1  é: $VAR1”<br />
echo “A variável \$VAR2  é: $VAR2” </strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script15.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong><br />
</strong></p>
<p>Resultado do script 15</p>
<p><strong>[root@localhost ~]# ./script15.sh<br />
Linux Linux<br />
Linux free<br />
A variável $VAR1  é: Linux<br />
A variável $VAR2  é:<br />
Linux Open Source<br />
A variável $VAR1  é: Linux<br />
A variável $VAR2  é: Open Source</strong></p>
<p><strong>#!/bin/bash<br />
# Script 16<br />
# Expandindo variáveis<br />
#<br />
clear<br />
VAR1=<br />
VAR2=Linux<br />
echo “A variável \$VAR1  é: $VAR1”<br />
echo “A variável \$VAR2  é: $VAR2”<br />
echo “$VAR1 ${VAR2:?free}”<br />
echo “$VAR1 ${VAR1:?erro}”</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script16.sh">AQUI</a></strong><strong><br />
</strong></p>
<p>Resultado do script 16</p>
<p><strong>[root@localhost ~]# ./script16.sh<br />
A variável $VAR1  é:<br />
A variável $VAR2  é: Linux<br />
Linux<br />
./script16.sh: line XX:  VAR1: erro</strong></p>
<p>Trabalhando com variáveis – reduzindo variáveis</p>
<p><strong>[user@hostname ~]$ VAR=”valor-nome”<br />
[user@hostname ~]$ echo ${VAR%-nome}<br />
valor</strong><br />
Exibe até %. Exclui à partir de %</p>
<p><strong>[user@hostname ~]$ VAR=”http://marcio.katan.googlepages.com”<br />
[user@hostname ~]$ echo ${VAR#http://}<br />
marcio.katan.googlepages.com</strong><br />
Retira da variável a parte passada por #</p>
<p><strong>#!/bin/bash<br />
# Script 17<br />
# Reduzindo variáveis<br />
#<br />
clear<br />
echo -n “Digite seu email: “<br />
read EMAIL<br />
echo<br />
echo “O nome de usuário do email é: ${EMAIL%@*}”<br />
echo “O domínio do email é: ${EMAIL#*@}”<br />
VAR=”valor-nome”<br />
echo “Retirando o &#8216;-nome&#8217; de valor-nome: ${VAR%-nome}”<br />
echo “Retirando o &#8216;valor&#8217; de valor-nome: ${VAR#valor-}”</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script17.sh">AQUI</a></strong><strong><br />
</strong></p>
<p>Blocos de agrupamento</p>
<p>{…}             Agrupa comandos em um bloco                             { ls ; clear ; }<br />
$((&#8230;))        Retorna o resultado de uma operação aritmética          $((5+3))</p>
<p>Operadores Aritméticos</p>
<p>+               Adição<br />
-               Subtração<br />
*               Multiplicação<br />
/               Divisão<br />
**              Exponenciação</p>
<p><strong>#!/bin/bash<br />
# Script 19<br />
# Blocos de comandos / Operação aritimética</p>
<p>{ clear ; ls /tmp ; }<br />
echo<br />
sleep 5<br />
echo “Veja o somatório de 5 + 5 = $((5 + 5))”<br />
sleep 5 </strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script19.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong><br />
</strong></p>
<p>Operadores de Atribuição/Relacionais/de Bit</p>
<p>=       Atribui valor a uma variável<br />
++      Incrementa em 1 o valor da variável<br />
- -     Decrementa em 1 o valor da variável<br />
==      Igual<br />
!=      Diferente<br />
&gt;       Maior<br />
&lt;       Menor<br />
&gt;=      Maior ou igual<br />
&lt;=      Menor ou igual<br />
&amp;&amp;      E lógico (AND)<br />
||      OU lógico (OR)</p>
<p><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
#<br />
#  Script 20<br />
#<br />
# Operadores de Atribuição</p>
<p>VAR=1<br />
((VAR++))<br />
echo $VAR</p>
<p>VAR2=2<br />
((VAR2 &lt; 6))<br />
echo “O valor de VAR2 é menor que 6 &#8211; VERDADEIRO. Por isso, \$? deve ser 0: é $?”</p>
<p>((VAR2 &gt; 6))<br />
echo “O valor de VAR2 é maior que 6 &#8211; FALSO. Por isso, \$? deve ser 1: é $?”</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script20.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong>ARRAYs</strong></p>
<p>Um array consiste em uma estrutura de dados  correlacionados entre si (geralmente dentro de uma mesma variável). Um  array pode ser declarado das seguintes maneiras:</p>
<p>ARRAY=(valor1  valor2  valor3  valorN …)<br />
ou<br />
ARRAY[0]=”valor1”<br />
ARRAY[1]=”valor2”<br />
ARRAY[2]=”valor3”<br />
ARRAY[N]=”valorN”</p>
<p>Um ARRAY tem seus valores retornados da seguinte maneira:</p>
<p>${ARRAY[N]}           Retorna o valor N do array<br />
${ARRAY[@]}          Retorna todos os valores do array<br />
${#ARRAY[@]}       Retorna a quantidade de valores do array<br />
${ARRAY[@]:2}       Retorna os valores do array à partir da posição 2 (3° valor)<br />
${ARRAY[@]:1:2}    Retorna os valores do array da posição 1 até 2 (2° e 3° valores)</p>
<p>Veja um exemplo de script utilizando array:</p>
<p><strong>#!/bin/bash<br />
#<br />
#  Script 21<br />
#<br />
# Trabalhando com ARRAYs<br />
clear</p>
<p>NOTA[0]=”5”<br />
NOTA[1]=”6”<br />
NOTA[2]=”7”<br />
NOTA[3]=”8”</p>
<p>echo “As notas foram: ${NOTA[@]}<br />
1 bimestre: ${NOTA[0]}<br />
2 bimestre: ${NOTA[1]}<br />
3 bimestre: ${NOTA[2]}<br />
4 bimestre: ${NOTA[3]}”</p>
<p>SOMA_NOTAS=”$((${NOTA[0]} + ${NOTA[1]} + ${NOTA[2]} + ${NOTA[3]}))”<br />
echo “As notas somaram: $SOMA_NOTAS”<br />
echo “A média do aluno foi: $((${SOMA_NOTAS} / 4))”<br />
echo “A média do aluno foi: `expr ${SOMA_NOTAS} / 4`”   &lt;|=-##*Cuidado com a crase!<br />
echo</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script21.sh">AQUI</a></strong><strong><br />
</strong></p>
<p>Trabalhando com Arrays com interação com o usuário:</p>
<p><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
###<br />
#<br />
# Script 22<br />
# Teste com ARRAYs<br />
clear</p>
<p>echo -n &#8220;Digite as 4 notas do aluno separadas por espaços: &#8221;<br />
read NOTAS</p>
<p>MEDIA=($NOTAS)</p>
<p>echo &#8220;As notas foram: ${MEDIA[@]}<br />
1 bimestre: ${MEDIA[0]}<br />
2 bimestre: ${MEDIA[1]}<br />
3 bimestre: ${MEDIA[2]}<br />
4 bimestre: ${MEDIA[3]}&#8221;<br />
echo<br />
SOMA_NOTAS=&#8221;$((${MEDIA[0]} + ${MEDIA[1]} + ${MEDIA[2]} + ${MEDIA[3]}))&#8221;<br />
echo &#8220;As notas somaram: $SOMA_NOTAS&#8221;</p>
<p>echo -n &#8220;Calculando a média aluno: $((${SOMA_NOTAS} / 4))&#8221;<br />
echo</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script22.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong>Teste Condicionais em scripts:</strong></p>
<p><em>se [ condição ] ; então<br />
# se condição acima for verdadeira, executa comandos abaixo<br />
comando1<br />
comando2<br />
comandoN<br />
senão<br />
# se condição acima for falsa, executa comandos abaixo<br />
comando1<br />
coamndo2<br />
comandoN<br />
fim</em></p>
<p><em>if [ condição ] ; then<br />
# se condição acima for verdadeira, executa comandos abaixo<br />
comando1<br />
comando2<br />
comandoN<br />
else<br />
# se condição acima for falsa, executa comandos abaixo<br />
comando1<br />
coamndo2<br />
comandoN<br />
fi<br />
</em></p>
<p>Ou então, podemos realizar vários testes &#8211; ou poderemos ter várias opções para o teste:</p>
<p><em>se [ condição ] ; então<br />
# se condição acima for verdadeira, executa comandos abaixo<br />
comando1<br />
comando2<br />
comandoN<br />
ou se </em><em>[ condição ] ; então</em><br />
<em># se condição acima for verdadeira, executa comandos abaixo<br />
comando1<br />
coamndo2<br />
comandoN<br />
ou se </em><em>[ condição ] ; então</em><br />
<em># se condição acima for verdadeira, executa comandos abaixo<br />
comando1<br />
coamndo2<br />
ComandoN<br />
fim</em></p>
<p><em>if [ condição ] ; then<br />
# se condição acima for verdadeira, executa comandos abaixo<br />
comando1<br />
comando2<br />
comandoN<br />
elif </em><em>[ condição ] ; então</em><br />
<em># se condição acima for verdadeira, executa comandos abaixo<br />
comando1<br />
coamndo2<br />
ComandoN<br />
elif </em><em>[ condição ] ; então</em><br />
<em># se condição acima for verdadeira, executa comandos abaixo<br />
comando1<br />
coamndo2<br />
comandoN<br />
fi</em></p>
<p>condição – Teste em arquivo</p>
<p>-e        Se arquivo existe<br />
-x        Se arquivo é executável (tem permissão de execução)<br />
-w        Se arquivo tem permissão de escrita<br />
-r        Se arquivo tem permissão de leitura<br />
-u        Se bit SUID está ativado<br />
-g        Se bit SGID está ativado<br />
-d        Se é um diretório<br />
-f        Se é um arquivo regular<br />
-L        Se arquivo é um link simbólico<br />
-b        Se arquivo é um dispositivo de bloco<br />
-c        Se arquivo é um dispositivo de caractere<br />
-S        Se arquivo é um SOCKET<br />
-p        Se arquivo é um PIPE<br />
-k        Se Stick bit está ativado<br />
-s        O tamanho do arquivo e maior que zero ( &gt; 0)</p>
<p>Condição – Teste em arquivo</p>
<p>-nt        Se arquivo é mais recente (Newer Than)<br />
-ot        Se arquivo é mais antigo (Older Than)<br />
-ef        Se arquivo é o mesmo</p>
<p>Condição – Comparação</p>
<p>-lt        Se é menor que (Less Than)<br />
-gt        Se é maior que (Greater Than)<br />
-le        Se é menor ou igual (Less Equal)<br />
-ge        Se é maior ou igual (Greater Equal)<br />
-eq        Se é igual (Equal)<br />
-ne        Se é diferente (Not Equal)</p>
<p>condição – Teste aritiméticos (strings)</p>
<p>=        Se é igual<br />
!=        Se é diferente<br />
-n        Se não é nulo<br />
-z        Se é nulo</p>
<p>Operadores Lógicos</p>
<p>!        Não Lógico (NOT)<br />
-a        E Lógico (AND)<br />
-o        OU Lógico (OR)</p>
<p>[ condição1 ] &amp;&amp; [ condição2 ]<br />
Testa condição2 se, e somente se, condição1 for satisfeita</p>
<p>[ condição1 ]  | |   [ condição2 ]<br />
Testa condição1 . Executa teste de condição 2 se condição retorna erro</p>
<p><strong>#!/bin/bash<br />
#<br />
#  Script 23<br />
#<br />
# Estruturas Condicionais – IF ; THEN / FI<br />
clear<br />
ARQ=arquivo_teste<br />
if [ -e $HOME/$ARQ ] ; then<br />
echo “Arquivo existente!”<br />
echo “Olha ele aí!”<br />
ls -l $HOME/$ARQ<br />
else<br />
echo “Arquivo não existe. Criando-ô!”<br />
touch $HOME/$ARQ<br />
fi</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script23.sh">AQUI</a></strong><strong><br />
</strong></p>
<p>Usando o comando <em><strong>test</strong></em> :</p>
<p><strong>#!/bin/bash<br />
#<br />
#  Script 23B<br />
#<br />
# Estruturas Condicionais – IF ; THEN / FI<br />
clear<br />
ARQ=arquivo_teste<br />
if test -e $HOME/$ARQ ; then<br />
echo “Arquivo existente!”<br />
echo “Olha ele aí!”<br />
ls -l $HOME/$ARQ<br />
else<br />
echo “Arquivo não existe. Criando-ô!”<br />
touch $HOME/$ARQ<br />
fi </strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script23B.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
#<br />
#  Script 23+1<br />
#<br />
# Estruturas Condicionais – IF ; THEN / FI<br />
clear<br />
echo -ne “Digite uma letra (S) ou (N): [ ]“ &#8216;\033[3D'<br />
read -n 1 KEY<br />
echo<br />
if [ “$KEY” = “s” ] ; then<br />
echo  “A letra digitada é $KEY”<br />
elif [ “$KEY” = “n” ] ; then<br />
echo “A letra digitada é $KEY”<br />
else<br />
echo “ Voce digitou $KEY. Não foi o que pedi”<br />
fi</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script24.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
#<br />
#  Script 25<br />
#<br />
# Estruturas Condicionais – IF ; THEN / FI<br />
clear<br />
echo -ne “Digite uma letra (S) ou (N): [ ]“ &#8216;\033[3D'<br />
read -n 1 KEY<br />
echo<br />
if [ “$KEY” = “s” ] || [ “$KEY” = “S” ] ; then<br />
echo  “A letra digitada é $KEY”<br />
elif [ “$KEY” = “n” ] || [ “$KEY” = “N” ] ; then<br />
echo “A letra digitada é $KEY”<br />
else<br />
echo “ Voce digitou $KEY. Não foi o que pedi”<br />
fi</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script25.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
#<br />
#  Script 26<br />
# Estruturas Condicionais – IF ; THEN / FI<br />
clear</p>
<p>echo -ne “Digite o primeiro valor: [ ]” &#8216;\033[2D'<br />
read -n 1 NUM1 ; echo<br />
echo -ne “Digite o operador (+ ou -): [ ]” &#8216;\033[3D'<br />
read -n 1 OPER ; echo<br />
echo -ne “Digite o segundo valor: [ ]” &#8216;\033[3D'<br />
read -n 1 NUM2 ; echo</p>
<p>if [ “$OPER” = “+” ] ; then<br />
echo “O resultado da adição é: $(($NUM1 $OPER $NUM2))”<br />
fi<br />
if [ “$OPER” = “-” ] ; then<br />
echo “O resultado da subtração é: $(($NUM1 $OPER $NUM2))”<br />
fi</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script26.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
#<br />
#  Script 27<br />
# Estruturas Condicionais – IF ; THEN / FI<br />
clear</p>
<p>echo -ne “Digite o primeiro valor (entre 5 e 9): [  ]” &#8216;\033[3D'<br />
read -n 1 NUM1 ; echo</p>
<p>echo -ne “Digite o operador (+ ou -): [ ]” &#8216;\033[3D'<br />
read -n 1 OPER ; echo</p>
<p>echo -ne “Digite o segundo valor (entre 1 e 4): [ ]” &#8216;\033[3D'<br />
read -n 1 NUM2 ; echo</p>
<p>if [ “$NUM1” -ge 5 ] &amp;&amp; [ “$NUM1” -le 9 ] ; then  |&gt;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
if [ “$NUM2” -ge 1 ] &amp;&amp; [ “$NUM2” -le 4 ] ; then |&gt;&#8212;&#8212;&#8212;&#8212;&#8212;|  |</p>
<p>if [ “$OPER” = “+” ] ; then                                   |  |<br />
echo “O resultado da adição é: $(($NUM1 $OPER $NUM2))”<br />
fi                                                            |  |<br />
###<br />
if [ “$OPER” = “-” ] ; then                                   |  |<br />
echo “O resultado da subtração é: $(($NUM1 $OPER $NUM2))”<br />
fi                                                            |  |<br />
</strong></p>
<p><strong> else </strong><strong>&lt;&gt;=&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;|</strong><strong> |<br />
</strong></p>
<p><strong> echo &#8220;Você digitou um número não autorizado&#8221;                     |<br />
</strong></p>
<p><strong> exit 0                                                           |<br />
fi<br />
else   &lt;&gt;=&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;|<br />
echo &#8220;Você digitou um número não autorizado&#8221;</strong></p>
<p><strong> exit 0<br />
fi</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script27.sh">AQUI</a></strong><strong><br />
</strong></p>
<p>Usando o <em><strong>if</strong></em> para realizar execução com parâmetros passados pela linha de comando:</p>
<p><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
#<br />
#  Script 28<br />
# Estruturas Condicionais – IF ; THEN / FI<br />
#<br />
HELP=&#8221;Este programa exibe a data local<br />
Uso: ./script28.sh [opções]</p>
<p>Opções:</p>
<p>-h    Exibe o help do script<br />
-d    Exibe somente o dia da semana<br />
-D    Exibe somente o dia do mês corrente<br />
&#8221;<br />
if [ "$1" = "-h" ] ; then<br />
echo &#8220;$HELP&#8221;<br />
exit 0<br />
elif  [ "$1" = "-d" ] ; then<br />
echo &#8220;Hoje é `date +%A`&#8221;<br />
exit 0<br />
elif [ "$1" = "-D" ] ; then<br />
echo &#8220;Hoje é o dia `date +%d` do mês&#8221;<br />
exit 0 </strong></p>
<p><strong>else</strong></p>
<p><strong> echo &#8220;Opção $1 inválida. Execute $0 -h par ajuda&#8221;</strong></p>
<p><strong> exit 0<br />
fi</p>
<p>echo &#8220;Hoje é `date +%A`, `date +%d` de `date +%B`  de  `date +%Y` &#8221; </strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script28.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
#<br />
#  Script 29<br />
# Estruturas Condicionais – IF ; THEN / FI<br />
#Backup simples<br />
clear</p>
<p>if [ `date +%a` = Dom ] ; then<br />
echo &#8220;Hoje é dia de backup&#8221;<br />
tar -czf /tmp/backup.tar.gz  /etc<br />
else<br />
echo &#8220;Hoje não é dia de Backup. Vá tomar umas cervejas&#8221;<br />
fi</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script29.sh">AQUI</a></strong><strong><br />
</strong></p>
<p>Campos de Tempo do comando date</p>
<p>%H        hora (00..23);<br />
%I        hora (01..12); i maiúsculo<br />
%k        hora (0..23);<br />
%l        hora (1..12); L minúsculo<br />
%M        minuto (00..59);<br />
%p        período local AM ou PM;<br />
%r        tempo, 12-horas (hh:mm:ss[AP]M);<br />
%s        segundos  desde  1970-01-01  00:00:00  UTC  (uma  extensão não padrão)<br />
%S        segundo (00..60);<br />
%T        tempo, 24-horas (hh:mm:ss);<br />
%X        representação do tempo local (%H:%M:%S);<br />
%Z         zona  de  tempo  (por  exemplo:  EDT  (Easterm Day Time) [horário  diurno do leste, ou nada se nenhuma zona for determinada);</p>
<p>Campos de Data do comando date:</p>
<p>%a        nome do dia da semana local abreviado (Dom..Sab);<br />
%A        nome do dia da semana local completo, tamanho variável (Domingo..Sábado);<br />
%b        nome do mês local abreviado (Jan..Dez);<br />
%B        nome  do  mês  local completo, tamanho variável (Janeiro..Dezembro);<br />
%c        data e hora local (Sab Nov 04 12:02:33 EST 1989);<br />
%d        dia do mês (01..31);<br />
%D        data (mm/dd/yy);<br />
%h        o mesmo que %b;<br />
%j        dia do ano (001..366);<br />
%m        mês (01..12);<br />
%U        número da semana no ano com Domingo como o primeiro dia da  semana (00..53);<br />
%w        dia da semana (0..6) com o 0 correspondendo ao Domingo;<br />
%W        número da semana no ano com Segunda-feira como o primeiro dia da semana (00..53);<br />
%x        representação da data local;<br />
%y        últimos dois dígitos do ano (00..99);<br />
%Y         ano (1970...).</p>
<p><em>enquanto [ condição_verdadeira ] ; faça<br />
# enquanto condição acima for verdadeira, executa comandos abaixo<br />
comando1<br />
comandoN<br />
finaliza</em></p>
<p><em><br />
até_que [ condição_falsa ] ; faça<br />
# enquanto condição acima for falsa, executa comandos abaixo<br />
comando1<br />
comandoN<br />
finaliza</em></p>
<p>#########</p>
<p><em>while [ condição ] ; do<br />
# enquanto condição acima for verdadeira, executa comandos abaixo<br />
comando1<br />
comandoN<br />
done</em></p>
<p><em>until [ condição ] ; do<br />
# enquanto condição acima for falsa, executa comandos abaixo<br />
comando1<br />
comandoN<br />
done</em></p>
<p><strong>#!/bin/bash<br />
#<br />
#  Script 30<br />
# Estruturas Condicionais – while – LOOPs<br />
#<br />
clear<br />
while true; do<br />
echo &#8220;LOOP infinito!&#8221;<br />
done</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script30.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
#<br />
# Script 31<br />
# Estruturas Condicionais – while – LOOPs<br />
#<br />
clear<br />
X=1<br />
until [ "$X" -gt "10" ]; do<br />
echo &#8220;LOOP ate 10. Contando: $X &#8221;<br />
sleep 1<br />
let X=X+1<br />
done</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script31.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
#<br />
# Script 32<br />
# Estruturas Condicionais – while – LOOPs<br />
#<br />
clear<br />
CONT=1<br />
echo -ne &#8220;Quantas vezes devo executar o script? [ ]”&#8217;\033[2D'<br />
read -n 1 VAL<br />
clear<br />
echo "Voce escolheu $VAL"<br />
echo<br />
sleep 2<br />
clear<br />
while [ "$CONT” -le “$VAL" ] ; do<br />
echo &#8220;Executando pela $CONT vez!&#8221;<br />
sleep 1<br />
clear<br />
CONT=$(expr $CONT + 1)<br />
done</p>
<p>echo &#8220;TCHAU!!!&#8221;<br />
sleep 2<br />
clear</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script32.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
#<br />
# Script 33<br />
# Estruturas Condicionais – while – LOOPs<br />
#<br />
clear</p>
<p>while true ; do &lt;|=&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;|<br />
echo -ne &#8220;Deseja sair do script? [S] [N]: [ ]&#8220;&#8216;\033[2D'        |<br />
read -n 1 KEY                                                  | Retorna para<br />
echo                                                           | o início do<br />
if [ "$KEY" = "n" ] || [ "$KEY" = "N" ] ; then                 | </strong><em>while</em><br />
<strong> echo &#8220;OK! Vou continuar no script&#8221;                         |<br />
sleep 2                                                    |<br />
clear                                                      |<br />
continue |&gt;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
fi<br />
if [ "$KEY" = "n" ] || [ "$KEY" = "N" ] ; then<br />
echo &#8220;Saindo do script&#8221;<br />
break |&gt;&#8212;&#8212;&#8212;-|<br />
fi                    | Sai do </strong><em>while</em><strong><br />
done &lt;|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-|</p>
<p>cal </strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script33.sh">AQUI</a></strong><strong><br />
</strong><br />
<em>para &lt;variável&gt; assumir &lt;valor(es)&gt; ; faça<br />
# Para cada  valor assumido pela variável, execute comandos abaixo<br />
comando1<br />
comando2<br />
comandoN<br />
finaliza</em></p>
<p><em>for &lt;variável&gt; in &lt;valor(es)&gt; ; do<br />
# Para cada  valor assumido pela variável, execute comandos abaixo<br />
comando1<br />
comando2<br />
comandoN<br />
done</em></p>
<p><strong>#!/bin/bash<br />
#<br />
# Script 34<br />
# Estruturas Condicionais – Laços repetitivos<br />
#<br />
clear</p>
<p>for VAR in 1 2 3 4 5 6 7 8 9 10 ; do<br />
echo &#8220;Executando pela $VAR vez&#8221;<br />
sleep 1<br />
clear<br />
done</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script34.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
#<br />
# Script 35<br />
# Estruturas Condicionais – Laços repetitivos<br />
#<br />
clear</p>
<p>for VAR in `seq 1 10` ; do<br />
echo &#8220;Executando pela $VAR vez&#8221;<br />
sleep 1<br />
clear<br />
done</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script35.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong><br />
#!/bin/bash<br />
#<br />
# Script 36<br />
# Estruturas Condicionais – Laços repetitivos<br />
#<br />
clear</p>
<p>for ((X=1;X&lt;=10;X++)); do<br />
echo &#8220;Executando pela $X vez&#8221;<br />
sleep 1<br />
clear<br />
done</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script36.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong><br />
#!/bin/bash<br />
#<br />
# Script 37<br />
# Estruturas Condicionais – Laços repetitivos<br />
#<br />
clear<br />
for VAR in `seq 1 50` ; do<br />
touch /tmp/script${VAR}.sh<br />
echo “#!/bin/bash” &gt; </strong><strong>/tmp/</strong><strong>script${VAR}.sh<br />
echo “#            “ &gt;&gt; </strong><strong>/tmp/</strong><strong>script${VAR}.sh<br />
echo “# Script $VAR” &gt;&gt; </strong><strong>/tmp/</strong><strong>script${VAR}.sh<br />
echo “#            “ &gt;&gt; </strong><strong>/tmp/</strong><strong>script${VAR}.sh<br />
echo “#            “ &gt;&gt; </strong><strong>/tmp/</strong><strong>script${VAR}.sh<br />
chmod u+x </strong><strong>/tmp/</strong><strong>script${VAR}.sh<br />
done</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script37.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
#<br />
# Script 38<br />
# Estruturas Condicionais – Laços repetitivos<br />
#<br />
clear<br />
LS_DIR=$(ls /home)<br />
echo &#8220;Fazendo Backup do diretório pessoal dos usuarios&#8221;<br />
sleep 3<br />
for VAR in `echo $LS_DIR` ; do<br />
echo &#8220;Fazendo becape do diretório pessoal do usuario: $VAR&#8221;<br />
tar -czf /tmp/backup-${VAR}-bkp.tar.gz /home/${VAR}<br />
sleep 3<br />
clear</strong></p>
<p><strong> ls -lh /tmp | grep ${VAR}</strong></p>
<p><strong> sleep 5</strong></p>
<p><strong> clear<br />
done </strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script38.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong><br />
</strong></p>
<p><em>caso &lt;variável&gt; ser<br />
valor1)<br />
# Para valor1 assumido pela variável, execute comandos abaixo<br />
comando1<br />
;;<br />
valor2)<br />
# Para valor2 assumido pela variável, execute comandos abaixo<br />
comando2<br />
;;<br />
valorN)<br />
# Para valorN assumido pela variável, execute comandos abaixo<br />
comando3<br />
;;<br />
finaliza<br />
</em></p>
<p><em>case &lt;variável&gt; in<br />
valor1)<br />
# Para valor1 assumido pela variável, execute comandos abaixo<br />
comando1<br />
;;<br />
valor2)<br />
# Para valor2 assumido pela variável, execute comandos abaixo<br />
comando2<br />
;;<br />
valorN)<br />
# Para valorN assumido pela variável, execute comandos abaixo<br />
comando3<br />
;;<br />
esac</em></p>
<p><em><br />
case &lt;variável&gt; in<br />
valor1) comando1 ; comando1N ;;<br />
valor2) comando2 ; comando2N ;;<br />
valorN) comandoN ; comandoN ;;<br />
esac</em></p>
<p><em>select &lt;variável&gt; in &lt;valor1&gt; &lt;valor2&gt; &lt;valor3&gt; &lt;valorN&gt; ; do<br />
break<br />
esac<br />
comandos $variável</em></p>
<p>OU</p>
<p><em>select &lt;variável&gt; in &lt;valor1&gt; &lt;valor2&gt; &lt;valor3&gt; &lt;valorN&gt; ; do<br />
case &lt;$variável&gt; in<br />
valor1) comando1 ; comando1N ;;<br />
valor2) comando2 ; comando2N ;;<br />
valorN) comandoN ; comandoN ;;<br />
esac</em></p>
<p><strong></p>
<p>#!/bin/bash<br />
#<br />
# Script 39<br />
# Estruturas Condicionais – SELETOR<br />
#<br />
clear<br />
echo -ne &#8220;Pressione S ou N: [ ]&#8220;&#8216;\033[2D'<br />
read -n 1 KEY<br />
echo<br />
case $KEY in<br />
s|S)<br />
echo "Voce apertou $KEY"<br />
;;<br />
n|N)<br />
echo "Voce apertou $KEY"<br />
;;<br />
*)<br />
echo "Distraido. Eu mandei teclar S ou N. Abortando!"<br />
;;<br />
esac</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script39.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
#<br />
# Script 40<br />
# Estruturas Condicionais – SELETOR<br />
#<br />
clear<br />
DATA=`date +%w`<br />
case $DATA in<br />
0) DIA="Hoje é Domingo" ;;<br />
1) DIA="Hoje é Segunda" ;;<br />
2) DIA="Hoje é Terça" ;;<br />
3) DIA="Hoje é Quarta" ;;<br />
4) DIA="Hoje é Quinta" ;;<br />
5) DIA="Hoje é Sexta" ;;<br />
6) DIA="Hoje é Sábado" ;;<br />
esac<br />
echo $DIA</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script40.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong>#!/bin/bash<br />
#<br />
# Script 41<br />
# Estruturas Condicionais – SELETOR<br />
#<br />
clear<br />
while true; do<br />
echo -ne "\033[44;37;1m ##-._____________________________.-## \033[0m" '\n'<br />
echo -ne "\033[44;37;1m #                                   # \033[0m" '\n'<br />
echo -ne "\033[44;37;1m |       1) Pingar localhost         | \033[0m" '\n'<br />
echo -ne "\033[44;37;1m |       2) Quem está logado         | \033[0m" '\n'<br />
echo -ne "\033[44;37;1m |       3) IP da eth0               | \033[0m" '\n'<br />
echo -ne "\033[44;37;1m |       4) Memoria                  | \033[0m" '\n'<br />
echo -ne "\033[44;37;1m |       5) Espaço em disco          | \033[0m" '\n'<br />
echo -ne "\033[44;37;1m |       x) Sair                     | \033[0m" '\n'<br />
echo -ne "\033[44;37;1m #                                   | \033[0m" '\n'<br />
echo -ne "\033[44;37;1m ##-._____________________________.-## \033[0m" '\n'<br />
echo -ne "\033[44;37;1m                                       \033[0m" '\033[31D'<br />
echo<br />
echo -ne "\033[44;37;1m #       ( )Opção                    # \033[0m" '\033[31D'</p>
<p>read -n 1 RESP</p>
<p>case $RESP in<br />
1) echo ; ping -c 5 localhost ;;<br />
2) echo ; who ; sleep 5 ;;<br />
3) echo ; ifconfig eth0 ; sleep 5 ;;<br />
4) echo ; free -m ; sleep 5 ;;<br />
5) echo ; df -h ; sleep 5 ;;<br />
x) break ;;<br />
*) echo ; echo “Opção invalida!” ; sleep 3 ;;<br />
esac<br />
done<br />
echo </strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script41.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong><br />
#!/bin/bash<br />
#<br />
# Script 42<br />
# Estruturas Condicionais – SELETOR<br />
#<br />
clear</p>
<p>echo "Qual sistema você prefere?"<br />
select DATA in "Linux" "MacOS" "ruindozê XisPê" ; do<br />
break<br />
done<br />
echo "Você prefere $DATA"</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script42.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><em>&lt;nome_função&gt; () {<br />
comando1<br />
comando2<br />
comando3<br />
comandoN<br />
}</p>
<p>nome_função<br />
</em><br />
# Sempre que nome_função for invocado, execute a cadeia de comandos da função</p>
<p><em>&lt;function_name&gt; () {<br />
comando1<br />
comando2<br />
comando3<br />
comandoN<br />
}</p>
<p>function_name<br />
</em><br />
# Sempre que nome_função for invocado, execute a cadeia de comandos da função</p>
<p><strong><br />
#!/bin/bash<br />
#<br />
# Script 43<br />
# Estruturas Condicionais – FUNÇÃO<br />
#<br />
clear<br />
function1 () {<br />
echo "Diretorio $DIRECT existente!"<br />
}<br />
function2 () {<br />
echo "Diretorio $DIRECT não existe!"<br />
}</p>
<p>echo -n "Digite um diretório: "<br />
read DIRECT<br />
echo<br />
if [ -d $DIRECT ] ; then<br />
function1<br />
else<br />
function2<br />
fi</strong><strong> </strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script43.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong> </strong></p>
<p><strong><br />
#!/bin/bash<br />
#<br />
# Script 44<br />
# Estruturas Condicionais – FUNÇÃO<br />
#<br />
clear<br />
function1 () {<br />
N=1<br />
for VAR in $* ; do<br />
echo &#8220;Parametro $N: $VAR&#8221;<br />
let N=N+1<br />
done<br />
}<br />
function1 Linux Free OpenSource NoViruses<br />
function1 Ruindoze Nojenteoito XuxaPark </strong><strong>VistadoInferno</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script44.sh">AQUI</a></strong><strong><br />
</strong></p>
<p><strong><br />
#!/bin/bash<br />
###<br />
#<br />
# Script 45<br />
#<br />
# Estruturas condicionais &#8211; FUNÇÃO<br />
clear</p>
<p>while true ; do</p>
<p>func_1 () {<br />
. $PWD/script5.sh<br />
}</p>
<p>func_2 () {<br />
. $PWD/script12.sh<br />
}</p>
<p>func_3 () {<br />
. $PWD/script43.sh<br />
}</p>
<p>func_4 () {<br />
. $PWD/script41.sh<br />
}</p>
<p>menu () {<br />
clear<br />
echo -ne &#8220;\033[44;37;1m ##=-._______________________.-=## \033[m"'\n'<br />
echo -ne "\033[44;37;1m ##=-                         -=## \033[m"'\n'<br />
echo -ne "\033[44;37;1m ##=-      MENU PRINCIPAL     -=## \033[m"'\n'<br />
echo -ne "\033[44;37;1m ##=-                         -=## \033[m"'\n'<br />
echo -ne "\033[44;37;1m ##=-  1) IP ETH0 / UID root  -=## \033[m"'\n'<br />
echo -ne "\033[44;37;1m ##=-  2) NOME / SENHA / KEY  -=## \033[m"'\n'<br />
echo -ne "\033[44;37;1m ##=-  3) Verifica Diretório  -=## \033[m"'\n'<br />
echo -ne "\033[44;37;1m ##=-  4) Opções Avançadas    -=## \033[m"'\n'<br />
echo -ne "\033[44;37;1m ##=-  5) Espaço em disco     -=## \033[m"'\n'<br />
echo -ne "\033[44;37;1m ##=-  x) sair                -=## \033[m"'\n'<br />
echo -ne "\033[44;37;1m ##=-._______________________.-=## \033[m"'\n'<br />
echo<br />
echo -ne "\033[44;37;1m ##=-  [ ] Opção              -=## \033[m&#8221;&#8216;\033[27D&#8217;<br />
}</strong></p>
<p><strong><br />
menu</p>
<p>read -n 1 RESP</p>
<p>case $RESP in<br />
1) echo ; func_1 ; sleep 5 ;;<br />
2) echo ; func_2 ; sleep 5 ;;<br />
3) echo ; func_3 ; sleep 5 ;;<br />
4) echo ; func_4 ; sleep 5 ;;<br />
5) echo ; df -h ; sleep 5 ;;<br />
x) break ;;<br />
*) echo ; echo &#8220;Opção inválida!&#8221; ;  sleep 3 ;;<br />
esac<br />
done</p>
<p>exec clear</p>
<p>###</strong></p>
<p><strong>Baixe <a href="http://sites.google.com/site/marciokatan/script45.sh">AQUI</a></strong><strong> </strong></p>
<p><span style="color: #000000;"><span style="font-size: small;"><strong>Autor: Marcio Katan</strong></span></span></p>
<p><span><span style="font-size: small;"> &#8211; Técnico de Suporte</span></span></p>
<p><span><span style="font-size: small;"> &#8211; Consultor linux Micro &amp; Pequena Empresa</span></span></p>
<p><span><span style="font-size: small;"> &#8211; Instrutor Linux</span></span></p>
<p><span><span style="font-size: small;">Autor do livro: Linux no Computador Pessoal com Conectiva 10</span></span></p>
<p><span><span style="font-size: small;"><strong>Veja <a rel="nofollow" href="http://www.lcm.com.br/index.php?Escolha=20&amp;Livro=L00382">AQUI</a></strong></span></span></p>
<p>Fonte: http://sites.google.com/site/marciokatan/</p>
<div class="shr-publisher-430"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/09/22/tutorial-basicointermediario-sobre-programacao-shell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando o Slax</title>
		<link>http://blog.deserv.info/2010/08/04/instalando-o-slax/</link>
		<comments>http://blog.deserv.info/2010/08/04/instalando-o-slax/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 17:56:09 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[Instalação]]></category>
		<category><![CDATA[Live-CD]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Slax]]></category>
		<category><![CDATA[Slax Live-CD]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=409</guid>
		<description><![CDATA[O Slax é um live-CD baseado no Slackware, uma boa forma de conhecer a distribuição sem precisar passar pela etapa inicial de configuração e configuração do sistema. O Slax roda diretamente a partir do CD-ROM e inclui um conjunto de scripts que automatizam a configuração do sistema, detectando o vídeo, som e outros periféricos. O [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.deserv.info%252F2010%252F08%252F04%252Finstalando-o-slax%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Instalando%20o%20Slax%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div>O Slax é um live-CD baseado no Slackware, uma  boa forma de conhecer a distribuição sem precisar passar pela etapa inicial de configuração e configuração do sistema. O Slax roda diretamente a partir do CD-ROM e inclui um conjunto de scripts que automatizam a configuração do sistema, detectando o vídeo, som e outros periféricos. <span id="more-409"></span></div>
<p>O sistema de autodetecção do Slax não é tão desenvolvido quanto o de  distribuições como o Ubuntu, Knoppix ou Mandriva, mas ajuda bastante.</p>
<p>Você pode baixar a última versão no: <a href="http://slax.linux-live.org/">http://slax.linux-live.org/</a>.</p>
<p>Além do &#8220;Slax Standard Edition&#8221;, que é a versão principal, que abordo aqui, estão disponíveis algumas versões específicas, como o KillBill (que vem com o wine pré-instalado) e o PopCorn (uma versão reduzida, que pode ser instalado num pendrive de 128 MB).</p>
<p>O Slax configura o vídeo durante o boot, mas não abre o modo gráfico automaticamente. Na tela de login, você deve se logar como root, senha toor e rodar o comando &#8220;startx&#8221; para abrir o KDE. Você pode também usar a opção &#8220;slax gui&#8221; na tela de boot, para que ele abra o KDE automaticamente, como no Kurumin.</p>
<p>Embora seja raro, existem casos em que o sistema trava na hora do boot por causa de problemas com a detecção de algum periférico. Nestes casos, você pode experimentar as opções &#8220;slax noagp&#8221;, &#8220;slax nopcmcia&#8221;, &#8220;slax nodma&#8221; ou &#8220;slax acpi=off&#8221;.</p>
<p>Ao abrir o modo gráfico, você verá uma versão personalizada do KDE, com um visual simpático e um menu limpo, com poucos programas instalados por padrão. Devido à simplicidade, o tempo de boot também é perceptivelmente mais baixo.</p>
<p style="text-align: center;"><a href="http://blog.deserv.info/wp-content/uploads/2010/08/img-938c2356.png"><img class="size-full wp-image-411 aligncenter" title="img-938c2356" src="http://blog.deserv.info/wp-content/uploads/2010/08/img-938c2356.png" alt="" width="640" height="482" /></a></p>
<p>Para configurar o som, use o comando &#8220;alsaconf&#8221;, e para configurar a rede, use o &#8220;netconfig&#8221; (o mesmo script usado no Slackware). Se você acessa via ADSL com autenticação (PPPoE), use o comando &#8220;adsl-setup&#8221; para configurar a conexão e depois o &#8220;adsl-start&#8221; para conectar. Estes dois comandos podem ser encontrados também no Mandriva, Fedora e em outras distribuições derivadas do Red Hat.</p>
<p>{mospagebreak}</p>
<p>O Slax não inclui suporte a nenhum softmodem, mas se por acaso você utilizar um hardmodem, pode conectar usando o Kppp, como em outras distribuições.</p>
<p>O suporte a placas wireless também não conta com todos os drivers disponíveis mas ele já vem com o Ndiswrapper pré-instalado, que permite configurar muitas placas usando os drivers do Windows. Você pode ver dicas de como configurar sua placa usando o Ndiswrapper no Guia Modems e placas wireless no Linux: <a href="http://www.guiadohardware.net/guias/05/">http://www.guiadohardware.net/guias/05/</a></p>
<p>Em resumo, você primeiro carrega o arquivo .inf do driver do Windows XP, com o comando &#8220;ndiswrapper -i&#8221;, como em:</p>
<p><em># ndiswrapper -i neti2220.inf</em></p>
<p>&#8230; e, em seguida, ativa o Ndiswrapper usando o comando:</p>
<p><em># modprobe ndiswrapper</em></p>
<p>Com a placa ativa, você pode configurar os parâmetros da rede wireless e monitorar a conexão através do Kwifimanager, que está dentro do menu internet.</p>
<p>O Slax não oferece nenhuma opção de alterar o particionamento durante a instalação. Você precisa criar as partições previamente, usando o cfdisk e formatá-las através do comando &#8220;mkreiserfs&#8221;, como em &#8220;mkreiserfs /dev/hda2&#8243;. Outra opção, é particionar usando um CD do Kurumin, ou o CD de instalação do Mandriva e voltar ao Slax para instalar. Mesmo ao particionar a partir do próprio Slax, usando o cfdisk, é sempre necessário reiniciar, para que o instalador detecte as alterações.</p>
<p>O instalador está disponível no &#8220;Iniciar &gt; System &gt; Slax Installer&#8221;. Ele é provavelmente o instalador mais simples de todas as distribuições que já vi. Você precisa apenas indicar a partição onde o sistema será instalado e no MBR de qual drive o lilo será gravado (caso tenha mais de um). Não existe a opção de instalar o lilo na partição, caso você esteja instalando-o em dual boot com o Windows ou outra distribuição. Ele sempre se gravará na MBR e você precisará configurar o &#8220;/etc/lilo.conf&#8221; para que ele lhe dê a opção de inicializar os outros sistemas instalados.</p>
<p>{mospagebreak}</p>
<p>Existem duas formas de instalação. A opção &#8220;Live&#8221; simplesmente copia o conteúdo do CD para a partição, ocupando apenas 200 MB. Esta opção é mais uma opção para poder dar boot sem usar o CD-ROM do que uma instalação propriamente dita, algo similar a usar a opção &#8220;tohd&#8221; no Kurumin. A opção &#8220;Real&#8221; ocupa quase o triplo de espaço, pois nela os arquivos são realmente descompactados, criando uma instalação real do sistema, onde você pode instalar novos programas e fazer qualquer tipo de alteração.</p>
<p style="text-align: center;"><a href="http://blog.deserv.info/wp-content/uploads/2010/08/img-5220c6e6.png"><img class="aligncenter size-full wp-image-412" title="img-5220c6e6" src="http://blog.deserv.info/wp-content/uploads/2010/08/img-5220c6e6.png" alt="" width="537" height="528" /></a></p>
<p>Mesmo depois de instalado, o Slax continua usando o root como usuário padrão. Enquanto você estiver brincando e explorando o sistema isto é até interessante, pois permite que você mexa onde quiser, sem ser perturbado por problemas com as permissões. Se alguma coisa der errado, basta reinstalar e começar de novo.</p>
<p>Mas, a partir do momento em que você resolver navegar na web ou fazer qualquer trabalho mais sério, o uso do root torna-se um grave problema de segurança por dois motivos: como root você tem permissão para fazer tudo, então acaba sendo muito fácil destruir o sistema e, ao mesmo tempo, abrindo todos os programas como root, fica muito mais fácil explorar brechas de seguranças nos programas para obter acesso à sua máquina remotamente. Esta segunda possibilidade não é tão grande assim, mas vale a pena evitar.</p>
<p>{mospagebreak}</p>
<p>Você pode criar um novo usuário usando o comando adduser, como em:</p>
<p><em># adduser tux</em></p>
<p>São feitas muitas perguntas, que permitem incluir informações diversas no cadastro do usuário (que seriam úteis numa grande rede), mas, no caso de um humilde desktop, as únicas que realmente interessam são o nome em si (login) e a senha.</p>
<p>Depois de instalado, o Slax nada mais é do que uma versão customizada do Slackware. O que você aprender a fazer no Slax pode ser feito também no Slackware e vice-versa.</p>
<p>Um dos grandes atrativos do Slax é ser um sistema bem simples e limpo, com poucos programas instalados por padrão. Isto é uma faca de dois gumes, pois também significa que ao usar o sistema por mais tempo, você acabará precisando investir mais tempo baixando e instalando programas adicionais.</p>
<p>O Slax é compatível com os pacotes da versão correspondente do Slackware. O Slax 5.06, por exemplo, usa os pacotes do Slackware 10.2. Normalmente, a última versão do Slax usa os pacotes da última versão do Slackware.</p>
<p>Você pode instalar programas adicionais a partir dos CDs de instalação (do Slackware) ou ir baixando individualmente os programas desejados a partir de um dos mirrors listados no <a href="http://www.slackware.com/getslack/">http://www.slackware.com/getslack/</a>.</p>
<p>Para instalar o suporte a português do Brasil no KDE, por exemplo, baixe o pacote kde-i18n-pt_BR, que está disponível na pasta &#8220;slackware/kdei/&#8221; do CD ou mirror. Os pacotes do Slackware usam a extensão &#8220;.tgz&#8221;. Junto com cada pacote, existe sempre um arquivo &#8220;.txt&#8221;, com uma descrição curta e um arquivo &#8220;.asc&#8221;, usado pelo instalador para verificar a integridade do pacote principal.</p>
<p>Para instalar o pacote baixado, use o comando &#8220;installpkg&#8221;, seguido pelo nome do pacote, como em:</p>
<p><em># installpkg kde-i18n-pt_BR-3.4.2-noarch-1.tgz</em></p>
<p>Use a tecla TAB para completar o nome do arquivo depois de digitar as primeiras letras. O installpkg é uma ferramenta simples de instalação, que funciona de uma forma similar ao &#8220;dpkg -i&#8221; do Debian. Ele permite instalar pacotes que você já baixou, mas não é capaz de baixar os pacotes por si só, como o apt-get. O installpkg também não checa dependências ao instalar os pacotes: mesmo que exista algum problema, você só saberá depois de tentar abri-lo.</p>
<p>Esta forma simplificada de instalar programas é a principal característica do Slackware. A vantagem é que você literalmente pode fazer o que quiser, sem que ele te perturbe com mensagens de erro e dependências desencontradas. A desvantagem é que ele não faz nada sozinho; a única maneira de descobrir que o pacote x precisa do pacote y para funcionar é pesquisando.</p>
<p>Depois de instalado o pacote, acesse o Painel de Controle do KDE, Regional  &amp; Accessibility &gt; Contry, Region &amp; Language e, dentro dela marque a opção Add Language &gt; Brazil Portuguese. Clique no &#8220;Apply&#8221; e reinicie o KDE para que os aplicativos passem a usar nossa língua.</p>
<p>{mospagebreak}</p>
<p>Para instalar o Gimp, baixe o pacote &#8220;gimp&#8221;, que está na pasta &#8220;slackware/xap&#8221;; para instalar o Firefox, baixe o pacote &#8220;mozilla-firefox&#8221; que está na mesma pasta; e assim por diante. O Slax já vem com o plugin do Flash pré-instalado; experimente instalar também o Java e Real Player, seguindo as instruções do capítulo 5 depois de instalar o Firefox.</p>
<p>Para instalar o OpenOffice 2.0, baixe o pacote para o Slackware, disponível no: <a href="http://www.openoffice.org.br/">http://www.openoffice.org.br/</a> e instale-o usando o comando:</p>
<p><em># installpkg openoffice.org.br-2.0-i586-4.tgz</em></p>
<p>Depois de instalado, você pode completar a instalação do corretor ortográfico e usar as otimizações que vimos no capítulo 5.</p>
<p>O Slackware utiliza uma estrutura de scripts diferente da das outras distribuições. No Debian e na maioria das outras distribuições, você usaria o comando &#8220;/etc/init.d/ssh start&#8221; para inicializar o servidor SSH e permitir que sua máquina possa ser acessada a partir de outros micros da rede local. No Slackware, isso funciona de forma similar, mas os scripts mudam de lugar, vão na pasta &#8220;/etc/rc.d/&#8221;.</p>
<p>Para instalar o servidor SSH no Slax, por exemplo, instale o pacote &#8220;openssh-4.2p1-i486-1.tgz&#8221; que está dentro da pasta &#8220;slackware/n/&#8221; do CD ou mirror de instalação do Slackware. Ao instalar o pacote, será criado o arquivo &#8220;/etc/rc.d/rc.sshd&#8221;, o script que permite inicializá-lo. Para usá-lo, você precisa primeiro transformá-lo num executável, usando o comando:</p>
<p><em># chmod +x /etc/rc.d/rc.sshd</em></p>
<p>E, em seguida, inicializar o servidor SSH, usando o comando:</p>
<p><em># /etc/rc.d/rc.sshd</em></p>
<p>O fato de ser uma distribuição minimalista, com tamanho reduzido e rápida de instalar, faz com que o Slax seja uma forma muito prática de se familiarizar com o Slackware, já que você pode testar a instalação de vários programas, testar várias configurações e reinstalar o sistema rapidamente sempre que alguma coisa der errada.</p>
<p>Fonte: GuiadoHardware.net</p>
<p>Autor: <strong>Carlos  E. Morimoto</strong></p>
<p><strong><br />
</strong></p>
<div class="shr-publisher-409"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/08/04/instalando-o-slax/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando um servidor Jabber (Jive) para comunicação Instatânea</title>
		<link>http://blog.deserv.info/2010/08/04/instalando-um-servidor-jabber-jive-para-comunicacao-instatanea/</link>
		<comments>http://blog.deserv.info/2010/08/04/instalando-um-servidor-jabber-jive-para-comunicacao-instatanea/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 13:50:36 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Softwares Adicionais]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Comunicação Instantânea]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Jabber]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JRE]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[OpenSource]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=407</guid>
		<description><![CDATA[Neste tutorial eu irei ensinar como instalar um servidor de comunicação instatânea baseada no protocolo Jabber utilizando o mysql para autenticação, para ser usado dentro de empresas, grupos e etc.

A instalação é bem simples e se for bem seguida, você não terá problemas.

Então deixemos de conversa e vamos logo ao que interessa.]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.deserv.info%252F2010%252F08%252F04%252Finstalando-um-servidor-jabber-jive-para-comunicacao-instatanea%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Instalando%20um%20servidor%20Jabber%20%28Jive%29%20para%20comunica%C3%A7%C3%A3o%20Instat%C3%A2nea%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><h2>Introdução</h2>
<p>Neste tutorial eu irei ensinar como instalar um servidor de comunicação  instatânea baseada no protocolo Jabber utilizando o mysql para  autenticação, para ser usado dentro de empresas, grupos e etc.</p>
<p>A instalação é bem simples e se for bem seguida, você não terá  problemas.</p>
<p>Então deixemos de conversa e vamos logo ao que interessa.<span id="more-407"></span></p>
<p><a id="Sistema_Operacional_Utilizado" name="Sistema_Operacional_Utilizado"></a></p>
<h2>Sistema  Operacional Utilizado</h2>
<ul>
<li>Debian Linux Versão 3.1</li>
</ul>
<p><a id="Softwares_necess.C3.A1rios" name="Softwares_necess.C3.A1rios"></a></p>
<h2>Softwares necessários</h2>
<ul>
<li>Jive Messenger versão 2.1.5 ou superior.</li>
<li>Mysql 3.4 ou superior. Recomendado usar &gt;= 4.1</li>
<li>JRE 1.5 ou superior para linux. Pode ser adquirido no site da  sun.</li>
</ul>
<p><a id="Instala.C3.A7.C3.A3o_e_Configura.C3.A7.C3.A3o" name="Instala.C3.A7.C3.A3o_e_Configura.C3.A7.C3.A3o"></a></p>
<h2>Instalação e Configuração</h2>
<p><a id="Mysql" name="Mysql"></a></p>
<h3>Mysql</h3>
<p>Usando o apt-get ou através de mecanismos da sua distro faça o download e  instalação do mysql. (Não irei ensinar a configurar e instalar o mysql,  para isso existem vários tutoriais na net).</p>
<p><a id="Crie_um_database_chamado_jabber." name="Crie_um_database_chamado_jabber."></a></p>
<h4>Crie  um database chamado jabber.</h4>
<p>Crie uma conta de usuário no mysql ou use a conta do root. Recomendado  não usar o root. Esse usuário deverá ter permissões para se conectar de  qualquer lugar, ou seja, &#8220;%&#8221;.</p>
<p>O motivo: durante a configuração do jabber o mesmo ira acusar erros caso  o usuário que você especificar não estiver conforme eu descrevi.</p>
<p>Você pode tentar limitar o acesso desse usuário permitindo logon somente  local após a instalação. Comigo não funcionou.</p>
<p><a id="JRE_1.5" name="JRE_1.5"></a></p>
<h3>JRE  1.5</h3>
<p>No site da Sun<a title="http://www.sun.com" rel="nofollow" href="http://www.sun.com/">[1]</a>, baixe o  arquivo .BIN do JRE-1.5 no diretório /usr/local. Aqui utilizei a  jre-1_5_0_04-linux-i586.bin</p>
<p>Deixe o arquivo ser executavel.</p>
<pre># chmod +x jre-1_5_0_04-linux-i586.bin
</pre>
<p>Execute o arquivo digitando:</p>
<pre># ./jre-1_5_0_04-linux-i586.bin
</pre>
<p>Após concordar com os termos de licença, irá surgir uma pasta chamada  jre1.5.0_04 no diretório corrente.</p>
<p><a id="Servidor_Jabber" name="Servidor_Jabber"></a></p>
<h3>Servidor Jabber</h3>
<p>Nesta instalação vamos usar o Jive versão 2.1.5.</p>
<p>Faça o download do jive no site <a title="http://www.jivemessenger.com" rel="nofollow" href="http://www.jivemessenger.com/">http://www.jivemessenger.com</a></p>
<p>Descompacte-o arquivo no diretório /usr/local</p>
<pre># tar -zxvf jive_messenger_2_1_5.tar.gz
</pre>
<p>Feito isso é hora de criar uma variavel de ambiente utilizada pelo jive  para identificar a localização da máquina virtual java.</p>
<pre># export INSTALL4J_JAVA_HOME=/usr/local/jre1.5.0_04/
</pre>
<p>Chegada a hora de iniciarmos o servidor. Digite:</p>
<pre># /usr/local/jive_messenger/bin/messenger start
</pre>
<p>Se tudo estiver correto o servidor estará funcional.</p>
<p>Abra um browser qualquer e aponte para o ip do servidor na porta 9090</p>
<p>Se tudo der certo você estará na área administrativa começando a  configurar o servidor.</p>
<p>Preencha os campos que o sistema requer e vá avançando.</p>
<p>Após concluir a configuração, você deve alterar as permissões do usuário  mysql que o jive usa, limitando elas.</p>
<p>A configuração do Jive é muito fácil e lembra os wizards do windows.</p>
<p>Após completar a configuração do servidor, é chegada a hora de baixar o  client e testar. Recomendo o uso do Pandion e NeosMt (Meu preferido).</p>
<p>Instale o client do NeosMt<a title="http://www.neosmt.com/eng/index.php" rel="nofollow" href="http://www.neosmt.com/eng/index.php">[2]</a></p>
<p>Vá em criar nova conta. E onde ele pedir o servidor, você deverá colocar  ip ou nome do servidor em que foi feita a instalação.</p>
<p>Criado a conta agora é só logar com o usuário@servidor e senha.</p>
<p><a id="Conclus.C3.A3o" name="Conclus.C3.A3o"></a></p>
<h2>Conclusão</h2>
<p>Pronto temos um servidor Jabber de comunicação Instantânea.</p>
<p>Até mais e abraços.</p>
<p><a id="Autor" name="Autor"></a></p>
<h2>Autor</h2>
<ul>
<li><strong><a title="Usuário:Iceman" href="http://under-linux.org/wiki/Usu%C3%A1rio:Iceman">&#8217;1c3_m4n</a></strong> (iceman@underlinux.com.br)</li>
</ul>
<p>Fonte: http://under-linux.org</p>
<div class="shr-publisher-407"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/08/04/instalando-um-servidor-jabber-jive-para-comunicacao-instatanea/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Canivete Suíço do Shell (Bash)</title>
		<link>http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash/</link>
		<comments>http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash/#comments</comments>
		<pubDate>Tue, 29 Jun 2010 21:14:08 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Aurélio]]></category>
		<category><![CDATA[Canivete Suíço]]></category>
		<category><![CDATA[Canivete Suíço do Shell]]></category>
		<category><![CDATA[Shell Scripts]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=394</guid>
		<description><![CDATA[Este Canivete Suíço do Shell é um apêndice do meu livro Shell Script Profissional. O livro é enorme, são quase 500 páginas de puro shell, explicado de maneira clara e didática. Você vai dominar o assunto, além de aprender a escrever programas de verdade em vez de meros scripts toscos. Sou escritor e ganho a [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.deserv.info%252F2010%252F06%252F29%252Fcanivete-suico-do-shell-bash%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FbsPsQx%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Canivete%20Su%C3%AD%C3%A7o%20do%20Shell%20%28Bash%29%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><table border="1">
<tbody>
<tr>
<td><a href="http://www.shellscript.com.br/"><img src="http://aurelio.net/img/icon128/livroshell.png" border="0" alt="" align="middle" /></a></td>
<td>Este Canivete Suíço do Shell é um apêndice do meu livro <a href="http://www.shellscript.com.br/">Shell Script Profissional</a>. O  livro é enorme, são quase 500 páginas de puro shell, explicado de  maneira clara e didática. Você vai dominar o assunto, além de aprender a  escrever programas de verdade em vez de meros scripts toscos. Sou  escritor e ganho a vida com meus livros, então comprando o livro você  também me ajuda a manter esse site no ar e assim eu continuo escrevendo  para você ler. Combinado? <img src='http://blog.deserv.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  <span id="more-394"></span></td>
</tr>
</tbody>
</table>
<div>
<ol>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#operadores">Operadores</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#redir">Redirecionamento</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#variaveis">Variáveis  especiais</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#expansao">Expansão  de variáveis</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#blocos">Blocos  e agrupamentos</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#ifwhilefor">if,  for, select, while, until, case</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#test">Opções  do comando test ou [</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#prompt">Escapes  especiais para usar no prompt (PS1)</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#echo">Escapes  reconhecidos pelo comando echo</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#date">Formatadores  do comando date</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#printf">Formatadores  do comando printf</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#ls">Letras  identificadoras de arquivos no comando ls -l</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#glob">Curingas  para nomes de arquivo (glob)</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#case">Curingas  para os itens do comando case</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#sinais">Sinais  para usar com trap/kill/killall</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#exitcode">Códigos  de retorno de comandos</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#cores">Códigos  de cores (ANSI)</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#metacaracteres">Os  metacaracteres das expressões regulares</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#metadif">Metacaracteres  que são diferentes nos aplicativos</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#ascii">Caracteres  ASCII imprimíveis (ISO-8859-1) - texto</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#asciiimg">Caracteres  ASCII imprimíveis (ISO-8859-1) - imagem</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#codigos">Códigos  prontos para copiar e colar</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#emacs">Atalhos  da linha de comando (set -o emacs)</a></li>
<li><a href="http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash#ferramentas">A caixa de  ferramentas do shelleiro</a></li>
</ol>
</div>
<div>
<ul>
<li>Quer imprimir o canivete? <a href="http://aurelio.net/shell/canivete-pdf.html">Baixe o PDF</a> (agora  é gratuito).</li>
<li>Veja também: <a href="http://aurelio.net/shell/miniman">miniman</a>,  o irmãozinho do canivete suíço.</li>
<li>¿Habla español? Este documento <a href="http://aurelio.net/shell/canivete-es.html">fue traducido a su  idioma</a>.</li>
</ul>
</div>
<p><a name="operadores"></a></p>
<h2>1. Operadores</h2>
<table border="1" align="center">
<tbody>
<tr>
<th colspan="2">Operadores Aritméticos</th>
</tr>
<tr>
<td align="center"><code>+</code></td>
<td>Adição</td>
</tr>
<tr>
<td align="center"><code>-</code></td>
<td>Subtração</td>
</tr>
<tr>
<td align="center"><code>*</code></td>
<td>Multiplicação</td>
</tr>
<tr>
<td align="center"><code>/</code></td>
<td>Divisão</td>
</tr>
<tr>
<td align="center"><code>%</code></td>
<td>Módulo</td>
</tr>
<tr>
<td align="center"><code>**</code></td>
<td>Exponenciação</td>
</tr>
<tr>
<th colspan="2">Operadores de Atribuição</th>
</tr>
<tr>
<td align="center"><code>=</code></td>
<td>Atribui valor a uma variável</td>
</tr>
<tr>
<td align="center"><code>+=</code></td>
<td>Incrementa a variável por uma constante</td>
</tr>
<tr>
<td align="center"><code>-=</code></td>
<td>Decrementa a variável por uma constante</td>
</tr>
<tr>
<td align="center"><code>*=</code></td>
<td>Multiplica a variável por uma constante</td>
</tr>
<tr>
<td align="center"><code>/=</code></td>
<td>Divide a variável por uma constante</td>
</tr>
<tr>
<td align="center"><code>%=</code></td>
<td>Resto da divisão por uma constante</td>
</tr>
<tr>
<td align="center"><code>++</code></td>
<td>Incrementa em 1 o valor da variável</td>
</tr>
<tr>
<td align="center"><code>--</code></td>
<td>Decrementa em 1 o valor da variável</td>
</tr>
<tr>
<th colspan="2">Operadores Relacionais</th>
</tr>
<tr>
<td align="center"><code>==</code></td>
<td>Igual</td>
</tr>
<tr>
<td align="center"><code>!=</code></td>
<td>Diferente</td>
</tr>
<tr>
<td align="center"><code>&gt;</code></td>
<td>Maior</td>
</tr>
<tr>
<td align="center"><code>&gt;=</code></td>
<td>Maior ou Igual</td>
</tr>
<tr>
<td align="center"><code>&lt;</code></td>
<td>Menor</td>
</tr>
<tr>
<td align="center"><code>&lt;=</code></td>
<td>Menor ou Igual</td>
</tr>
<tr>
<th colspan="2">Operadores Lógicos</th>
</tr>
<tr>
<td align="center"><code>&amp;&amp;</code></td>
<td>E lógico (AND)</td>
</tr>
<tr>
<td align="center"><code>||</code></td>
<td>OU lógico (OR)</td>
</tr>
<tr>
<th colspan="2">Operadores de BIT</th>
</tr>
<tr>
<td align="center"><code>&lt;&lt;</code></td>
<td>Deslocamento à esquerda</td>
</tr>
<tr>
<td align="center"><code>&gt;&gt;</code></td>
<td>Deslocamento à direita</td>
</tr>
<tr>
<td align="center"><code>&amp;</code></td>
<td>E de bit (AND)</td>
</tr>
<tr>
<td align="center"><code>|</code></td>
<td>OU de bit (OR)</td>
</tr>
<tr>
<td align="center"><code>^</code></td>
<td>OU exclusivo de bit (XOR)</td>
</tr>
<tr>
<td align="center"><code>~</code></td>
<td>Negação de bit</td>
</tr>
<tr>
<td align="center"><code>!</code></td>
<td>NÃO de bit (NOT)</td>
</tr>
<tr>
<th colspan="2">Operadores de BIT (atribuição)</th>
</tr>
<tr>
<td align="center"><code>&lt;&lt;=</code></td>
<td>Deslocamento à esquerda</td>
</tr>
<tr>
<td align="center"><code>&gt;&gt;=</code></td>
<td>Deslocamento à direita</td>
</tr>
<tr>
<td align="center"><code>&amp;=</code></td>
<td>E de bit</td>
</tr>
<tr>
<td align="center"><code>|=</code></td>
<td>OU de bit</td>
</tr>
<tr>
<td align="center"><code>^=</code></td>
<td>OU exclusivo de bit</td>
</tr>
</tbody>
</table>
<p><a name="redir"></a></p>
<h2>2. Redirecionamento</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Operador</th>
<th>Ação</th>
</tr>
<tr>
<td align="center"><code>&lt;</code></td>
<td>Redireciona a entrada padrão (STDIN)</td>
</tr>
<tr>
<td align="center"><code>&gt;</code></td>
<td>Redireciona a saída padrão (STDOUT)</td>
</tr>
<tr>
<td align="center"><code>2&gt;</code></td>
<td>Redireciona a saída de erro (STDERR)</td>
</tr>
<tr>
<td align="center"><code>&gt;&gt;</code></td>
<td>Redireciona a saída padrão, anexando</td>
</tr>
<tr>
<td align="center"><code>2&gt;&gt;</code></td>
<td>Redireciona a saída de erro, anexando</td>
</tr>
<tr>
<td align="center"><code>|</code></td>
<td>Conecta a saída padrão com a entrada padrão de outro comando</td>
</tr>
<tr>
<td align="center"><code>2&gt;&amp;1</code></td>
<td>Conecta a saída de erro na saída padrão</td>
</tr>
<tr>
<td align="center"><code>&gt;&amp;2</code></td>
<td>Conecta a saída padrão na saída de erro</td>
</tr>
<tr>
<td align="center"><code>&gt;&amp;-</code></td>
<td>Fecha a saída padrão</td>
</tr>
<tr>
<td align="center"><code>2&gt;&amp;-</code></td>
<td>Fecha a saída de erro</td>
</tr>
<tr>
<td align="center"><code>3&lt;&gt;arq</code></td>
<td>Conecta o descritor de arquivos 3 ao arquivo 'arq'</td>
</tr>
<tr>
<td align="center"><code>&lt;&lt;FIM</code></td>
<td>Alimenta a entrada padrão (Here Document)</td>
</tr>
<tr>
<td align="center"><code>&lt;&lt;-FIM</code></td>
<td>Alimenta a entrada padrão, cortando TABs</td>
</tr>
<tr>
<td align="center"><code>&lt;(cmd)</code></td>
<td>A saída do comando 'cmd' é um arquivo: diff &lt;(cmd1) &lt;(cmd2)</td>
</tr>
<tr>
<td align="center"><code>&gt;(cmd)</code></td>
<td>A entrada do comando 'cmd' é um arquivo: tar cf &gt;(bzip2 -c  &gt;file.tbz) $dir</td>
</tr>
</tbody>
</table>
<p><a name="variaveis"></a></p>
<h2>3. Variáveis especiais</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Variável</th>
<th>Parâmetros Posicionais</th>
</tr>
<tr>
<td align="center"><code>$0</code></td>
<td>Parâmetro número 0 (nome do comando ou função)</td>
</tr>
<tr>
<td align="center"><code>$1</code></td>
<td>Parâmetro número 1 (da linha de comando ou função)</td>
</tr>
<tr>
<td align="center"><code>...</code></td>
<td>Parâmetro número N ...</td>
</tr>
<tr>
<td align="center"><code>$9</code></td>
<td>Parâmetro número 9 (da linha de comando ou função)</td>
</tr>
<tr>
<td align="center"><code>${10}</code></td>
<td>Parâmetro número 10 (da linha de comando ou função)</td>
</tr>
<tr>
<td align="center"><code>...</code></td>
<td>Parâmetro número NN ...</td>
</tr>
<tr>
<td align="center"><code>$#</code></td>
<td>Número total de parâmetros da linha de comando ou função</td>
</tr>
<tr>
<td align="center"><code>$*</code></td>
<td>Todos os parâmetros, como uma string única</td>
</tr>
<tr>
<td align="center"><code>$@</code></td>
<td>Todos os parâmetros, como várias strings protegidas</td>
</tr>
<tr>
<th>Variável</th>
<th>Miscelânia</th>
</tr>
<tr>
<td align="center"><code>$$</code></td>
<td>Número PID do processo atual (do próprio script)</td>
</tr>
<tr>
<td align="center"><code>$!</code></td>
<td>Número PID do último job em segundo plano</td>
</tr>
<tr>
<td align="center"><code>$_</code></td>
<td>Último argumento do último comando executado</td>
</tr>
<tr>
<td align="center"><code>$?</code></td>
<td>Código de retorno do último comando executado</td>
</tr>
</tbody>
</table>
<p><a name="expansao"></a></p>
<h2>4. Expansão de variáveis</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Sintaxe</th>
<th>Expansão Condicional</th>
</tr>
<tr>
<td><code>${var:-texto}</code></td>
<td>Se var não está definida, retorna 'texto'</td>
</tr>
<tr>
<td><code>${var:=texto}</code></td>
<td>Se var não está definida, defina-a com 'texto'</td>
</tr>
<tr>
<td><code>${var:?texto}</code></td>
<td>Se var não está definida, retorna o erro 'texto'</td>
</tr>
<tr>
<td><code>${var:+texto}</code></td>
<td>Se var está definida, retorna 'texto', senão retorna o vazio</td>
</tr>
<tr>
<th>Sintaxe</th>
<th>Expansão de Strings</th>
</tr>
<tr>
<td><code>${var}</code></td>
<td>É o mesmo que $var, porém não ambíguo</td>
</tr>
<tr>
<td><code>${#var}</code></td>
<td>Retorna o tamanho da string</td>
</tr>
<tr>
<td><code>${!var}</code></td>
<td>Executa o conteúdo de $var (igual 'eval \$$var')</td>
</tr>
<tr>
<td><code>${!texto*}</code></td>
<td>Retorna os nomes de variáveis começadas por 'texto'</td>
</tr>
<tr>
<td><code>${var:N}</code></td>
<td>Retorna o texto a partir da posição 'N'</td>
</tr>
<tr>
<td><code>${var:N:tam}</code></td>
<td>Retorna 'tam' caracteres a partir da posição 'N'</td>
</tr>
<tr>
<td><code>${var#texto}</code></td>
<td>Corta 'texto' do início da string</td>
</tr>
<tr>
<td><code>${var##texto}</code></td>
<td>Corta 'texto' do início da string (* guloso)</td>
</tr>
<tr>
<td><code>${var%texto}</code></td>
<td>Corta 'texto' do final da string</td>
</tr>
<tr>
<td><code>${var%%texto}</code></td>
<td>Corta 'texto' do final da string (* guloso)</td>
</tr>
<tr>
<td><code>${var/texto/novo}</code></td>
<td>Substitui 'texto' por 'novo', uma vez</td>
</tr>
<tr>
<td><code>${var//texto/novo}</code></td>
<td>Substitui 'texto' por 'novo', sempre</td>
</tr>
<tr>
<td><code>${var/#texto/novo}</code></td>
<td>Se a string começar com 'texto', substitui 'texto' por 'novo'</td>
</tr>
<tr>
<td><code>${var/%texto/novo}</code></td>
<td>Se a string terminar com 'texto', substitui 'texto' por 'novo'</td>
</tr>
</tbody>
</table>
<p><a name="blocos"></a></p>
<h2>5. Blocos e agrupamentos</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Sintaxe</th>
<th>Descrição</th>
<th>Exemplo</th>
</tr>
<tr>
<td align="center"><code>"..."</code></td>
<td>Protege uma string, mas reconhece $, \ e ` como especiais</td>
<td align="center">"abc"</td>
</tr>
<tr>
<td align="center"><code>'...'</code></td>
<td>Protege uma string completamente (nenhum caractere é especial)</td>
<td align="center">'abc'</td>
</tr>
<tr>
<td align="center"><code>$'...'</code></td>
<td>Protege uma string completamente, mas interpreta \n, \t, \a, etc</td>
<td align="center">$'abc\n'</td>
</tr>
<tr>
<td align="center"><code>`...`</code></td>
<td>Executa comandos numa subshell, retornando o resultado</td>
<td align="center">`ls`</td>
</tr>
<tr>
<td align="center"><code>{...}</code></td>
<td>Agrupa comandos em um bloco</td>
<td align="center">{ ls ; }</td>
</tr>
<tr>
<td align="center"><code>(...)</code></td>
<td>Executa comandos numa subshell</td>
<td align="center">( ls )</td>
</tr>
<tr>
<td align="center"><code>$(...)</code></td>
<td>Executa comandos numa subshell, retornando o resultado</td>
<td align="center">$( ls )</td>
</tr>
<tr>
<td align="center"><code>((...))</code></td>
<td>Testa uma operação aritmética, retornando 0 ou 1</td>
<td align="center">((5 &gt; 3))</td>
</tr>
<tr>
<td align="center"><code>$((...))</code></td>
<td>Retorna o resultado de uma operação aritmética</td>
<td align="center">$((5+3))</td>
</tr>
<tr>
<td align="center"><code>[...]</code></td>
<td>Testa uma expressão, retornando 0 ou 1 (alias do comando 'test')</td>
<td align="center">[ 5 -gt 3 ]</td>
</tr>
<tr>
<td align="center"><code><span style='color:red;'><span style='color:red;'>[[...]]</span></span></code></td>
<td>Testa uma expressão, retornando 0 ou 1 (podendo usar &amp;&amp; e  ||)</td>
<td align="center"><span style='color:red;'><span style='color:red;'>[[ 5 &gt; 3 ]]</span></span></td>
</tr>
</tbody>
</table>
<p><a name="ifwhilefor"></a></p>
<h2>6. if, for, select, while, until, case</h2>
<table>
<tbody>
<tr>
<th>if</th>
<th>for / select</th>
<th>while / until</th>
<th>case</th>
</tr>
<tr>
<td>
<pre>if COMANDO
then
   ...
elif COMANDO
then
   ...
else
   ...
fi
</pre>
</td>
<td>
<pre>for VAR in LISTA
do
    ...
done

ou:

for ((exp1;exp2;exp3))
</pre>
</td>
<td>
<pre>while COMANDO
do
    ...
done
</pre>
</td>
<td>
<pre>case $VAR in
    txt1) ... ;;
    txt2) ... ;;
    txtN) ... ;;
    *)    ... ;;
esac
</pre>
</td>
</tr>
</tbody>
</table>
<p><a name="test"></a></p>
<h2>7. Opções do comando test ou [</h2>
<table border="1" align="center">
<tbody>
<tr>
<th colspan="2">Comparação Numérica</th>
</tr>
<tr>
<td align="center"><code>-lt</code></td>
<td>É menor que   (LessThan)</td>
</tr>
<tr>
<td align="center"><code>-gt</code></td>
<td>É maior que   (GreaterThan)</td>
</tr>
<tr>
<td align="center"><code>-le</code></td>
<td>É menor igual (LessEqual)</td>
</tr>
<tr>
<td align="center"><code>-ge</code></td>
<td>É maior igual (GreaterEqual)</td>
</tr>
<tr>
<td align="center"><code>-eq</code></td>
<td>É igual       (EQual)</td>
</tr>
<tr>
<td align="center"><code>-ne</code></td>
<td>É diferente   (NotEqual)</td>
</tr>
<tr>
<th colspan="2">Comparação de Strings</th>
</tr>
<tr>
<td align="center"><code>=</code></td>
<td>É igual</td>
</tr>
<tr>
<td align="center"><code>!=</code></td>
<td>É diferente</td>
</tr>
<tr>
<td align="center"><code>-n</code></td>
<td>É não nula</td>
</tr>
<tr>
<td align="center"><code>-z</code></td>
<td>É nula</td>
</tr>
<tr>
<th colspan="2">Operadores Lógicos</th>
</tr>
<tr>
<td align="center"><code>!</code></td>
<td>NÃO lógico (NOT)</td>
</tr>
<tr>
<td align="center"><code>-a</code></td>
<td>E lógico (AND)</td>
</tr>
<tr>
<td align="center"><code>-o</code></td>
<td>OU lógico (OR)</td>
</tr>
<tr>
<th colspan="2">Testes em arquivos</th>
</tr>
<tr>
<td align="center"><code>-b</code></td>
<td>É um dispositivo de bloco</td>
</tr>
<tr>
<td align="center"><code>-c</code></td>
<td>É um dispositivo de caractere</td>
</tr>
<tr>
<td align="center"><code>-d</code></td>
<td>É um diretório</td>
</tr>
<tr>
<td align="center"><code>-e</code></td>
<td>O arquivo existe</td>
</tr>
<tr>
<td align="center"><code>-f</code></td>
<td>É um arquivo normal</td>
</tr>
<tr>
<td align="center"><code>-g</code></td>
<td>O bit SGID está ativado</td>
</tr>
<tr>
<td align="center"><code>-G</code></td>
<td>O grupo do arquivo é o do usuário atual</td>
</tr>
<tr>
<td align="center"><code>-k</code></td>
<td>O sticky-bit está ativado</td>
</tr>
<tr>
<td align="center"><code>-L</code></td>
<td>O arquivo é um link simbólico</td>
</tr>
<tr>
<td align="center"><code>-O</code></td>
<td>O dono do arquivo é o usuário atual</td>
</tr>
<tr>
<td align="center"><code>-p</code></td>
<td>O arquivo é um named pipe</td>
</tr>
<tr>
<td align="center"><code>-r</code></td>
<td>O arquivo tem permissão de leitura</td>
</tr>
<tr>
<td align="center"><code>-s</code></td>
<td>O tamanho do arquivo é maior que zero</td>
</tr>
<tr>
<td align="center"><code>-S</code></td>
<td>O arquivo é um socket</td>
</tr>
<tr>
<td align="center"><code>-t</code></td>
<td>O descritor de arquivos N é um terminal</td>
</tr>
<tr>
<td align="center"><code>-u</code></td>
<td>O bit SUID está ativado</td>
</tr>
<tr>
<td align="center"><code>-w</code></td>
<td>O arquivo tem permissão de escrita</td>
</tr>
<tr>
<td align="center"><code>-x</code></td>
<td>O arquivo tem permissão de execução</td>
</tr>
<tr>
<td align="center"><code>-nt</code></td>
<td>O arquivo é mais recente (NewerThan)</td>
</tr>
<tr>
<td align="center"><code>-ot</code></td>
<td>O arquivo é mais antigo (OlderThan)</td>
</tr>
<tr>
<td align="center"><code>-ef</code></td>
<td>O arquivo é o mesmo (EqualFile)</td>
</tr>
</tbody>
</table>
<p><a name="prompt"></a></p>
<h2>8. Escapes especiais para usar no prompt (PS1)</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Escape</th>
<th>Lembrete</th>
<th>Expande para...</th>
</tr>
<tr>
<td align="center">\a</td>
<td><em>Alerta</em></td>
<td>Alerta (bipe)</td>
</tr>
<tr>
<td align="center">\d</td>
<td><em>Data</em></td>
<td>Data no formato "Dia-da-semana Mês Dia" (Sat Jan 15)</td>
</tr>
<tr>
<td align="center">\e</td>
<td><em>Escape</em></td>
<td>Caractere Esc</td>
</tr>
<tr>
<td align="center">\h</td>
<td><em>Hostname</em></td>
<td>Nome da máquina sem o domínio (dhcp11)</td>
</tr>
<tr>
<td align="center">\H</td>
<td><em>Hostname</em></td>
<td>Nome completo da máquina (dhcp11.empresa)</td>
</tr>
<tr>
<td align="center">\j</td>
<td><em>Jobs</em></td>
<td>Número de jobs ativos</td>
</tr>
<tr>
<td align="center">\l</td>
<td><em>Tty</em></td>
<td>Nome do terminal corrente (ttyp1)</td>
</tr>
<tr>
<td align="center">\n</td>
<td><em>Newline</em></td>
<td>Linha nova</td>
</tr>
<tr>
<td align="center">\r</td>
<td><em>Return</em></td>
<td>Retorno de carro</td>
</tr>
<tr>
<td align="center">\s</td>
<td><em>Shell</em></td>
<td>Nome do shell (basename $0)</td>
</tr>
<tr>
<td align="center">\t</td>
<td><em>Time</em></td>
<td>Horário no formato 24 horas HH:MM:SS</td>
</tr>
<tr>
<td align="center">\T</td>
<td><em>Time</em></td>
<td>Horário no formato 12 horas HH:MM:SS</td>
</tr>
<tr>
<td align="center">\@</td>
<td><em>At</em></td>
<td>Horário no formato 12 horas HH:MM am/pm</td>
</tr>
<tr>
<td align="center">\A</td>
<td><em>At</em></td>
<td>Horário no formato 24 horas HH:MM</td>
</tr>
<tr>
<td align="center">\u</td>
<td><em>Usuário</em></td>
<td>Login do usuário corrente</td>
</tr>
<tr>
<td align="center">\v</td>
<td><em>Versão</em></td>
<td>Versão do Bash (2.00)</td>
</tr>
<tr>
<td align="center">\V</td>
<td><em>Versão</em></td>
<td>Versão+subversão do Bash (2.00.0)</td>
</tr>
<tr>
<td align="center">\w</td>
<td><em>Working Dir</em></td>
<td>Diretório corrente, caminho completo ($PWD)</td>
</tr>
<tr>
<td align="center">\W</td>
<td><em>Working Dir</em></td>
<td>Diretório corrente, somente o último (basename $PWD)</td>
</tr>
<tr>
<td align="center">\!</td>
<td><em>Histórico</em></td>
<td>Número do comando corrente no histórico</td>
</tr>
<tr>
<td align="center">\#</td>
<td><em>Número</em></td>
<td>Número do comando corrente</td>
</tr>
<tr>
<td align="center">\$</td>
<td><em>ID</em></td>
<td>Mostra "#" se for root, "$" se for usuário normal</td>
</tr>
<tr>
<td align="center">\nnn</td>
<td><em>Octal</em></td>
<td>Caractere cujo octal é nnn</td>
</tr>
<tr>
<td align="center">\\</td>
<td><em>Backslash</em></td>
<td>Barra invertida \ literal</td>
</tr>
<tr>
<td align="center">\[</td>
<td><em>Escapes</em></td>
<td>Inicia uma seqüência de escapes (tipo códigos de cores)</td>
</tr>
<tr>
<td align="center">\]</td>
<td><em>Escapes</em></td>
<td>Termina uma seqüência de escapes</td>
</tr>
</tbody>
</table>
<p><a name="echo"></a></p>
<h2>9. Escapes reconhecidos pelo comando echo</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Escape</th>
<th>Lembrete</th>
<th>Descrição</th>
</tr>
<tr>
<td align="center">\a</td>
<td><em>Alerta</em></td>
<td>Alerta (bipe)</td>
</tr>
<tr>
<td align="center">\b</td>
<td><em>Backspace</em></td>
<td>Caractere Backspace</td>
</tr>
<tr>
<td align="center">\c</td>
<td><em>EOS</em></td>
<td>Termina a string</td>
</tr>
<tr>
<td align="center">\e</td>
<td><em>Escape</em></td>
<td>Caractere Esc</td>
</tr>
<tr>
<td align="center">\f</td>
<td><em>Form feed</em></td>
<td>Alimentação</td>
</tr>
<tr>
<td align="center">\n</td>
<td><em>Newline</em></td>
<td>Linha nova</td>
</tr>
<tr>
<td align="center">\r</td>
<td><em>Return</em></td>
<td>Retorno de carro</td>
</tr>
<tr>
<td align="center">\t</td>
<td><em>Tab</em></td>
<td>Tabulação horizontal</td>
</tr>
<tr>
<td align="center">\v</td>
<td><em>Vtab</em></td>
<td>Tabulação vertical</td>
</tr>
<tr>
<td align="center">\\</td>
<td><em>Backslash</em></td>
<td>Barra invertida \ literal</td>
</tr>
<tr>
<td align="center">\nnn</td>
<td><em>Octal</em></td>
<td>Caractere cujo octal é nnn</td>
</tr>
<tr>
<td align="center">\xnn</td>
<td><em>Hexa</em></td>
<td>Caractere cujo hexadecimal é nn</td>
</tr>
</tbody>
</table>
<p><a name="date"></a></p>
<h2>10. Formatadores do comando date</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Formato</th>
<th>Descrição</th>
</tr>
<tr>
<td align="center"><code>%a</code></td>
<td>Nome do dia da semana abreviado (Dom..Sáb)</td>
</tr>
<tr>
<td align="center"><code>%A</code></td>
<td>Nome do dia da semana (Domingo..Sábado)</td>
</tr>
<tr>
<td align="center"><code>%b</code></td>
<td>Nome do mês abreviado (Jan..Dez)</td>
</tr>
<tr>
<td align="center"><code>%B</code></td>
<td>Nome do mês (Janeiro..Dezembro)</td>
</tr>
<tr>
<td align="center"><code>%c</code></td>
<td>Data completa (Sat Nov 04 12:02:33 EST 1989)</td>
</tr>
<tr>
<td align="center"><code>%y</code></td>
<td>Ano (dois dígitos)</td>
</tr>
<tr>
<td align="center"><code>%Y</code></td>
<td>Ano (quatro dígitos)</td>
</tr>
<tr>
<td align="center"><code>%m</code></td>
<td>Mês (01..12)</td>
</tr>
<tr>
<td align="center"><code>%d</code></td>
<td>Dia (01..31)</td>
</tr>
<tr>
<td align="center"><code>%j</code></td>
<td>Dia do ano (001..366)</td>
</tr>
<tr>
<td align="center"><code>%H</code></td>
<td>Horas (00..23)</td>
</tr>
<tr>
<td align="center"><code>%M</code></td>
<td>Minutos (00..59)</td>
</tr>
<tr>
<td align="center"><code>%S</code></td>
<td>Segundos (00..60)</td>
</tr>
<tr>
<td align="center"><code>%s</code></td>
<td>Segundos desde 1º de Janeiro de 1970</td>
</tr>
<tr>
<td align="center"><code>%%</code></td>
<td>Um % literal</td>
</tr>
<tr>
<td align="center"><code>%t</code></td>
<td>Um TAB</td>
</tr>
<tr>
<td align="center"><code>%n</code></td>
<td>Uma quebra de linha</td>
</tr>
</tbody>
</table>
<p><a name="printf"></a></p>
<h2>11. Formatadores do comando printf</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Formato</th>
<th>Descrição</th>
</tr>
<tr>
<td align="center"><code>%d</code></td>
<td>Número decimal</td>
</tr>
<tr>
<td align="center"><code>%o</code></td>
<td>Número octal</td>
</tr>
<tr>
<td align="center"><code>%x</code></td>
<td>Número hexadecimal (a-f)</td>
</tr>
<tr>
<td align="center"><code>%X</code></td>
<td>Número hexadecimal (A-F)</td>
</tr>
<tr>
<td align="center"><code>%f</code></td>
<td>Número com ponto flutuante</td>
</tr>
<tr>
<td align="center"><code>%e</code></td>
<td>Número em notação científica (e+1)</td>
</tr>
<tr>
<td align="center"><code>%E</code></td>
<td>Número em notação científica (E+1)</td>
</tr>
<tr>
<td align="center"><code>%s</code></td>
<td>String</td>
</tr>
</tbody>
</table>
<p><a name="ls"></a></p>
<h2>12. Letras identificadoras de arquivos no comando ls -l</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Letra</th>
<th>Lembrete</th>
<th>Tipos de Arquivo (primeiro caractere)</th>
</tr>
<tr>
<td align="center">-</td>
<td align="center">-</td>
<td>Arquivo normal</td>
</tr>
<tr>
<td align="center">d</td>
<td align="center">Directory</td>
<td>Diretório</td>
</tr>
<tr>
<td align="center">l</td>
<td align="center">Link</td>
<td>Link simbólico</td>
</tr>
<tr>
<td align="center">b</td>
<td align="center">Block</td>
<td>Dispositivo de blocos (HD)</td>
</tr>
<tr>
<td align="center">c</td>
<td align="center">Char</td>
<td>Dispositivo de caracteres (modem serial)</td>
</tr>
<tr>
<td align="center">s</td>
<td align="center">Socket</td>
<td>Socket mapeado em arquivo (comunicação de processos)</td>
</tr>
<tr>
<td align="center">p</td>
<td align="center">Pipe</td>
<td>FIFO ou Named Pipe (comunicação de processos)</td>
</tr>
<tr>
<th>Letra</th>
<th>Lembrete</th>
<th>Permissões do Arquivo (próximos nove caracteres)</th>
</tr>
<tr>
<td align="center">-</td>
<td align="center">-</td>
<td>Permissão desativada</td>
</tr>
<tr>
<td align="center">r</td>
<td align="center">Read</td>
<td>Acesso de leitura</td>
</tr>
<tr>
<td align="center">w</td>
<td align="center">Write</td>
<td>Acesso de escrita</td>
</tr>
<tr>
<td align="center">x</td>
<td align="center">eXecute</td>
<td>Acesso de execução (ou acesso ao diretório)</td>
</tr>
<tr>
<td align="center">X</td>
<td align="center">eXecute</td>
<td>Acesso ao diretório somente</td>
</tr>
<tr>
<td align="center">s</td>
<td align="center">Set ID</td>
<td>Usuário/grupo para execução (SUID, SGID) - permissão 'x' ativada</td>
</tr>
<tr>
<td align="center">S</td>
<td align="center">Set ID</td>
<td>Usuário/grupo para execução (SUID, SGID) - permissão 'x' desativada</td>
</tr>
<tr>
<td align="center">t</td>
<td align="center">sTicky</td>
<td>Usuários só apagam seus próprios arquivos - permissão 'x' ativada</td>
</tr>
<tr>
<td align="center">T</td>
<td align="center">sTicky</td>
<td>Usuários só apagam seus próprios arquivos - permissão 'x' desativada</td>
</tr>
</tbody>
</table>
<p><a name="glob"></a></p>
<h2>13. Curingas para nomes de arquivo (glob)</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Curinga</th>
<th>Casa com...</th>
<th>Exemplo</th>
</tr>
<tr>
<td align="center"><code>*</code></td>
<td>Qualquer coisa</td>
<td><code>*.txt</code></td>
</tr>
<tr>
<td align="center"><code>?</code></td>
<td>Um caractere qualquer</td>
<td><code>arquivo-??.zip</code></td>
</tr>
<tr>
<td align="center"><code>[...]</code></td>
<td>Qualquer um dos caracteres listados</td>
<td><code>[Aa]rquivo.txt</code></td>
</tr>
<tr>
<td align="center"><code>[^...]</code></td>
<td>Qualquer um caractere, exceto os listados</td>
<td><code>[^A-Z]*.txt</code></td>
</tr>
<tr>
<td align="center"><code>{...}</code></td>
<td>Qualquer um dos textos separados por vírgula</td>
<td><code>arquivo.{txt,html}</code></td>
</tr>
</tbody>
</table>
<p><a name="case"></a></p>
<h2>14. Curingas para os itens do comando case</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Curinga</th>
<th>Casa com...</th>
<th>Exemplo</th>
</tr>
<tr>
<td align="center"><code>*</code></td>
<td>Qualquer coisa</td>
<td align="right"><code>*.txt) echo ;;</code></td>
</tr>
<tr>
<td align="center"><code>?</code></td>
<td>Um caractere qualquer</td>
<td align="right"><code>arquivo-??.zip) echo ;;</code></td>
</tr>
<tr>
<td align="center"><code>[...]</code></td>
<td>Qualquer um dos caracteres listados</td>
<td align="right"><code>[0-9]) echo ;;</code></td>
</tr>
<tr>
<td align="center"><code>[^...]</code></td>
<td>Qualquer um caractere, exceto os listados</td>
<td align="right"><code>[^0-9]) echo ;;</code></td>
</tr>
<tr>
<td align="center"><code>...|...</code></td>
<td>Qualquer um dos textos separados por |</td>
<td align="right"><code>txt|html) echo ;;</code></td>
</tr>
</tbody>
</table>
<p><a name="sinais"></a></p>
<h2>15. Sinais para usar com trap/kill/killall</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>#</th>
<th>Linux</th>
<th>Cygwin</th>
<th>SystemV</th>
<th>AIX</th>
<th>HP-UX</th>
<th>Solaris</th>
<th>BSD/Mac</th>
</tr>
<tr>
<td align="right">1</td>
<td>HUP</td>
<td>HUP</td>
<td>HUP</td>
<td>HUP</td>
<td>HUP</td>
<td>HUP</td>
<td>HUP</td>
</tr>
<tr>
<td align="right">2</td>
<td>INT</td>
<td>INT</td>
<td>INT</td>
<td>INT</td>
<td>INT</td>
<td>INT</td>
<td>INT</td>
</tr>
<tr>
<td align="right">3</td>
<td>QUIT</td>
<td>QUIT</td>
<td>QUIT</td>
<td>QUIT</td>
<td>QUIT</td>
<td>QUIT</td>
<td>QUIT</td>
</tr>
<tr>
<td align="right">4</td>
<td>ILL</td>
<td>ILL</td>
<td>ILL</td>
<td>ILL</td>
<td>ILL</td>
<td>ILL</td>
<td>ILL</td>
</tr>
<tr>
<td align="right">5</td>
<td>TRAP</td>
<td>TRAP</td>
<td>TRAP</td>
<td>TRAP</td>
<td>TRAP</td>
<td>TRAP</td>
<td>TRAP</td>
</tr>
<tr>
<td align="right">6</td>
<td>ABRT</td>
<td>ABRT</td>
<td>IOT</td>
<td>LOST</td>
<td>ABRT</td>
<td>ABRT</td>
<td>ABRT</td>
</tr>
<tr>
<td align="right">7</td>
<td>BUS</td>
<td>EMT</td>
<td>EMT</td>
<td>EMT</td>
<td>EMT</td>
<td>EMT</td>
<td>EMT</td>
</tr>
<tr>
<td align="right">8</td>
<td>FPE</td>
<td>FPE</td>
<td>FPE</td>
<td>FPE</td>
<td>FPE</td>
<td>FPE</td>
<td>FPE</td>
</tr>
<tr>
<td align="right">9</td>
<td>KILL</td>
<td>KILL</td>
<td>KILL</td>
<td>KILL</td>
<td>KILL</td>
<td>KILL</td>
<td>KILL</td>
</tr>
<tr>
<td>10</td>
<td>USR1</td>
<td>BUS</td>
<td>BUS</td>
<td>BUS</td>
<td>BUS</td>
<td>BUS</td>
<td>BUS</td>
</tr>
<tr>
<td>11</td>
<td>SEGV</td>
<td>SEGV</td>
<td>SEGV</td>
<td>SEGV</td>
<td>SEGV</td>
<td>SEGV</td>
<td>SEGV</td>
</tr>
<tr>
<td>12</td>
<td>USR2</td>
<td>SYS</td>
<td>SYS</td>
<td>SYS</td>
<td>SYS</td>
<td>SYS</td>
<td>SYS</td>
</tr>
<tr>
<th>#</th>
<th>Linux</th>
<th>Cygwin</th>
<th>SystemV</th>
<th>AIX</th>
<th>HP-UX</th>
<th>Solaris</th>
<th>BSD/Mac</th>
</tr>
<tr>
<td>13</td>
<td>PIPE</td>
<td>PIPE</td>
<td>PIPE</td>
<td>PIPE</td>
<td>PIPE</td>
<td>PIPE</td>
<td>PIPE</td>
</tr>
<tr>
<td>14</td>
<td>ALRM</td>
<td>ALRM</td>
<td>ALRM</td>
<td>ALRM</td>
<td>ALRM</td>
<td>ALRM</td>
<td>ALRM</td>
</tr>
<tr>
<td>15</td>
<td>TERM</td>
<td>TERM</td>
<td>TERM</td>
<td>TERM</td>
<td>TERM</td>
<td>TERM</td>
<td>TERM</td>
</tr>
<tr>
<td>16</td>
<td>-</td>
<td>URG</td>
<td>USR1</td>
<td>URG</td>
<td>USR1</td>
<td>USR1</td>
<td>URG</td>
</tr>
<tr>
<td>17</td>
<td>CHLD</td>
<td>STOP</td>
<td>USR2</td>
<td>STOP</td>
<td>USR2</td>
<td>USR2</td>
<td>STOP</td>
</tr>
<tr>
<td>18</td>
<td>CONT</td>
<td>TSTP</td>
<td>CHLD</td>
<td>TSTP</td>
<td>CHLD</td>
<td>CHLD</td>
<td>TSTP</td>
</tr>
<tr>
<td>19</td>
<td>STOP</td>
<td>CONT</td>
<td>PWR</td>
<td>CONT</td>
<td>PWR</td>
<td>PWR</td>
<td>CONT</td>
</tr>
<tr>
<td>20</td>
<td>TSTP</td>
<td>CHLD</td>
<td>WINCH</td>
<td>CHLD</td>
<td>VTALRM</td>
<td>WINCH</td>
<td>CHLD</td>
</tr>
<tr>
<td>21</td>
<td>TTIN</td>
<td>TTIN</td>
<td>URG</td>
<td>TTIN</td>
<td>PROF</td>
<td>URG</td>
<td>TTIN</td>
</tr>
<tr>
<td>22</td>
<td>TTOU</td>
<td>TTOU</td>
<td>IO</td>
<td>TTOU</td>
<td>IO</td>
<td>IO</td>
<td>TTOU</td>
</tr>
<tr>
<td>23</td>
<td>URG</td>
<td>IO</td>
<td>STOP</td>
<td>IO</td>
<td>WINCH</td>
<td>STOP</td>
<td>IO</td>
</tr>
<tr>
<td>24</td>
<td>XCPU</td>
<td>XCPU</td>
<td>TSTP</td>
<td>XCPU</td>
<td>STOP</td>
<td>TSTP</td>
<td>XCPU</td>
</tr>
<tr>
<th>#</th>
<th>Linux</th>
<th>Cygwin</th>
<th>SystemV</th>
<th>AIX</th>
<th>HP-UX</th>
<th>Solaris</th>
<th>BSD/Mac</th>
</tr>
<tr>
<td>25</td>
<td>XFSZ</td>
<td>XFSZ</td>
<td>CONT</td>
<td>XFSZ</td>
<td>TSTP</td>
<td>CONT</td>
<td>XFSZ</td>
</tr>
<tr>
<td>26</td>
<td>VTALRM</td>
<td>VTALRM</td>
<td>TTIN</td>
<td>-</td>
<td>CONT</td>
<td>TTIN</td>
<td>VTALRM</td>
</tr>
<tr>
<td>27</td>
<td>PROF</td>
<td>PROF</td>
<td>TTOU</td>
<td>MSG</td>
<td>TTIN</td>
<td>TTOU</td>
<td>PROF</td>
</tr>
<tr>
<td>28</td>
<td>WINCH</td>
<td>WINCH</td>
<td>VTALRM</td>
<td>WINCH</td>
<td>TTOU</td>
<td>VTALRM</td>
<td>WINCH</td>
</tr>
<tr>
<td>29</td>
<td>IO</td>
<td>LOST</td>
<td>PROF</td>
<td>PWR</td>
<td>URG</td>
<td>PROF</td>
<td>INFO</td>
</tr>
<tr>
<td>30</td>
<td>PWR</td>
<td>USR1</td>
<td>XCPU</td>
<td>USR1</td>
<td>LOST</td>
<td>XCPU</td>
<td>USR1</td>
</tr>
<tr>
<td>31</td>
<td>SYS</td>
<td>USR2</td>
<td>XFSZ</td>
<td>USR2</td>
<td>-</td>
<td>XFSZ</td>
<td>USR2</td>
</tr>
<tr>
<td>32</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>PROF</td>
<td>-</td>
<td>WAITING</td>
<td>-</td>
</tr>
<tr>
<td>33</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>DANGER</td>
<td>-</td>
<td>LWP</td>
<td>-</td>
</tr>
<tr>
<td>34</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>VTALRM</td>
<td>-</td>
<td>FREEZE</td>
<td>-</td>
</tr>
<tr>
<td>35</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>MIGRATE</td>
<td>-</td>
<td>THAW</td>
<td>-</td>
</tr>
<tr>
<td>36</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>PRE</td>
<td>-</td>
<td>CANCEL</td>
<td>-</td>
</tr>
<tr>
<td>37</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>LOST</td>
<td>-</td>
</tr>
</tbody>
</table>
<p>Como obter a listagem: trap -l, kill -l ou killall -l<br />
Veja também: <a href="http://unixhelp.ed.ac.uk/CGI/man-cgi?signal+7">man  7 signal</a></p>
<p><a name="exitcode"></a></p>
<h2>16. Códigos de retorno de comandos</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Código</th>
<th>Significado</th>
<th>Exemplo</th>
</tr>
<tr>
<td align="center">0</td>
<td>Nenhum erro, execução terminou OK</td>
<td>echo</td>
</tr>
<tr>
<td align="center">1</td>
<td>A maioria dos erros comuns na execução</td>
<td>echo $((1/0))</td>
</tr>
<tr>
<td align="center">2</td>
<td>Erro de uso em algum 'builtin' do Shell</td>
<td>-</td>
</tr>
<tr>
<td align="center">126</td>
<td>Comando não executável (sem permissão)</td>
<td>touch a ; ./a</td>
</tr>
<tr>
<td align="center">127</td>
<td>Comando não encontrado ("command not found")</td>
<td>echooo</td>
</tr>
<tr>
<td align="center">128</td>
<td>O parâmetro para o 'exit' não é um decimal</td>
<td>exit 1.0</td>
</tr>
<tr>
<td align="center">128+n</td>
<td>128 + código do sinal que o matou</td>
<td>kill -9 $PPID #exit 137</td>
</tr>
<tr>
<td align="center">130</td>
<td>O programa interrompido com o Ctrl+C (128 + 2)</td>
<td>-</td>
</tr>
<tr>
<td align="center">255</td>
<td>Parâmetro para o 'exit' não está entre 0 e 255</td>
<td>exit -1</td>
</tr>
</tbody>
</table>
<p><a name="cores"></a></p>
<h2>17. Códigos de cores (ANSI)</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Cor</th>
<th>Letra</th>
<th>Fundo</th>
</tr>
<tr>
<td>Preto</td>
<td align="center">30</td>
<td align="center">40</td>
</tr>
<tr>
<td>Vermelho</td>
<td align="center">31</td>
<td align="center">41</td>
</tr>
<tr>
<td>Verde</td>
<td align="center">32</td>
<td align="center">42</td>
</tr>
<tr>
<td>Amarelo</td>
<td align="center">33</td>
<td align="center">43</td>
</tr>
<tr>
<td>Azul</td>
<td align="center">34</td>
<td align="center">44</td>
</tr>
<tr>
<td>Rosa</td>
<td align="center">35</td>
<td align="center">45</td>
</tr>
<tr>
<td>Ciano</td>
<td align="center">36</td>
<td align="center">46</td>
</tr>
<tr>
<td>Branco</td>
<td align="center">37</td>
<td align="center">47</td>
</tr>
<tr>
<th colspan="2">Atributo</th>
<th>Valor</th>
</tr>
<tr>
<td colspan="2">Reset</td>
<td align="center">0</td>
</tr>
<tr>
<td colspan="2">Negrito</td>
<td align="center">1</td>
</tr>
<tr>
<td colspan="2">Sublinhado</td>
<td align="center">4</td>
</tr>
<tr>
<td colspan="2">Piscando</td>
<td align="center">5</td>
</tr>
<tr>
<td colspan="2">Reverso</td>
<td align="center">7</td>
</tr>
<tr>
<th colspan="3">Exemplos: ESC [ &lt;N&gt;;&lt;N&gt; m</th>
</tr>
<tr>
<td colspan="2">Texto normal (desliga cores)</td>
<td align="center"><code>ESC[m</code></td>
</tr>
<tr>
<td colspan="2">Negrito</td>
<td align="center"><code>ESC[1m</code></td>
</tr>
<tr>
<td colspan="2">Amarelo</td>
<td align="center"><code>ESC[33;1m</code></td>
</tr>
<tr>
<td colspan="2">Fundo azul, letra cinza</td>
<td align="center"><code>ESC[44;37m</code></td>
</tr>
<tr>
<td colspan="2">Vermelho piscando</td>
<td align="center"><code>ESC[31;5m</code></td>
</tr>
<tr>
<th colspan="3">Na linha de comando</th>
</tr>
<tr>
<td colspan="3"><code>echo -e '\e[33;1m amarelo \e[m'</code></td>
</tr>
<tr>
<td colspan="3"><code>echo -e '\033[33;1m amarelo \033[m'</code></td>
</tr>
</tbody>
</table>
<p><img src="http://aurelio.net/shell/zzcores.gif" border="0" alt="" align="middle" /></p>
<p><a name="metacaracteres"></a></p>
<h2>18. Os metacaracteres das expressões regulares</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Meta</th>
<th>Nome</th>
<th>Descrição</th>
</tr>
<tr>
<td align="center">.</td>
<td>Ponto</td>
<td>Curinga de um caractere</td>
</tr>
<tr>
<td align="center">[]</td>
<td>Lista</td>
<td>Casa qualquer um dos caracteres listados</td>
</tr>
<tr>
<td align="center">[^]</td>
<td>Lista negada</td>
<td>Casa qualquer caractere, exceto os listados</td>
</tr>
<tr>
<td align="center">?</td>
<td>Opcional</td>
<td>A entidade anterior pode aparecer ou não (opcional)</td>
</tr>
<tr>
<td align="center">*</td>
<td>Asterisco</td>
<td>A entidade anterior pode aparecer em qualquer quantidade</td>
</tr>
<tr>
<td align="center">+</td>
<td>Mais</td>
<td>A entidade anterior deve aparecer no mínimo uma vez</td>
</tr>
<tr>
<td align="center">{,}</td>
<td>Chaves</td>
<td>A entidade anterior deve aparecer na quantidade indicada</td>
</tr>
<tr>
<td align="center">^</td>
<td>Circunflexo</td>
<td>Casa o começo da linha</td>
</tr>
<tr>
<td align="center">$</td>
<td>Cifrão</td>
<td>Casa o fim da linha</td>
</tr>
<tr>
<td align="center">\b</td>
<td>Borda</td>
<td>Limita uma palavra (letras, números e sublinhado)</td>
</tr>
<tr>
<td align="center">\</td>
<td>Escape</td>
<td>Escapa um meta, tirando seu poder</td>
</tr>
<tr>
<td align="center">|</td>
<td>Ou</td>
<td>Indica alternativas (usar com o grupo)</td>
</tr>
<tr>
<td align="center">()</td>
<td>Grupo</td>
<td>Agrupa partes da expressão, é quantificável e multinível</td>
</tr>
<tr>
<td align="center">\1</td>
<td>Retrovisor</td>
<td>Recupera o conteúdo do grupo 1</td>
</tr>
<tr>
<td align="center">\2</td>
<td>Retrovisor</td>
<td>Recupera o conteúdo do grupo 2 (segue até o \9)</td>
</tr>
<tr>
<td align="center">.*</td>
<td>Curinga</td>
<td>Casa qualquer coisa, é o tudo e o nada</td>
</tr>
<tr>
<td align="center">??</td>
<td>Opcional NG</td>
<td>Idem ao opcional comum, mas casa o mínimo possível</td>
</tr>
<tr>
<td align="center">*?</td>
<td>Asterisco NG</td>
<td>Idem ao asterisco comum, mas casa o mínimo possível</td>
</tr>
<tr>
<td align="center">+?</td>
<td>Mais NG</td>
<td>Idem ao mais comum, mas casa o mínimo possível</td>
</tr>
<tr>
<td align="center">{}?</td>
<td>Chaves NG</td>
<td>Idem às chaves comuns, mas casa o mínimo possível</td>
</tr>
</tbody>
</table>
<p><a name="metadif"></a></p>
<h2>19. Metacaracteres que são diferentes nos aplicativos</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Programa</th>
<th>Opc</th>
<th>Mais</th>
<th>Chaves</th>
<th>Borda</th>
<th>Ou</th>
<th>Grupo</th>
</tr>
<tr>
<td>awk</td>
<td align="center">?</td>
<td align="center">+</td>
<td align="center">-</td>
<td align="center">-</td>
<td align="center">|</td>
<td align="center">()</td>
</tr>
<tr>
<td>ed</td>
<td align="center">\?</td>
<td align="center">\+</td>
<td align="center">\{,\}</td>
<td align="center">\b</td>
<td align="center">\|</td>
<td align="center">\(\)</td>
</tr>
<tr>
<td>egrep</td>
<td align="center">?</td>
<td align="center">+</td>
<td align="center">{,}</td>
<td align="center">\b</td>
<td align="center">|</td>
<td align="center">()</td>
</tr>
<tr>
<td>emacs</td>
<td align="center">?</td>
<td align="center">+</td>
<td align="center">-</td>
<td align="center">\b</td>
<td align="center">\|</td>
<td align="center">\(\)</td>
</tr>
<tr>
<td>expect</td>
<td align="center">?</td>
<td align="center">+</td>
<td align="center">-</td>
<td align="center">-</td>
<td align="center">|</td>
<td align="center">()</td>
</tr>
<tr>
<td>find</td>
<td align="center">?</td>
<td align="center">+</td>
<td align="center">-</td>
<td align="center">\b</td>
<td align="center">\|</td>
<td align="center">\(\)</td>
</tr>
<tr>
<td>gawk</td>
<td align="center">?</td>
<td align="center">+</td>
<td align="center">{,}</td>
<td align="center">\&lt;\&gt;</td>
<td align="center">|</td>
<td align="center">()</td>
</tr>
<tr>
<td>grep</td>
<td align="center">\?</td>
<td align="center">\+</td>
<td align="center">\{,\}</td>
<td align="center">\b</td>
<td align="center">\|</td>
<td align="center">\(\)</td>
</tr>
<tr>
<td>mawk</td>
<td align="center">?</td>
<td align="center">+</td>
<td align="center">-</td>
<td align="center">-</td>
<td align="center">|</td>
<td align="center">()</td>
</tr>
<tr>
<td>perl</td>
<td align="center">?</td>
<td align="center">+</td>
<td align="center">{,}</td>
<td align="center">\b</td>
<td align="center">|</td>
<td align="center">()</td>
</tr>
<tr>
<td>php</td>
<td align="center">?</td>
<td align="center">+</td>
<td align="center">{,}</td>
<td align="center">\b</td>
<td align="center">|</td>
<td align="center">()</td>
</tr>
<tr>
<td>python</td>
<td align="center">?</td>
<td align="center">+</td>
<td align="center">{,}</td>
<td align="center">\b</td>
<td align="center">|</td>
<td align="center">()</td>
</tr>
<tr>
<td>sed</td>
<td align="center">\?</td>
<td align="center">\+</td>
<td align="center">\{,\}</td>
<td align="center">\&lt;\&gt;</td>
<td align="center">\|</td>
<td align="center">\(\)</td>
</tr>
<tr>
<td>vim</td>
<td align="center">\=</td>
<td align="center">\+</td>
<td align="center">\{,}</td>
<td align="center">\&lt;\&gt;</td>
<td align="center">\|</td>
<td align="center">\(\)</td>
</tr>
</tbody>
</table>
<p><a name="ascii"></a></p>
<h2>20. Caracteres ASCII imprimíveis (ISO-8859-1) - texto</h2>
<pre>$ <a href="http://funcoeszz.net/">zzascii</a>
32        64  @     96  `    162  ¢    194  Â    226  â
33  !     65  A     97  a    163  £    195  Ã    227  ã
34  "     66  B     98  b    164  ¤    196  Ä    228  ä
35  #     67  C     99  c    165  ¥    197  Å    229  å
36  $     68  D    100  d    166  ¦    198  Æ    230  æ
37  %     69  E    101  e    167  §    199  Ç    231  ç
38  &amp;     70  F    102  f    168  ¨    200  È    232  è
39  '     71  G    103  g    169  ©    201  É    233  é
40  (     72  H    104  h    170  ª    202  Ê    234  ê
41  )     73  I    105  i    171  «    203  Ë    235  ë
42  *     74  J    106  j    172  ¬    204  Ì    236  ì
43  +     75  K    107  k    173       205  Í    237  í
44  ,     76  L    108  l    174  ®    206  Î    238  î
45  -     77  M    109  m    175  ¯    207  Ï    239  ï
46  .     78  N    110  n    176  °    208  Ð    240  ð
47  /     79  O    111  o    177  ±    209  Ñ    241  ñ
48  0     80  P    112  p    178  ²    210  Ò    242  ò
49  1     81  Q    113  q    179  ³    211  Ó    243  ó
50  2     82  R    114  r    180  ´    212  Ô    244  ô
51  3     83  S    115  s    181  µ    213  Õ    245  õ
52  4     84  T    116  t    182  ¶    214  Ö    246  ö
53  5     85  U    117  u    183  ·    215  ×    247  ÷
54  6     86  V    118  v    184  ¸    216  Ø    248  ø
55  7     87  W    119  w    185  ¹    217  Ù    249  ù
56  8     88  X    120  x    186  º    218  Ú    250  ú
57  9     89  Y    121  y    187  »    219  Û    251  û
58  :     90  Z    122  z    188  ¼    220  Ü    252  ü
59  ;     91  [    123  {    189  ½    221  Ý    253  ý
60  &lt;     92  \    124  |    190  ¾    222  Þ    254  þ
61  =     93  ]    125  }    191  ¿    223  ß    255  ÿ
62  &gt;     94  ^    126  ~    192  À    224  à
63  ?     95  _    161  ¡    193  Á    225  á
</pre>
<p><a name="asciiimg"></a></p>
<h2>21. Caracteres ASCII imprimíveis (ISO-8859-1) - imagem</h2>
<p><img src="http://aurelio.net/shell/ascii.gif" border="0" alt="" align="middle" /> <a name="codigos"></a></p>
<h2>22. Códigos prontos para copiar e colar</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Condicionais com o IF</th>
</tr>
<tr>
<td><code>if [ -f "$arquivo" ]; then echo 'Arquivo encontrado'; fi</code></td>
</tr>
<tr>
<td><code>if [ ! -d "$dir" ]; then echo 'Diretório não encontrado'; fi</code></td>
</tr>
<tr>
<td><code>if [ $i -gt 5 ]; then echo 'Maior que 5'; else echo 'Menor que  5'; fi</code></td>
</tr>
<tr>
<td><code>if [ $i -ge 5 -a $i -le 10 ]; then echo 'Entre 5 e 10,  incluindo'; fi</code></td>
</tr>
<tr>
<td><code>if [ $i -eq 5 ]; then echo '=5'; elif [ $i -gt 5 ]; then echo  '&gt;5'; else echo '&lt;5'; fi</code></td>
</tr>
<tr>
<td><code>if [ "$USER" = 'root' ]; then echo 'Oi root'; fi</code></td>
</tr>
<tr>
<td><code>if grep -qs 'root' /etc/passwd; then echo 'Usuário  encontrado'; fi</code></td>
</tr>
<tr>
<th>Condicionais com o E (&amp;&amp;) e OU (||)</th>
</tr>
<tr>
<td><code>[ -f "$arquivo" ] &amp;&amp; echo 'Arquivo encontrado'</code></td>
</tr>
<tr>
<td><code>[ -d "$dir" ] || echo 'Diretório não encontrado'</code></td>
</tr>
<tr>
<td><code>grep -qs 'root' /etc/passwd &amp;&amp; echo 'Usuário  encontrado'</code></td>
</tr>
<tr>
<td><code>cd "$dir" &amp;&amp; rm "$arquivo" &amp;&amp; touch "$arquivo"  &amp;&amp; echo 'feito!'</code></td>
</tr>
<tr>
<td><code>[ "$1" ] &amp;&amp; param=$1 || param='valor padrão'</code></td>
</tr>
<tr>
<td><code>[ "$1" ] &amp;&amp; param=${1:-valor padrão}</code></td>
</tr>
<tr>
<td><code>[ "$1" ] || { echo "Uso: $0 parâmetro" ; exit 1 ; }</code></td>
</tr>
<tr>
<th>Adicionar 1 à variável $i</th>
</tr>
<tr>
<td><code>i=$(expr $i + 1)</code></td>
</tr>
<tr>
<td><code>i=$((i+1))</code></td>
</tr>
<tr>
<td><code>let i=i+1</code></td>
</tr>
<tr>
<td><code>let i+=1</code></td>
</tr>
<tr>
<td><code>let i++</code></td>
</tr>
<tr>
<th>Loop de 1 à 10</th>
</tr>
<tr>
<td><code>for i in 1 2 3 4 5 6 7 8 9 10; do echo $i; done</code></td>
</tr>
<tr>
<td><code>for i in $(seq 10); do echo $i; done</code></td>
</tr>
<tr>
<td><code>for ((i=1;i&lt;=10;i++)); do echo $i; done</code></td>
</tr>
<tr>
<td><code>i=1 ; while [ $i -le 10 ]; do echo $i ; i=$((i+1)) ; done</code></td>
</tr>
<tr>
<td><code>i=1 ; until [ $i -gt 10 ]; do echo $i ; i=$((i+1)) ; done</code></td>
</tr>
<tr>
<th>Loop nas linhas de um arquivo ou saída de comando</th>
</tr>
<tr>
<td><code>cat /etc/passwd | while read LINHA; do echo "$LINHA"; done</code></td>
</tr>
<tr>
<td><code>grep 'root' /etc/passwd | while read LINHA; do echo "$LINHA";  done</code></td>
</tr>
<tr>
<td><code>while read LINHA; do echo "$LINHA"; done &lt; /etc/passwd</code></td>
</tr>
<tr>
<td><code>while read LINHA; do echo "$LINHA"; done &lt; &lt;(grep 'root'  /etc/passwd)</code></td>
</tr>
<tr>
<th>Curingas nos itens do comando case</th>
</tr>
<tr>
<td><code>case "$dir" in /home/*) echo 'dir dentro do /home';; esac</code></td>
</tr>
<tr>
<td><code>case "$user" in root|joao|maria) echo "Oi $user";; *) echo  "Não te conheço";; esac</code></td>
</tr>
<tr>
<td><code>case "$var" in ?) echo '1 letra';; ??) echo '2 letras';; ??*)  echo 'mais de 2';; esac</code></td>
</tr>
<tr>
<td><code>case "$i" in [0-9]) echo '1 dígito';; [0-9][0-9]) echo '2  dígitos';; esac</code></td>
</tr>
<tr>
<th>Caixas do Dialog</th>
</tr>
<tr>
<td><code>dialog --calendar 'abc' 0 0 31 12 1999</code></td>
</tr>
<tr>
<td><code>dialog --checklist 'abc' 0 0 0 item1 'desc1' on item2 'desc2'  off</code></td>
</tr>
<tr>
<td><code>dialog --fselect /tmp 0 0</code></td>
</tr>
<tr>
<td><code>(echo 50; sleep 2; echo 100) | dialog --gauge 'abc' 8 40 0</code></td>
</tr>
<tr>
<td><code>dialog --infobox 'abc' 0 0</code></td>
</tr>
<tr>
<td><code>dialog --inputbox 'abc' 0 0</code></td>
</tr>
<tr>
<td><code>dialog --passwordbox 'abc' 0 0</code></td>
</tr>
<tr>
<td><code>dialog --menu 'abc' 0 0 0 item1 'desc1' item2 'desc2'</code></td>
</tr>
<tr>
<td><code>dialog --msgbox 'abc' 8 40</code></td>
</tr>
<tr>
<td><code>dialog --radiolist 'abc' 0 0 0 item1 'desc1' on item2 'desc2'  off</code></td>
</tr>
<tr>
<td><code>dialog --tailbox /tmp/arquivo.txt 0 0</code></td>
</tr>
<tr>
<td><code>dialog --textbox /tmp/arquivo.txt 0 0</code></td>
</tr>
<tr>
<td><code>dialog --timebox 'abc' 0 0 23 59 00</code></td>
</tr>
<tr>
<td><code>dialog --yesno 'abc' 0 0</code></td>
</tr>
<tr>
<td><strong>Dica1:</strong> <code>dialog ... &amp;&amp; echo 'Apertou OK/Yes' ||  echo 'Apertou Cancel/No'</code></td>
</tr>
<tr>
<td><strong>Dica2:</strong> <code>resposta=$(dialog --stdout --TIPODACAIXA 'abc'  ...)</code></td>
</tr>
</tbody>
</table>
<p><a name="emacs"></a></p>
<h2>23. Atalhos da linha de comando (set -o emacs)</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Atalho</th>
<th>Descrição</th>
<th>Tecla Similar</th>
</tr>
<tr>
<td>Ctrl+A</td>
<td>Move o cursor para o início da linha</td>
<td align="center">Home</td>
</tr>
<tr>
<td>Ctrl+B</td>
<td>Move o cursor uma posição à esquerda</td>
<td align="center">←</td>
</tr>
<tr>
<td>Ctrl+C</td>
<td>Envia sinal EOF() para o sistema</td>
<td></td>
</tr>
<tr>
<td>Ctrl+D</td>
<td>Apaga um caractere à direita</td>
<td align="center">Delete</td>
</tr>
<tr>
<td>Ctrl+E</td>
<td>Move o cursor para o fim da linha</td>
<td align="center">End</td>
</tr>
<tr>
<td>Ctrl+F</td>
<td>Move o cursor uma posição à direita</td>
<td align="center">→</td>
</tr>
<tr>
<td>Ctrl+H</td>
<td>Apaga um caractere à esquerda</td>
<td align="center">Backspace</td>
</tr>
<tr>
<td>Ctrl+I</td>
<td>Completa arquivos e comandos</td>
<td align="center">Tab</td>
</tr>
<tr>
<td>Ctrl+J</td>
<td>Quebra a linha</td>
<td align="center">Enter</td>
</tr>
<tr>
<td>Ctrl+K</td>
<td>Recorta do cursor até o fim da linha</td>
<td></td>
</tr>
<tr>
<td>Ctrl+L</td>
<td>Limpa a tela (igual ao comando clear)</td>
<td></td>
</tr>
<tr>
<td>Ctrl+N</td>
<td>Próximo comando</td>
<td></td>
</tr>
<tr>
<td>Ctrl+P</td>
<td>Comando anterior</td>
<td></td>
</tr>
<tr>
<td>Ctrl+Q</td>
<td>Destrava a shell (veja Ctrl+S)</td>
<td></td>
</tr>
<tr>
<td>Ctrl+R</td>
<td>Procura no histórico de comandos</td>
<td></td>
</tr>
<tr>
<td>Ctrl+S</td>
<td>Trava a shell (veja Ctrl+Q)</td>
<td></td>
</tr>
<tr>
<td>Ctrl+T</td>
<td>Troca dois caracteres de lugar</td>
<td></td>
</tr>
<tr>
<td>Ctrl+U</td>
<td>Recorta a linha inteira</td>
<td></td>
</tr>
<tr>
<td>Ctrl+V</td>
<td>Insere caractere literal</td>
<td></td>
</tr>
<tr>
<td>Ctrl+W</td>
<td>Recorta a palavra à esquerda</td>
<td></td>
</tr>
<tr>
<td>Ctrl+X</td>
<td>Move o cursor para o início/fim da linha (2x)</td>
<td align="center">Home/End</td>
</tr>
<tr>
<td>Ctrl+Y</td>
<td>Cola o trecho recortado</td>
<td></td>
</tr>
</tbody>
</table>
<p><a name="ferramentas"></a></p>
<h2>24. A caixa de ferramentas do shelleiro</h2>
<table border="1" align="center">
<tbody>
<tr>
<th>Comando</th>
<th>Função</th>
<th>Opções úteis</th>
</tr>
<tr>
<td align="center"><strong>cat</strong></td>
<td><em>Mostra arquivo</em></td>
<td>-n, -s</td>
</tr>
<tr>
<td align="center"><strong>cut</strong></td>
<td><em>Extrai campo</em></td>
<td>-d -f, -c</td>
</tr>
<tr>
<td align="center"><strong>date</strong></td>
<td><em>Mostra data</em></td>
<td>-d, +'...'</td>
</tr>
<tr>
<td align="center"><strong>diff</strong></td>
<td><em>Compara arquivos</em></td>
<td>-u, -Nr, -i, -w</td>
</tr>
<tr>
<td align="center"><strong>echo</strong></td>
<td><em>Mostra texto</em></td>
<td>-e, -n</td>
</tr>
<tr>
<td align="center"><strong>find</strong></td>
<td><em>Encontra arquivos</em></td>
<td>-name, -iname, -type f, -exec, -or</td>
</tr>
<tr>
<td align="center"><strong>fmt</strong></td>
<td><em>Formata parágrafo</em></td>
<td>-w, -u</td>
</tr>
<tr>
<td align="center"><strong>grep</strong></td>
<td><em>Encontra texto</em></td>
<td>-i, -v, -r, -qs, -n, -l, -w -x, -A -B -C</td>
</tr>
<tr>
<td align="center"><strong>head</strong></td>
<td><em>Mostra Início</em></td>
<td>-n, -c</td>
</tr>
<tr>
<td align="center"><strong>od</strong></td>
<td><em>Mostra Caracteres</em></td>
<td>-a, -c, -o, -x</td>
</tr>
<tr>
<td align="center"><strong>paste</strong></td>
<td><em>Paraleliza arquivos</em></td>
<td>-d, -s</td>
</tr>
<tr>
<td align="center"><strong>printf</strong></td>
<td><em>Mostra texto</em></td>
<td><em>nenhuma</em></td>
</tr>
<tr>
<td align="center"><strong>rev</strong></td>
<td><em>Inverte texto</em></td>
<td><em>nenhuma</em></td>
</tr>
<tr>
<td align="center"><strong>sed</strong></td>
<td><em>Edita texto</em></td>
<td>-n, -f, s/isso/aquilo/, p, d, q, N</td>
</tr>
<tr>
<td align="center"><strong>seq</strong></td>
<td><em>Conta Números</em></td>
<td>-s, -f</td>
</tr>
<tr>
<td align="center"><strong>sort</strong></td>
<td><em>Ordena texto</em></td>
<td>-n, -f, -r, -k -t, -o</td>
</tr>
<tr>
<td align="center"><strong>tac</strong></td>
<td><em>Inverte arquivo</em></td>
<td><em>nenhuma</em></td>
</tr>
<tr>
<td align="center"><strong>tail</strong></td>
<td><em>Mostra Final</em></td>
<td>-n, -c, -f</td>
</tr>
<tr>
<td align="center"><strong>tee</strong></td>
<td><em>Arquiva fluxo</em></td>
<td>-a</td>
</tr>
<tr>
<td align="center"><strong>tr</strong></td>
<td><em>Transforma texto</em></td>
<td>-d, -s, A-Z a-z</td>
</tr>
<tr>
<td align="center"><strong>uniq</strong></td>
<td><em>Remove duplicatas</em></td>
<td>-i, -d, -u</td>
</tr>
<tr>
<td align="center"><strong>wc</strong></td>
<td><em>Conta Letras</em></td>
<td>-c, -w, -l, -L</td>
</tr>
<tr>
<td align="center"><strong>xargs</strong></td>
<td><em>Gerencia argumentos</em></td>
<td>-n, -i</td>
</tr>
</tbody>
</table>
<p>Fonte: http://aurelio.net/shell</p>
<div class="shr-publisher-394"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/06/29/canivete-suico-do-shell-bash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configurando Apache para Performance Maxima</title>
		<link>http://blog.deserv.info/2010/05/25/configurando-apache-para-performance-maxima/</link>
		<comments>http://blog.deserv.info/2010/05/25/configurando-apache-para-performance-maxima/#comments</comments>
		<pubDate>Tue, 25 May 2010 03:44:09 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Configurando]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[httpd]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[NetCraft]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Perfomance]]></category>
		<category><![CDATA[webserver]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=389</guid>
		<description><![CDATA[Introdução Apache é a implementação open source de um servidor HTTP. Ele é o webserver mais popular na Internet. Uma pesquisa realizada em 2005 pela NetCraft mostra que cerca de 70% dos sites na Internet rodam sobre o Apache. Opções de Configuração em tempo de Compilação Carrege apenas os módulos necessários O servidor Apache é [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.deserv.info%252F2010%252F05%252F25%252Fconfigurando-apache-para-performance-maxima%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FbDGDjf%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Configurando%20Apache%20para%20Performance%20Maxima%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><h2>Introdução</h2>
<p>Apache é a implementação open source de um servidor HTTP. Ele é o webserver mais popular na Internet. Uma pesquisa realizada em 2005 pela NetCraft mostra que cerca de 70% dos sites na Internet rodam sobre o Apache.</p>
<p><span id="more-389"></span><a id="Op.C3.A7.C3.B5es_de_Configura.C3.A7.C3.A3o_em_tempo_de_Compila.C3.A7.C3.A3o" name="Op.C3.A7.C3.B5es_de_Configura.C3.A7.C3.A3o_em_tempo_de_Compila.C3.A7.C3.A3o"></a></p>
<h2>Opções de Configuração em tempo de Compilação</h2>
<p><a id="Carrege_apenas_os_m.C3.B3dulos_necess.C3.A1rios" name="Carrege_apenas_os_m.C3.B3dulos_necess.C3.A1rios"></a></p>
<h3>Carrege apenas os módulos necessários</h3>
<p>O servidor Apache é um programa modular onde o administrador pode escolher entre as funcinalidade que deseja incluir no servidor selecionando um pacote de módukis. Os módulos podem ser compilados estaticamente no binário httpd ou dinamicamente como DSOs(Dynamic Shared Objects). Módulos DSO podem ser compilados quando o servidor for compilado ou poem ser compilados utilizando o apxs para adicioná-los mais tarde. O modulo mod_so deve ser compilado estaticamente no Apache para que o suporte a DSO seja ativo.</p>
<p>Execute o apache apenas com os módulos necessários. Isto reduz o consumo de memória aumenta a performance do servidor. Compilar os módulos estaticamente irá reduzir o consumo de RAM que é utilizado para suportar módulos compilados dinamicamente, mas será necessário recompilar o apache toda vez que um módulo for adicionado ou removido. È aqui que o DSO se torna útil. Uma vez que o modulo mod_so seja compilado estaticamente, qualquer outro módulo pode ser inserido ou removido utilizando o comando LoadModule no arquivo httpd.conf &#8211; , mas você terá que compilar os módulos utilizando apxs se ele não foi compilado quando o servidor foi feito.</p>
<p><a id="Escolha_o_MPM_apropriado" name="Escolha_o_MPM_apropriado"></a></p>
<h3>Escolha o MPM apropriado</h3>
<p>O apache vem com uma selação de Módulos Multi-Processadores (MPMs) que são responsáveis por abrir as portas de rede na máquina, aceitando requisições, e despachando processos para cuidar das requisições. Apenas um MPM pode ser carregado por vez.</p>
<p>Escolher o MPM depende de vários fatores, por exemplo se o SO suporta threads, quanta memória está disponível, escalabilidade versus estabilidade, modulos externos,etc .. Sistemas Linux podem escolher entr utilizar um MPM com suporte (worker) a threads ou um prefork sem threads:</p>
<p>O MPM Worker utiliza múltiplos processos. Ele é multi-threaded com cada processo e cada thread cuidando de uma única conexão. Esté é mais rápido e mais escalável e a memória consumida e relativamente baixa. Funciona bem com múltiplos processadores. Porém, o worker é menos tolerante a módulos defeituosos, e threads defeituosas podem afetar todas as outras threads de um processo.</p>
<p>O MPM Prefork utiliza múltiplos processos filhos, cada filho cuidad de apenas uma conexão por vez. Prefork é muito bem gerenciada por processadores simples ou múlitplos, a velocidade é comparável ao worker e é mais tolerante a falhas em modulos e processos que terminam inesperadamente. Mas o consumo de memória é alto, mais tráfego leva a mais consumo de memória.</p>
<p><a id="Op.C3.A7.C3.B5es_de_Configura.C3.A7.C3.A3o_em_Tempo_de_Execu.C3.A7.C3.A3o" name="Op.C3.A7.C3.B5es_de_Configura.C3.A7.C3.A3o_em_Tempo_de_Execu.C3.A7.C3.A3o"></a></p>
<h2>Opções de Configuração em Tempo de Execução</h2>
<p><a id="DNS_lookup" name="DNS_lookup"></a></p>
<h3>DNS lookup</h3>
<p>A diretiva HostnameLookips habilita a consulta de DNS, então os hostnames podem ser logados ao invés de endereços IP. Isto adiciona latência em cada requisição desde que a consulta do DNS tem que ser completada antes que a requisição seja terminada. Esta opção é desabilitada por padrão no Apache 1.3 e superiores. Deixe isto inativo e utilize programas pós-processamento como o logresolve para determinar os IPs dos logs. Logresolve vem com Apache.</p>
<p>Quando utilizar as diretivas Allow from ou Deny from, utilize endereços IP ao invés de nomes de domínios. Caso contrário uma consulta dupla ao DNS será executada para ter certeza de que o domínio ou host não está sendo spoofado.</p>
<p><a id="AllowOverride" name="AllowOverride"></a></p>
<h3>AllowOverride</h3>
<p>Se o AllowOverride está setado para &#8216;None&#8217;, então o Apache irá tentar abrir o arquivo .htaccess (especificada pela diretiva AccessFileName) em cada diretório que for acessado. Por exemplo:</p>
<pre>DocumentRoot /var/www/html
&lt;Directory /&gt;
AllowOverride all
&lt;/Directory&gt;

Se uma requisição for feita para acessar /index.html, o Apache irá tentar abrir /.htaccess, /var/.htaccess, /var/www/.htaccess, and /var/www/html/.htaccess. Estas tentativas aumentam a latência. Se o arquivo .htaccess for necessário para um diretório, habilite apenas para este diretório.
<a id="FollowSymLinks_e_SymLinksIfOwnerMatch" name="FollowSymLinks_e_SymLinksIfOwnerMatch"></a>
<h3> FollowSymLinks e SymLinksIfOwnerMatch</h3>

Se a opção FollowSymLinks estiver setada, então o servidor permitirá que links simbólicos possam ser seguidos neste diretório. Se a opção SymLinksIfOwnerMatch estiver setada, então o servidor permitirá acessar o link apenas se o destino dele bater com o dono do link.

Se a opção SymLinksIfOwnerMatch estiver setada, então o Apache terá que realizar consultas adicionais ao sistema para verificar se os donos coincidem. Chamadas adicionais também são necessárias quando a opção FollowSymLinks NÃO está setada. Por exemplo:
<pre>DocumentRoot /vaw/www/html
&lt;Directory /&gt;
Options SymLinksIfOwnerMatch
&lt;/Directory&gt;
Para uma requisição feita para /index.html, o Apache irá executar lstat() em /var, /var/www, /var/www/html, and /var/www/html/index.html. Estas requisições adicionais também irão aumentar a lantência. Os resultados do lstat não são cacheados, então as consultas irão ocorrer em cada requisição.

Para uma máxima performance, sete FollowSymLinks em cada lugar e nunca sete SymLinksIfOwnerMatch. Ou então, se SymLinksIfOwnerMatch for necessário para um diretório, sete ele para apenas este diretório.
<a id="Content_Negotiation" name="Content_Negotiation"></a>
<h3> Content Negotiation</h3>

Evite utilizar content negotiation para respostas mais rápidas. Se content negotiation é necessário para o site, utilize arquivos type-map ao invés da diretiva Options MultiViews. Com MultiViews, Apache precisa scanear o diretório em busca de arquivos, o que adiciona latência.
<a id="MaxClients" name="MaxClients"></a>
<h3> MaxClients</h3>

O MaxClients seta o número máximo de clientes simultâneos que pode ser suportada por cada servidor. Nenhum processo além do que está definido será aberto. Ele não deve conter um número muito baixo já que as requisições serão colacadas em fila, o que eventualmente irá dar time-out e os recursos do servidor continuarão não utilizados. Setar este valor muito alto irá causar o início de swap e o tempo de resposta irá cair drasticamente. O valor apropriado para MaxClientes pode ser calculado por: MaxClientes = Total RAM / Tamanho Máximo de Processos . O tamanho dos processos para arquivos estáticos é de mais ou menos 2-3MB. Para dinâmicos como PHP, deve ser por volta de 15MB. A coluna RSS de:
<pre># ps -ylC httpd --sort:rss
Mostra a memória física non-swapped utilizada pelos processos do Apache em kilo Bytes.

Se existem mais usuários concorrentes do que MaxClients, as requisições serão colocadas em fila até o número baseado na diretiva ListenBacklog. Aumente o ServerLimit para setar o MaxClients acima de 256.
<a id="MinSpareServers.2C_MaxSpareServers.2C_e_StartServers" name="MinSpareServers.2C_MaxSpareServers.2C_e_StartServers"></a>
<h3> MinSpareServers, MaxSpareServers, e StartServers</h3>

MaxSpareServers e MinSpareServers determina quantos processos filhos devem ser mantidos rodando. Se MinSpareServers for muito baixo e muitas requisições forem iniciadas, então o Apache terá que abrir processos adicionais para atender as requisições. Criar processos filhos é relativamente caro. Se o servidor estiver ocupado criando processos, ele não estará disponível para servir as requisições imediatamente. MaxSpareServers não deve ser muito alto, ele pode causar problemas de recursos desde que cada processo consome os recursos da máquina.

Sete MinSpareServers e MaxSpareServers para um valor com que o Apache não precise frequentemente abrir mais de 4 processos por segundo. (O Apache pode abrir o máximo de 32 processos por segundo). Quando mais de 4 processos por segundo forem abertos, uma mensagem será logada no ErrorLog.

A diretiva StartServers define o número de processos criados na inicialização do Apache. O Apache irá continuar abrir os processos até que alcance o número de MinSpareServers. Não afeta muito a performance já que o servidor não é reiniciado frequentemente. Se existem muitas requisições e o Apache é reiniciado frequentemente, sete este valor para um número alto.
<a id="MaxRequestsPerChild" name="MaxRequestsPerChild"></a>
<h3> MaxRequestsPerChild</h3>

A diretiva MaxRequestsPerChild definie o número de requisições que um processo do servidor irá gerenciar. Depois as requisições MaxRequestsPerChild irão morrer. É definido para 0 por padrão, o que significa que o processo não irá expirar nunca. É apropriado setar este valor para alguns milhares. Isto pode ajudar a previnir vazamento de memória desde que o processo morre depois de servir um número de requisições. Não sete este valor muito baixo, já que criar novos processos causa overhead.
<a id="KeepAlive_and_KeepAliveTimeout" name="KeepAlive_and_KeepAliveTimeout"></a>
<h3> KeepAlive and KeepAliveTimeout</h3>

A diretiva KeepAilve permite que múltiplas requisições possam ser enviadas pela mesma conexão TCP. Isto é útil para páginas com muitas imagens. Se o KeepAlive estiver Off, então para cada imagem, uma nova conexão TCP precisa ser aberta.

KeepAliveTimeout determinada quanto tempo deve esperar até a próxima requisição. Sete para um valor baixo, por volta de 2 a 5 segundos. Se for setado para um valor muito alto, os processos ficam amarrados esperando pelo cliente quando eles poderiam ser utilizados para servir novos clientes.
<a id="Compress.C3.A3o_HTTP_.26_Caching" name="Compress.C3.A3o_HTTP_.26_Caching"></a>
<h2> Compressão HTTP &amp; Caching</h2>

O servidor utiliza os métodos gzip ou deflate para as respostas payload antes que ele seja enviado para os clientes. Então o cliente descompacta o payload. Não existe necessidade de instalar softwares adicionais no lado do cliente desde que a maioria dos navegadores suporta isto. Utilizar compressão irá economizar banda e irá aumentar o tempo de resposta, estudos mostram que em média o ganho da compressão é de 75%. A compressão pode ser habilitada utilizando módulo mod_deflate. O Payload é compactado apenas se o navegador requisitar a compactação, ou então o conteúdo descompactado será enviado. Um navegador capaz de utilizar o conteúdo compactado envia o seguinte cabeçalho na requisição: "Accept-Encoding: gzip,deflate". Então o servidor irá enviar o payload compactado e o cabeçalho da reposta é "Content-Encoding: gzip"

O exemplo a seguir utiliza o telnet para verificar os cabeçalhos de requisição e de resposta:
<pre>bash-3.00$ telnet www.webperformance.org 80
Trying 24.60.234.27...
Connected to www.webperformance.org (24.60.234.27).
Escape character is '^]'.
HEAD / HTTP/1.1
Host: www.webperformance.org
Accept-Encoding: gzip,deflate

HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 02:29:22 GMT
Server: Apache/2.0
X-Powered-By: PHP/5.1.1
Cache-Control: max-age=0
Expires: Sat, 31 Dec 2005 02:29:22 GMT
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 20
Content-Type: text/html; charset=ISO-8859-1 

O module mod_cache pode ser utilizado no lado do servidor, está em produção estável na versão 2.2 do Apache.
<h2> Servidor separado para conteúdo estático e dinâmico</h2>

Processos do apache para conteúdo dinâmico consome cerca de 3-20MB de RAM. E cresce para acomodar o conteúdo e nunca diminui até que o processo termine. Digamos que um processo cresca até os 20MB para servir um conteúdo dinâmico. Depois de completar a requisição, ele está libre para servir outra requisição. Se vier uma requisição para uma imagem, então esses 20MB de processos está servindo um conteúdo estático que poderia ser executado por um processo de 1MB. A memória é utilizada ineficientemente.

Utilize uma pequena compilação do Apache (com o mínimo de módulos compilados estaticamente) como sendo o servidor front-end para servir conteúdos estáticos. As requisições para conteúdos dinâmicos serão encaminhadas para um apache robusto (compilado com todos os módulos necessários). Utilizar um servidor front-end leve tem a vantagem de que os conteúdos estáticos são enviados rapidamente sem o consumo alto de memória e apenas o conteúdo dinâmico é passado para o servidor robusto.

Encaminhamento de requisições pode ser implementado utilizando os módulos mod_proxy e mod_rewrite. Suponha que exista um servidor apache leve rodando na porta 80 e o robusto na porta 8088. Então a configuração a seguir pode ser utilizada no apache leve para encaminhar todas as requisições de conteúdo dinâmico para o servidor robusto.
<pre>ProxyPassReverse / http://%{HTTP_HOST}:8088/
RewriteEngine on
RewriteCond   %{REQUEST_URI} !.*\.(gif|png|jpg)$
RewriteRule ^/(.*) http://%{HTTP_HOST}:8088/$1 [P]
Todas as requisições, exceto as imagens serão encaminhadas para o apache robusto. As respostas são recebidas pelo servidor front-end que as encaminha para o cliente. Todas as respostas aparentam vir de um único servidor. <a id="Conclus.C3.A3o" name="Conclus.C3.A3o"></a>
<h2> Conclusão</h2>

Configurar o Apache para obter o máximo de performance pode ser traiçoeiro, não existem regras rápidas. Entenda as necessidades do servidor web e experimente com várias opções. Utiliza ferramentas como ab e httperf para medir a performance do servidor. Servidores leves como tux, thttpd também podem ser utilizados como servidores front-end. Se um servidor de banco de dados é utilizado, tenha certeza de que ele está otimizado para que ele não crie nenhum gargalo. No caso do MySQL, mtop pode ser utilizado para monitorar querys lentas. Performance de scripts PHP pode ser melhorada utilizando produtos de cache como o Turck MMCache. Ele elimina o overhead da compilação realizando cache dos scripts em seu estado compilado. <a id="Bibliografia" name="Bibliografia"></a>
<h2> Bibliografia</h2>

<a title="http://news.netcraft.com/archives/web_server_survey.html" onclick="_gaq.push(['_trackEvent', '/outgoing/http_news_netcraft_com_archives_web_server_survey_html', 1]);" rel="nofollow" href="http://news.netcraft.com/archives/web_server_survey.html">http://news.netcraft.com/archives/web_server_survey.html</a>
<a title="http://httpd.apache.org/docs/2.2/dso.html" onclick="_gaq.push(['_trackEvent', '/outgoing/http_httpd_apache_org_docs_2_2_dso_html', 1]);" rel="nofollow" href="http://httpd.apache.org/docs/2.2/dso.html">http://httpd.apache.org/docs/2.2/dso.html</a>
<a title="http://httpd.apache.org/docs/2.2/mpm.html" onclick="_gaq.push(['_trackEvent', '/outgoing/http_httpd_apache_org_docs_2_2_mpm_html', 1]);" rel="nofollow" href="http://httpd.apache.org/docs/2.2/mpm.html">http://httpd.apache.org/docs/2.2/mpm.html</a>
<a title="http://modperlbook.org/html/ch11_01.html" onclick="_gaq.push(['_trackEvent', '/outgoing/http_modperlbook_org_html_ch11_01_html', 1]);" rel="nofollow" href="http://modperlbook.org/html/ch11_01.html">http://modperlbook.org/html/ch11_01.html</a>
<a title="http://www.speedupyoursite.com/18/18-2t.html" onclick="_gaq.push(['_trackEvent', '/outgoing/http_www_speedupyoursite_com_18_18_2t_html', 1]);" rel="nofollow" href="http://www.speedupyoursite.com/18/18-2t.html">http://www.speedupyoursite.com/18/18-2t.html</a>
<a title="http://www.xs4all.nl/~thomas/apachecon/PerformanceTuning.html" onclick="_gaq.push(['_trackEvent', '/outgoing/http_www_xs4all_nl_thomas_apachecon_PerformanceTuning_html', 1]);" rel="nofollow" href="http://www.xs4all.nl/%7Ethomas/apachecon/PerformanceTuning.html">http://www.xs4all.nl/~thomas/apachecon/PerformanceTuning.html</a>
<a title="http://www.onlamp.com/pub/a/onlamp/2004/02/05/lamp_tuning.html" onclick="_gaq.push(['_trackEvent', '/outgoing/http_www_onlamp_com_pub_a_onlamp_2004_02_05_lamp_tuning_html', 1]);" rel="nofollow" href="http://www.onlamp.com/pub/a/onlamp/2004/02/05/lamp_tuning.html">http://www.onlamp.com/pub/a/onlamp/2004/02/05/lamp_tuning.html</a>
<a title="http://httpd.apache.org/docs/2.2/misc/perf-tuning.html" onclick="_gaq.push(['_trackEvent', '/outgoing/http_httpd_apache_org_docs_2_2_misc_perf_tuning_html', 1]);" rel="nofollow" href="http://httpd.apache.org/docs/2.2/misc/perf-tuning.html">http://httpd.apache.org/docs/2.2/misc/perf-tuning.html</a>
Linux Server Hacks by Rob Flickenger <a id="Fonte" name="Fonte"></a>
<h2> Fonte</h2>
<ul>
<li><a title="http://www.howtoforge.net/configuring_apache_for_maximum_performance" onclick="_gaq.push(['_trackEvent', '/outgoing/http_www_howtoforge_net_configuring_apache_for_maximum_performance', 1]);" rel="nofollow" href="http://www.howtoforge.net/configuring_apache_for_maximum_performance">http://www.howtoforge.net/configuring_apache_for_maximum_performance</a></li>
<li>http://under-linux.org/wiki/</li>
</ul>
</pre>
</pre>
</pre>
</pre>
</pre>
<div class="shr-publisher-389"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/05/25/configurando-apache-para-performance-maxima/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IntroPython</title>
		<link>http://blog.deserv.info/2010/05/21/intropython/</link>
		<comments>http://blog.deserv.info/2010/05/21/intropython/#comments</comments>
		<pubDate>Fri, 21 May 2010 17:43:08 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Linguagem de Programação]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=387</guid>
		<description><![CDATA[Guia de Introdução à Linguagem Python
Apresentação

Bem-vindo(a) ao nosso guia de introdução à linguagem Python. Este guia exige que se tenha noção de linguagens de programação e para isso é necessário saber o que são algoritmos e estruturas de dados. Quem já programou em uma outra linguagem, como Visual Basic, Delphi ou C poderá se sentir mais apto a programar em Python com esse guia.

Quem sabe você tem dúvidas conceituais sobre a linguagem. Se for este o seu caso, faça uma leitura na seção de Perguntas e Respostas freqüentes sobre Python.

Pronto para começar? Talvez não, porque é necessário ter certeza que o interpretador Python está instalado na sua máquina. Se você utiliza o Mac OS X, Linux ou outro sistema tipo o Unix então a resposta é provavelmente sim, pois esses sistemas constumam vir com o Python pré-instalado. Se você utiliza o Windows é quase certo que você não tem o interpretador. Para verificar, abra um terminal e digite o comando python -V, uma típica resposta será

Dharma:~ ruda$ python -V Python 2.5

indicando que eu tenho instalado a versão 2.5 da linguagem Python.

]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.deserv.info%252F2010%252F05%252F21%252Fintropython%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FblKdEY%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22IntroPython%20%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Guia de Introdução à Linguagem Python<br />
Apresentação</p>
<p>Bem-vindo(a) ao nosso guia de introdução à linguagem Python. Este guia  exige que se tenha noção de linguagens de programação e para isso é  necessário saber o que são algoritmos e estruturas de dados. Quem já  programou em uma outra linguagem, como Visual Basic, Delphi ou C poderá  se sentir mais apto a programar em Python com esse guia.</p>
<p>Quem sabe você tem dúvidas conceituais sobre a linguagem. Se for este o  seu caso, faça uma leitura na seção de Perguntas e Respostas freqüentes  sobre Python.</p>
<p>Pronto para começar? Talvez não, porque é necessário ter certeza que o  interpretador Python está instalado na sua máquina. Se você utiliza o  Mac OS X, Linux ou outro sistema tipo o Unix então a resposta é  provavelmente sim, pois esses sistemas constumam vir com o Python  pré-instalado. Se você utiliza o Windows é quase certo que você não tem o  interpretador. Para verificar, abra um terminal e digite o comando  python -V, uma típica resposta será</p>
<p>Dharma:~ ruda$ python -V Python 2.5</p>
<p>indicando que eu tenho instalado a versão 2.5 da linguagem Python. <span id="more-387"></span></p>
<p>1. Guia de Introdução à Linguagem Python<br />
1. Apresentação<br />
2. Primeiras Idéias<br />
3. Modo interativo<br />
4. Tipos de dados, constantes, variáveis e expressões<br />
1. Tipos simples<br />
2. Tipos agrupados<br />
3. Tipos mutáveis e imutáveis<br />
4. Listas<br />
5. Estuturas de controle<br />
1. if<br />
2. else<br />
3. elif<br />
4. Modificador not<br />
5. Tabela de expressões válidas<br />
6. Modificador in<br />
6. Estruturas de iteração ou loop<br />
1. for<br />
2. while<br />
7. Funções<br />
8. Arquivos<br />
9. Tratamento de erros e exceções<br />
1. Raise<br />
10. Módulos<br />
1. Módulos distribuídos com o Python<br />
11. Packages<br />
12. Classes<br />
13. Herança<br />
14. Namespaces<br />
1. Nomes não qualificados<br />
2. Nomes qualificados<br />
15. List Comprehensions<br />
16. Generators<br />
1. Generator Expressions<br />
17. Um exemplo Completo<br />
18. Próximos passos</p>
<p>Guia de Introdução à Linguagem Python<br />
Apresentação</p>
<p>Bem-vindo(a) ao nosso guia de introdução à linguagem Python. Este guia exige que se tenha noção de linguagens de programação e para isso é necessário saber o que são algoritmos e estruturas de dados. Quem já programou em uma outra linguagem, como Visual Basic, Delphi ou C poderá se sentir mais apto a programar em Python com esse guia.</p>
<p>Quem sabe você tem dúvidas conceituais sobre a linguagem. Se for este o seu caso, faça uma leitura na seção de Perguntas e Respostas freqüentes sobre Python.</p>
<p>Pronto para começar? Talvez não, porque é necessário ter certeza que o interpretador Python está instalado na sua máquina. Se você utiliza o Mac OS X, Linux ou outro sistema tipo o Unix então a resposta é provavelmente sim, pois esses sistemas constumam vir com o Python pré-instalado. Se você utiliza o Windows é quase certo que você não tem o interpretador. Para verificar, abra um terminal e digite o comando python -V, uma típica resposta será</p>
<p>Dharma:~ ruda$ python -V Python 2.5</p>
<p>indicando que eu tenho instalado a versão 2.5 da linguagem Python.</p>
<p>Se você tem o Windows é um bom momento para baixar o instalador da linguagem Python, que pode ser obtido em http://www.python.org/ftp/python/2.5.2/python-2.5.2.msi<br />
Primeiras Idéias</p>
<p>Se você NUNCA programou antes, é necessário entender alguns conceitos básicos.</p>
<p>Por exemplo: você sabe o que é um &#8220;executável&#8221; certo? Experimente abrir um arquivo desses em algum editor de textos. A não ser que você tenha vivido anos na Matrix, não entenderá nada!</p>
<p>Isso acontece porque o programa está escrito, ali, em linguagem de máquina, ou seja, apesar de você não entender nada, o computador entende muito bem.</p>
<p>Mas não pense que alguém escreveu aquilo do jeito que está. Também não foi escrito ao estilo &#8220;morse&#8221; (10010010110)&#8230; inicialmente, o programador escreveu o que chamamos de &#8220;código-fonte&#8221; em alguma linguagem de programação, como C, C++, Pascal, e, depois de terminado, compilou o código, ou seja, traduziu de C, C++, Pascal para linguagem de máquina (também chamada de Assembly).</p>
<p>Essas linguagens que eu citei acima são as linguagens compiladas, pois antes de serem executadas, seus códigos-fonte devem ser devidamente compilados.</p>
<p>Python não é compilada, mas sim interpretada, assim como PHP, Perl e muitas outras, ou seja, não há o processo de compilação. O que acontece é que o código-fonte (ou script) é &#8220;traduzido&#8221; direto, através de um interpretador (imagine que ele é um intérprete mesmo, pois é assim que funciona!). Observação: Geralmente, quando uma linguagem é interpretada, existe um código intermediário (bytecode), com o qual o programador não precisa se preocupar. Seria muito lento interpretar diretamente o texto do código fonte. No caso do Python, o bytecode é salvo em arquivos .pyc e .pyo (bytecode otimizado)</p>
<p>Tal fato adiciona muita produtividade à linguagem, já que o processo de programar é somente escrever-rodar, ao contrário de escrever-compilar-rodar. Veja que o ciclo de um programa interpretado é bem mais eficiente, pois a fase de testes é MUITO simplificada:</p>
<p>Python: escrever-testar-corrigir-escrever-testar-distribuir</p>
<p>Linguagem C: escrever-compilar-testar-corrigir-compilar-testar-distribuir</p>
<p>Tecnicamente, qualquer linguagem pode ser compilada ou interpretada, mas as linguagens mais dinâmicas geralmente são interpretadas e as mais estáticas (estilo declare-antes-de-usar) são compiladas.</p>
<p>Se você já tem um interpretador instalado em seu sistema, experimente escrever o seguinte script:</p>
<p>1 print &#8220;Olá, mundo&#8221;</p>
<p>* Depois, num terminal, digite &#8220;python nome_do_script&#8221;, e veja como é simples!</p>
<p>Modo interativo</p>
<p>O Python também pode ser usado em modo interativo. Para isso, basta digitar python. E deve aparecer algo parecido com isso:</p>
<p>Python 2.5.2 (r252:60911, Apr 21 2008, 11:12:42) [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2 Type &#8220;help&#8221;, &#8220;copyright&#8221;, &#8220;credits&#8221; or &#8220;license&#8221; for more information. &gt;&gt;&gt;</p>
<p>Em modo interativo, o Python executa o que voce digitar imediatamente (ou quase&#8230;), o que é muito bom para testes e para aprender.</p>
<p>O sinal &gt;&gt;&gt; é o prompt padrão Python. Significa que ele está de prontidão esperando um comando. Se o comando tiver algum resultado, este será mostrado na tela.</p>
<p>Para sair, aperte Control + D (nos UNIXes) ou Control + Z seguido de Enter (no Windows)</p>
<p>Tipos de dados, constantes, variáveis e expressões</p>
<p>Python é dinamicamente tipado, o que significa que se você usou uma variável para armazenar um inteiro, nada lhe impede de usá-la posteriormente para armazenar uma string (frase). Na verdade, variáveis em Python não são declaradas, o que lhe dá muita flexibilidade.</p>
<p>Quem determina o tipo de uma variável é o próprio interpretador. Se você escreve:</p>
<p>1 x = 2<br />
2 FRASE = &#8216;Isso é um exemplo simples e bobo&#8217;</p>
<p>* O interpetador já sabe que x é um inteiro e FRASE é uma string. Mas isso não lhe impede de, posteriormente, escrever</p>
<p>1 x = &#8216;agora tudo mudou&#8217;<br />
2 FRASE = 3.2</p>
<p>Como x já disse, tudo mudou, e isso é bem natural. Na verdade, raras são as vezes em que você precisa se preocupar com tipos. Geralmente você simplesmente atribui um valor a uma variável e pronto! Isso é bem simples. Mas não abuse desse recurso, senão seus programas vão virar uma confusão.</p>
<p>Então aqui vão alguns exemplos de tipos:</p>
<p>1 x = 2                           # Inteiro<br />
2<br />
3 p = 3.1415                      # Real, ou ponto flutuante<br />
4<br />
5 verdadeiro = True               # Boolean<br />
6<br />
7 estringue = &#8216;alguma frase&#8217;      # String<br />
8<br />
9 c = 3 + 2j                      # Complexo<br />
10<br />
11 lista = [3, 4, 5]               # Lista com elementos inteiros<br />
12<br />
13 lista2 = [2,'tres',4.0,[5,6]]   # Lista mista e aninhada<br />
14<br />
15 tupla = (1,2,3,&#8217;quatro&#8217;)        # Tupla. É como uma lista, mas não pode ser mudada<br />
16<br />
17 # tuplas de 0 ou 1 elementos têm sintaxes especiais:<br />
18 tupla0 = ()<br />
19 tupla1 = (&#8216;primeiro e único item&#8217;,) # repare na vírgula<br />
20<br />
21 # Em alguns casos (atribuições, returns), os parênteses são opcionais,<br />
22 # mas na maioria das vezes (tuplas dentro de listas, tuplas dentro de chamadas de funções)<br />
23 # os parênteses são necessários porque a vírgula faz parte de outra sintaxe<br />
24<br />
25 coord = 4.5, 9.1<br />
26 cor_branca = 255, 255, 255 # cor no formato RGB<br />
27 funcao((4.5, 9.1), &#8216;string&#8217;)<br />
28<br />
29 dic = {&#8216;site&#8217;:'Python Brasil&#8217;,'url&#8217;:'www.pythonbrasil.com.br&#8217;} # Isso é um dicionário</p>
<p>Tipos simples</p>
<p>* str (Strings, como &#8216;blabla&#8217;)<br />
* unicode (São strs em que os caracteres podem representar qualquer língua, u&#8217;blabla&#8217;)<br />
* bool (True ou False)<br />
* float (Números em ponto flutuante, como 4.5 ou 3.14e-10)<br />
* int (Números inteiros, como 99)<br />
* long (Números inteiros muito grandes, como 1234567890123456789123456789L)<br />
* complex (Números complexos, como 3.1j ou 7+3.14e-10j)<br />
* file (Arquivos)<br />
*</p>
<p>decimal (integrado ao Python 2.4 como módulo) (Números fracionários representados de forma decimal em vez de binária)</p>
<p>Tipos agrupados</p>
<p>* list (listas)<br />
* tuple (tuplas &#8211; listas imutáveis)<br />
* dict (dicionários)<br />
* set (novo tipo incluso no Python 2.4 &#8211; uma lista sem repetições)</p>
<p>Tipos mutáveis e imutáveis</p>
<p>Alguns tipos no Python permitem que elementos que fazem parte de sua estrutura sejam modificados, como as listas e dicionários. Estes tipos são chamados mutáveis.</p>
<p>Exemplo:</p>
<p>1 &gt;&gt;&gt; l = ['Nirvana', 'Rush', 'Bauhaus']<br />
2 &gt;&gt;&gt; l[1] = &#8216;Who&#8217;<br />
3 &gt;&gt;&gt; l<br />
4 ['Nirvana', 'Who', 'Bauhaus']<br />
5 &gt;&gt;&gt;</p>
<p>Outros tipos não permitem isso, como tuplas e strings. Estes são chamados imutáveis.</p>
<p>Exemplo:</p>
<p>1 &gt;&gt;&gt; s = &#8216;MYSQL&#8217;<br />
2 &gt;&gt;&gt; s[1] = &#8216;y&#8217;<br />
3 Traceback (most recent call last):<br />
4   File &#8220;&lt;stdin&gt;&#8221;, line 1, in<br />
5 TypeError: object does not support item assignment</p>
<p>Listas</p>
<p>O tipo lista do Python é bastante sofisticado e flexível. Como classe, a lista conta com métodos para ordenar (sort), inverter (reverse), contar ocorrências de um determinado elemento (count) e outros.</p>
<p>1 &gt;&gt;&gt; # Criando a lista de bandas<br />
2 &#8230;<br />
3 &gt;&gt;&gt; lista = ['Led Zeppelin', 'King Crimson', 'Yes', 'The Who', 'Pink Floyd']<br />
4 &gt;&gt;&gt;<br />
5 &gt;&gt;&gt; # Acessando um ítem da lista<br />
6 &#8230;<br />
7 &gt;&gt;&gt; lista[0]<br />
8 &#8216;Led Zeppelin&#8217;<br />
9 &gt;&gt;&gt;<br />
10 &gt;&gt;&gt; # Para elementos de listas dentro de listas ou caracteres de strings dentro de listas<br />
11 &#8230;<br />
12 &gt;&gt;&gt; lista[0][0]<br />
13 &#8216;L&#8217;<br />
14 &gt;&gt;&gt;<br />
15 &gt;&gt;&gt; # Retornando uma parte da lista (do terceiro até o quarto ítem)<br />
16 &#8230;<br />
17 &gt;&gt;&gt; lista[2:4]<br />
18 ['Yes', 'The Who']<br />
19 &gt;&gt;&gt;<br />
20 &gt;&gt;&gt; # Retornando uma parte da lista (do segundo até o fim)<br />
21 &#8230;<br />
22 &gt;&gt;&gt; lista[1:]<br />
23 ['King Crimson', 'Yes', 'The Who', 'Pink Floyd']<br />
24 &gt;&gt;&gt;<br />
25 &gt;&gt;&gt; # Retornando uma parte da lista (a partir do inicio até penúltimo)<br />
26 &#8230;<br />
27 &gt;&gt;&gt; lista[:-1]<br />
28 ['Led Zeppelin', 'King Crimson', 'Yes', 'The Who']<br />
29 &gt;&gt;&gt;<br />
30 &gt;&gt;&gt; # acessando a lista em passos<br />
31 &#8230;<br />
32 &gt;&gt;&gt; lista[::2]<br />
33 ['Led Zeppelin', 'Yes', 'Pink Floyd']<br />
34 &gt;&gt;&gt;<br />
35 &gt;&gt;&gt; # Passo negativo<br />
36 &#8230;<br />
37 &gt;&gt;&gt; lista[::-1]<br />
38 ['Pink Floyd', 'The Who', 'Yes', 'King Crimson', 'Led Zeppelin']<br />
39 &gt;&gt;&gt;<br />
40 &gt;&gt;&gt; # Convertendo para uma string<br />
41 &#8230;<br />
42 &gt;&gt;&gt; &#8216;, &#8216;.join(lista)<br />
43 &#8216;Led Zeppelin, King Crimson, Yes, The Who, Pink Floyd&#8217;<br />
44 &gt;&gt;&gt;<br />
45 &gt;&gt;&gt; # Contando ocorrências<br />
46 &#8230;<br />
47 &gt;&gt;&gt; lista.count(&#8216;Yes&#8217;)<br />
48 1<br />
49 &gt;&gt;&gt;</p>
<p>As estruturas condicionais disponíveis no Python são if, elif e else.</p>
<p>O if, o elif e o else servem para examinar expressões. À grosso modo, pode-se dizer que eles avaliam se determinada expressão retorna Verdadeiro (True) ou Falso (False).</p>
<p>Em Python os valores vazios: None, [] (* Lista vazia), &#8220;&#8221;, 0. São tidos como Falso (False). E os outros valores são verdadeiros (True).</p>
<p>Explicado isso, vamos às explicações:</p>
<p>if</p>
<p>Antes uma breve explicação do que vem a ser if. Como é sabido, if é traduzido em português para &#8220;se&#8221;. Nas linguagens de programação esse &#8220;se&#8221; (if) atua como um verificador de condições, algo como:</p>
<p>se ( essa condição for verdadeira ):</p>
<p>esse bloco de comandos<br />
será executado</p>
<p>Traduzindo em um exemplo bobo em Python, teriamos:</p>
<p>1 if (10 &gt; 5):<br />
2     print &#8220;10 é maior do que 5&#8243;</p>
<p>No caso, o bloco (composto apenas por um comando, no caso) seria sempre executado. Os parênteses na &#8220;condição&#8221; são opcionais.<br />
Vamos a outros exemplos.</p>
<p>Obs: Os exemplos são do modo interativo (shell) do Python.</p>
<p>1 # Exemplo IF 01<br />
2 &gt;&gt;&gt; meuNome = &#8220;Juares&#8221;<br />
3 &gt;&gt;&gt; seuNome = &#8220;Adolfo&#8221;<br />
4 &gt;&gt;&gt; if meuNome == seuNome:<br />
5 &#8230;     print &#8220;Nos temos os nomes iguais&#8221;<br />
6 &#8230;</p>
<p>Você notou que o print não ocorreu, já que as variáveis meuNome e seuNome são diferentes. Na linha 3 o if verifica essa igualdade, mas como o valor retornado da verificação é falso, ele não executa o comando print.</p>
<p>Agora observe esse outro exemplo:</p>
<p>1 # Exemplo IF 02<br />
2 &gt;&gt;&gt; meuNome = &#8220;Adolfo&#8221;<br />
3 &gt;&gt;&gt; seuNome = &#8220;Adolfo&#8221;<br />
4 &gt;&gt;&gt; if meuNome == seuNome:<br />
5 &#8230;     print &#8220;Temos os nomes iguais&#8221;<br />
6 &#8230;<br />
7 Temos os nomes iguais</p>
<p>Viu? Agora imprimiu, já que as variáveis são iguais. O if, novamente na linha 3, fez a verificação de igualdade (==) e obteve resultado Verdadeiro (True), logo executou o comando print.</p>
<p>else</p>
<p>Se o if refere-se ao &#8220;se&#8221;, quando traduzido, o else refere-se ao &#8220;senão&#8221;. Exemplificando:</p>
<p>se ( condição for verdadeira ):</p>
<p>execute esses comandos<br />
esse também</p>
<p>senão:</p>
<p>execute<br />
esses comandos</p>
<p>No caso o &#8220;se&#8221; é o if e o &#8220;senão&#8221; o else. Note que o else é executado se o if não for executado, ou seja, a condição do if não foi atendida. Caso o if tenha sido executado, o else não é executado.<br />
Vamos a um exemplo em código Python:</p>
<p>Obs: Estes códigos também são exemplos do shell do Python.</p>
<p>1 #Exemplo ELSE 01<br />
2 &gt;&gt;&gt; meuNome = &#8220;Ruivaldo&#8221;<br />
3 &gt;&gt;&gt; seuNome = &#8220;Adolfo&#8221;<br />
4 &gt;&gt;&gt; if meuNome == seuNome:<br />
5 &#8230;     print &#8220;Temos nomes iguais&#8221;<br />
6 &#8230; else:<br />
7 &#8230;     print &#8220;Nossos nomes sao diferentes&#8221;<br />
8 &#8230;<br />
9 Nossos nomes sao diferentes</p>
<p>Reiterando. O else não verifica nada. Ele é só uma delimitação de código a ser executado caso o if não ocorra.<br />
Mais um exemplo, só para fixar:</p>
<p>1 # Exemplo ELSE 02<br />
2 &gt;&gt;&gt; x = 5<br />
3 &gt;&gt;&gt; y = 10<br />
4 &gt;&gt;&gt; if x &gt; 5:<br />
5 &#8230;     print &#8220;X maior que Y&#8221;<br />
6 &#8230; else:<br />
7 &#8230;     print &#8220;Y maior ou igual a X&#8221;<br />
8 &#8230;<br />
9 Y maior ou igual a X</p>
<p>Nesse exemplo nós não sabemos quando o Y é igual ao X. Teríamos que usar o elif, que veremos agora.</p>
<p>elif</p>
<p>O elif é uma mistura de if com else. Calma, não se assuste. Ele é um else, logo só é executado se o if não ocorrer, só que além de else ele também é um if, então pro bloco elif ser executado além do primeiro if não ser executado, deve-se atender a uma determinada condição.</p>
<p>Em portugol seria algo como:</p>
<p>se ( condição ):</p>
<p>executa comando<br />
comando</p>
<p>se-if-não-foi-executado-e ( condição ):</p>
<p>executa comando<br />
comando</p>
<p>senão:</p>
<p>comando comando<br />
comando</p>
<p>Como já foi dito: o &#8220;se&#8221; é o if, o &#8220;se-if-não-foi-executado-e&#8221; é o elif e o &#8220;senão&#8221; é o else.</p>
<p>Vamos a um exemplo similar ao anterior:</p>
<p>1 #Exemplo ELIF 01<br />
2 &gt;&gt;&gt; x = 5<br />
3 &gt;&gt;&gt; y = 10<br />
4 &gt;&gt;&gt; if x &gt; y:<br />
5 &#8230;     print &#8220;X maior que Y&#8221;<br />
6 &#8230; elif x == y:<br />
7 &#8230;     print &#8220;X igual a Y&#8221;<br />
8 &#8230; else:<br />
9 &#8230;     print &#8220;Y maior que X&#8221;<br />
10 &#8230;<br />
11 Y maior que X</p>
<p>Note que agora se o x for igual ao y ele irá imprimir uma mensagem. Veja esse outro exemplo:</p>
<p>1 # Exemplo ELIF 02<br />
2 &gt;&gt;&gt; x = 5<br />
3 &gt;&gt;&gt; y = 5<br />
4 &gt;&gt;&gt; if x &gt; y:<br />
5 &#8230;     print &#8220;X &gt; Y&#8221;<br />
6 &#8230; elif x == y:<br />
7 &#8230;     print &#8220;X == Y&#8221;<br />
8 &#8230; else:<br />
9 &#8230;     print &#8220;X &lt; Y&#8221;<br />
10 &#8230;<br />
11 X == Y</p>
<p>Pronto. Estude os códigos, o conceito do elif é um pouco estranho mesmo, mas um pouco de estudo é o suficiente para dominá-lo.<br />
Modificador not</p>
<p>O modificador not é uma palavrinha que serve pra negar a expressão do if ou elif. Ao invés de esperar o valor verdadeiro da expressão ,o if vai esperar pelo valor falso. Estudemos-o por um exemplo:</p>
<p>1 # Exemplo not<br />
2 &gt;&gt;&gt; x = 5<br />
3 &gt;&gt;&gt; y = 6<br />
4 &gt;&gt;&gt; if not x == y:<br />
5 &#8230;     print &#8220;X eh diferente de Y&#8221;<br />
6 &#8230;<br />
7 X eh diferente de Y</p>
<p>Tabela de expressões válidas</p>
<p>Você pode usar os seguintes símbolos em suas expressões if, elif:</p>
<p>&gt;= (Maior Igual) &gt; (Maior) &lt;= (Menor Igual) &lt; (Menor) == (Igual) = (Diferente) &lt;&gt; (Diferente)</p>
<p>* E para finalizar essa seção do tutorial, o modificador in.</p>
<p>Modificador in</p>
<p>O in verifica se um elemento está dentro de outro. É como o símbolo de contido da matemática. Em portugol seria algo:</p>
<p>se elemento está-contido-em elemento-listável:</p>
<p>comando<br />
comando</p>
<p>Traduzindo. O &#8220;se&#8221; está para o if e o &#8220;está-contido-em&#8221; para o modificador in. Porém temos ali um &#8220;elemento-listável&#8221;. Meio estranho esse termo. Calma. Existem cinco tipos de elementos listáveis em Python: dicionários, listas, tuplas, strings (que são no fundo listas de caracteres) sets.</p>
<p>Isto é, no lugar de elemento-listável só pode haver uma variável dos tipos acima.</p>
<p>Vejamos esses exemplos:</p>
<p>1 &gt;&gt;&gt; if 1 in [1,2,3]: print &#8220;Esta&#8221;<br />
2 &#8230;<br />
3 Esta<br />
4 &gt;&gt;&gt; if &#8216;a&#8217; in &#8220;aloha&#8221;:<br />
5 &#8230;     print &#8220;Esta tambem&#8221;<br />
6 &#8230;<br />
7 Esta tambem<br />
8 &gt;&gt;&gt; if [2,3] in [1,2,3]:<br />
9 &#8230;     print &#8220;Esta&#8221;<br />
10 &#8230;<br />
11 &gt;&gt;&gt; if [2,3] in <span style='color:red;'><span style='color:red;'>[[2,3],[2,4]]</span></span>:<br />
12 &#8230;     print &#8220;Esta denovo&#8221;<br />
13 &#8230;<br />
14 Esta denovo</p>
<p>Conselho: Para fixar os conceitos copie e execute todos os exemplos no shell do Python, assim você aprenderá.<br />
Estruturas de iteração ou loop</p>
<p>for</p>
<p>Se você programa em C, vai perceber que o for em Python é diferente. Ele itera sobre listas. Por exemplo:</p>
<p>if not odeio_metallica:</p>
<p>metallica = ['James','Kirk','Lars','Trujillo']<br />
for membro in metallica:<br />
print membro</p>
<p>Ou seja, para cada elemento da lista, itere. Você terá acesso ao item corrente (print membro). Se quiser fazer iterações sobre progressões aritméticas, use a função range, que cria uma lista de inteiro em seqüência. Exemplo:</p>
<p>1 for i in range(50):<br />
2    print i</p>
<p>Isso vai imprimir na tela os números de 0 a 49.</p>
<p>while</p>
<p>O while é muito simples. Ver o exemplo já vai ajudar muito:</p>
<p>1 opc = 1<br />
2 while opc != 0:<br />
3    # código e mais código&#8230;<br />
4    opc = int(raw_input(&#8220;Digite 0 para sair \n &gt; &#8220;))</p>
<p>Veja, o laço vai continuar iterando até que o usuário digite 0 na hora que o programa perguntar. Simples. O while é literalmente um &#8220;enquanto ISSO faça AQUILO&#8221;.</p>
<p>Tando o for quanto o while podem ser interrompidos por break (o loop termina). O comando continue interrompe a iteração corrente e passa para a próxima.<br />
Funções</p>
<p>Simplificando, uma função é um bloco de código que tem nome (pelo qual ele pode ser chamado), recebe paramêtros (opcional) e gera um resultado (opcional)</p>
<p>Exemplo:</p>
<p>1 def media(lista = [0]):<br />
2     return float(sum(lista)) / len(lista)<br />
3<br />
4 print media([1,2,3,4,5])</p>
<p>media é o nome da função. lista é o paramêtro da função (no caso de vários paramêtros, seus nomes devem ser separados por vírgula). [0] é o valor padrão para lista (opcional)</p>
<p>return termina a execução da função, retornando o resultado (opcional) e o controle para a rotina que a chamou.<br />
Arquivos</p>
<p>Trabalhar com arquivos no Python é bem fácil. Como o Python é uma linguagem orientada a objetos, um arquivo é um objeto da classe file.</p>
<p>Um arquivo pode ser aberto para leitura (&#8216;r&#8217;, o padrão), escrita (&#8216;w&#8217;) ou inclusão (&#8216;a&#8217;) ou para ler e gravar no mesmo arquivo (&#8216;w+&#8217;). Se um arquivo já existir e for aberto apenas para escrita (&#8216;w&#8217;), ele será zerado.</p>
<p>1 # Um texto para teste&#8230;<br />
2<br />
3 texto = Beautiful is better than ugly.<br />
4 Explicit is better than implicit.<br />
5 Simple is better than complex.<br />
6 Complex is better than complicated.<br />
7 Flat is better than nested.<br />
8 Sparse is better than dense.<br />
9<br />
10 # Salvando em um arquivo chamado &#8220;zen.txt&#8221;<br />
11<br />
12 f = file(&#8216;zen.txt&#8217;, &#8216;w&#8217;)<br />
13 f.write(texto)<br />
14 f.close()<br />
15<br />
16 # Posso fazer em uma única linha:<br />
17<br />
18 file(&#8216;zen.txt&#8217;, &#8216;w&#8217;).write(texto)<br />
19<br />
20 # Para ler o arquivo:<br />
21<br />
22 arq = file(&#8216;zen.txt&#8217;)<br />
23<br />
24 # Trazendo o texto de volta:<br />
25<br />
26 texto = arq.read()<br />
27<br />
28 # Se preferir uma lista contendo as linhas do arquivo<br />
29<br />
30 linhas = arq.readlines()<br />
31<br />
32 # Se movendo para o inicio do arquivo<br />
33<br />
34 arq.seek(0)<br />
35<br />
36 # Imprimindo as linhas do arquivo:<br />
37<br />
38 for linha in arq: print linha,<br />
39<br />
40 # Fechando o arquivo<br />
41<br />
42 arq.close()</p>
<p>Tratamento de erros e exceções</p>
<p>* try / except<br />
* try / finally</p>
<p>As sentenças try / except e try / finally são mutuamente excludentes, não podem misturadas (embora possam ser usadas uma no interior da outra)</p>
<p>A sentença try / except especifica um ou mais manipuladores de exceção. Caso não ocorra erros, nenhum manipulador será executado. Ainda é possível definir um else opcional que será executado quando nenhum erro ocorrer. Exemplo:</p>
<p>1 try:<br />
2     # Vou tentar fazer isso:<br />
3     x = 1/0<br />
4 except ZeroDivisionError:<br />
5     # Se houver divisão por zero, farei isso:<br />
6     print &#8216;Divisão por zero&#8230;&#8217;<br />
7 else:<br />
8     # Senão&#8230;<br />
9     print &#8216;Não ocorreu nenhum erro!&#8217;</p>
<p>A sentença try / finally especifica um manipulador de limpeza, que será executado sempre. Quando não ocorre erros, finally é executado. Quando ocorre um erro, a exceção é salva, finally é executado, e logo após a exceção salva é executada novamente. Exemplo:</p>
<p>1 try:<br />
2     x = 1/0<br />
3 finally:<br />
4     print &#8216;Tentando dividir um 1 por 0&#8230; Ops!&#8217;</p>
<p>Nesse caso, o traceback aparecerá na tela, depois da mensagem.<br />
Raise</p>
<p>Com a sentença raise, você pode provocar uma exceção, que ser pode tratada pelo código que chamou aquela parte do programa. Exemplo:</p>
<p>1 try:<br />
2     z, y = 1, 0<br />
3     if y == 0:<br />
4         raise ZeroDivisionError<br />
5     else:<br />
6         print &#8216;%d divido por %d é %d&#8217; % (z, y, z/y)<br />
7 except ZeroDivisionError:<br />
8     print &#8216;Divisão por zero&#8230;&#8217;<br />
9 else:<br />
10     print &#8216;ocorreu algo inesperado!&#8217;</p>
<p>Dica: raise SystemExit termina o programa.<br />
Módulos</p>
<p>Um módulo em Python não é nada mais que um arquivo .py com definições de funções e classes. É isso mesmo. Apenas um arquivo.</p>
<p>Para facilitar o entedimento vamos exemplificar.</p>
<p>Escrevemos o código do seguinte módulo (logicamente, para fins didáticos apenas):</p>
<p>Esconder número das linhas</p>
<p>1 # Exemplo de módulo<br />
2 # Módulo matematica.py<br />
3<br />
4 def somar(a,b):<br />
5     &#8220;&#8221;"<br />
6     Funcao que soma dois numeros<br />
7     &#8220;&#8221;"<br />
8     return a+b<br />
9<br />
10 def subtrair(a,b):<br />
11     &#8220;&#8221;"<br />
12     Funcao que subtrai dois numeros<br />
13     &#8220;&#8221;"<br />
14     return a &#8211; b<br />
15<br />
16 def multiplicar(a,b):<br />
17     &#8220;&#8221;"<br />
18     Funcao que multiplica dois numeros<br />
19     &#8220;&#8221;"<br />
20     return a * b<br />
21<br />
22 def dividir(a,b):<br />
23     &#8220;&#8221;"<br />
24     Funcao que divide dois numeros<br />
25     &#8220;&#8221;"<br />
26     return a / b</p>
<p>Salvamos ele como &#8220;&#8221;matematica.py&#8221;".</p>
<p>Agora vamos escrever três exemplos de uso do módulo.</p>
<p>* Importando o módulo inteiro</p>
<p>Vamos ao código:</p>
<p>1 import matematica<br />
2<br />
3 print matematica.somar(1,2)<br />
4 print matematica.dividir(100,25)</p>
<p>Executando esse arquivo nós temos como resultado:</p>
<p>3 4</p>
<p>Note que ao importar o módulo inteiro é obrigatório usar o nome do módulo antes de suas funções, classes&#8230; Esse tipo de import evita problemas de namespace.</p>
<p>* Importando o que a gente quer do módulo</p>
<p>Esconder número das linhas</p>
<p>1 from matematica import somar, dividir<br />
2<br />
3 print somar(1,2)<br />
4 print dividir(100,25)</p>
<p>O resultado é o mesmo do exemplo anterior:</p>
<p>3 4</p>
<p>A única diferença é que nós só importamos duas funções do módulo e não precisamos por &#8220;matematica&#8221; para chamá-los, ou seja, as duas funções importadas foram colocadas dentro do namespace do arquivo que está usando o módulo. Esse tipo de import é bom para módulos muito grandes em que só se use uma fcoisa ou poucas coisas dele, há um certo aumento de desempenho nesse caso e economia de memória.</p>
<p>* Importando tudo do módulo (diferente de importar o módulo inteiro)</p>
<p>1 from matematica import *<br />
2<br />
3 print somar(1,2)<br />
4 print dividir(100,25)<br />
5 print subtrair(10,8)</p>
<p>O resultado será:</p>
<p>3 4 2</p>
<p>É como o primeiro tipo de import, ele pega tudo do módulo, todas funções, classes, enfim. A diferença é que usando o &#8220;&#8221;"from modulo import *&#8221;"&#8221; eliminamos a necessidade de ficar digitando &#8220;matematica&#8221; toda vez que quisermos chamar algo do módulo.<br />
Observações:</p>
<p>* Os arquivos de exemplo de uso do módulo devem estar na mesma pasta do módulo.<br />
* Ao fazer módulos procure não deixá-lo tão grande. É uma boa prática de programação.</p>
<p>Adendo: Um módulo Python é como se fosse um pedaço de programa que você, como programador, decidiu que ficaria melhor separado do todo. Essa decisão geralmente é tomada sobre estruturas que são usadas em diversos programas. Isso facilita nossa vida, pois já não precisamos &#8220;copiar e colar&#8221; as coisas de um lado para outro. Claro, módulos podem ser mais complexos em certos pontos de vista. Eu mesmo não vejo nada de muita complexidade. Pura praticidade!<br />
Módulos distribuídos com o Python</p>
<p>Com o Python, são distribuídos muitos módulos, para servem para diversos propósitos (antes escrever algo do zero, verifique se existe algo pronto nos módulos do Python)</p>
<p>Exemplos de módulos:</p>
<p>* os &#8211; suporte para recursos do sistema operacional (exemplos: mudar o diretório corrente e deletar arquivo)<br />
* sys &#8211; rotinas que controlam o ambiente de execução do Python (exemplos: consultar o PYTHONPATH (lista de diretórios aonde o Python procura módulos) e encerrar o programa)<br />
* copy &#8211; copia de objetos<br />
* subprocess &#8211; rotinas para executar processos (incluso no Python 2.4)</p>
<p>Packages</p>
<p>O Package é uma maneira estruturar o namespace dos módulos através da notação do ponto. Por exemplo, web.forms é uma referência ao módulo forms que faz parte do package web.</p>
<p>Com packages, os autores de módulos não precisam se preocupar com a colisão de nomes.<br />
Para criar um package:</p>
<p>* Crie um diretório (que terá o nome do package);<br />
*</p>
<p>Crie um arquivo (que pode estar vázio) chamado __init__.py dentro do diretório;<br />
* Coloque os módulos do package dentro do mesmo diretório.</p>
<p>Um módulo que faz parte de um package pode ser importado como import package.modulo ou from package import modulo.</p>
<p>Opcionalmente, o arquivo __init__.py pode inicializar uma lista chamada __all__, que contém quais módulos serão importados usando from package import *.<br />
Classes</p>
<p>Criar uma classe em Python é muito simples. Acompanhe o exemplo: Esconder número das linhas</p>
<p>1 class Pessoa:<br />
2   def __init__(self):<br />
3     self.nome = &#8220;&#8221;<br />
4     self.x = 0<br />
5     self.y = 0<br />
6   def andar(self, x, y):<br />
7     self.y = self.y + y<br />
8     self.x = self.x + x<br />
9<br />
10 eu = Pessoa()<br />
11 eu.nome = &#8220;Cléber&#8221;<br />
12 eu.andar(2, 0)</p>
<p>A classe criada chama-se Pessoa. É costume nomear classes DesteJeito em vez de deste_jeito. Assim, fica fácil de distinguir as classes dos objetos, das variáveis, das funções, etc. Essa convenção de nomenclatura é usada em Java, Ruby, Python e em outras linguagens (já que os programadores acabam levando esse costume de uma linguagem pra outra). Voltando à classe Pessoa.</p>
<p>Nela definimos duas funções (funções dentro classes geralmente são chamadas de métodos). A função andar, sob um ponto de vista muito abstrato, faz &#8220;a pessoa andar&#8221;, ou seja, altera os valores x e y de sua posição (faça de conta que também existe uma função pra desenhar a pessoa <img src='http://blog.deserv.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  ). Perceba que eu não declarei nenhuma das variáveis. Classes servem mesmo é pra criar métodos (agrupar funções), e não tanto para criar estruturas de variáveis (apesar de classes em Python serem ótimos containers).</p>
<p>A função __init__() é especial: ela é chamada toda a vez que é criada uma nova instância da classe (obs.: instância de classe é o mesmo que objeto), por isso o nome init: ela inicializa o objeto, e é opcional. O argumento self é obrigatório, e deve ser o primeiro da função. Perceba que foi usado self na definição das variáveis. Isso quer dizer que estamos mexendo nas variáveis do objeto (Repare no detalhe: fora da classe usamos o nome do objeto criado, no caso eu. Dentro da classe, o código serve pra qualquer objeto criado a partir dessa classe, e o primeiro argumento, o self, representa o objeto sendo usado.).</p>
<p>Classes podem servir como os &#8220;struct&#8221; do C ou &#8220;record&#8221; do Pascal. dicts também podem servir como structs. dicts são mais usados pra simplesmente agrupar dados acessados por nome. Classes são mais usadas quando a estrutura é complexa, necessita de métodos de acesso e serão usadas várias instâncias da mesma estrutura. Pra simular uma struct, basta definir uma classe vazia, por exemplo:</p>
<p>1 class conteiner:<br />
2    pass<br />
3<br />
4 # E depois criar as variáveis dela &#8220;por fora&#8221;,<br />
5 conteiner.var = &#8220;fácil, não?&#8221;<br />
6 conteiner.num = 1</p>
<p>O pass serve para indicar que nada precisa ser feito (porém a síntaxe exige que exista uma sentença naquele lugar)</p>
<p>Classes podem ser muito bem utilizadas, mas algumas vezes são péssimas opções. Assim como tudo em programação, saiba usá-las com parcimônia.</p>
<p>Exemplos, pra terminar:</p>
<p>1 class Carro:<br />
2    def __init__(self, preco):<br />
3       self.marca = &#8220;Ford&#8221;<br />
4       self.modelo = &#8220;Maverick&#8221;<br />
5       self.ano = 74<br />
6       self.cor = [0,200,50]<br />
7       self.pos = [0,0]<br />
8    def andar(self, x, y):<br />
9       self.pos[0] = self.pos[0]+x<br />
10       self.pos[1] = self.pos[1]+y<br />
11<br />
12 carango = Carro(5000)   #passa o valor 5000 para __init__()<br />
13<br />
14 for i in range(300):<br />
15    carango.andar(1,0)  #o carro anda 300m</p>
<p>Herança</p>
<p>Herança é um recurso poderoso da programação orientada a objetos que permite reutilizar o código de classes já definidas. Com a herança, é possível extender, especializar ou até mesmo fundir classes.</p>
<p>O Python suporta herança múltipla, ou seja, é possível criar uma nova classe a partir de várias outras (esse recurso deve ser usado com cuidado, pois isso pode criar dificuldades na manutenção)</p>
<p>Exemplo:</p>
<p>1 # definindo uma classe &#8216;pai&#8217;<br />
2<br />
3 class CD:<br />
4   def __init__(self, titulo):<br />
5     self.titulo = titulo<br />
6<br />
7   def mudarTitulo(self, novoTitulo):<br />
8     self.titulo = novoTitulo<br />
9<br />
10 # definindo uma classe &#8216;filha&#8217;<br />
11 # O nome da class &#8216;mãe&#8217; (Na herança múltipla, os nomes das &#8216;mães&#8217;)<br />
12 # é passado para a classe filha<br />
13<br />
14 class CDAudio(CD):<br />
15<br />
16   def __init__(self, titulo, autor):<br />
17     CD.__init__(self, titulo)<br />
18     self.autor = autor<br />
19     self.faixas = []<br />
20<br />
21   def adicionarFaixa(self, numero, nome):<br />
22     self.faixas.append((numero, nome))<br />
23<br />
24   def removerFaixa(self, numero, nome):<br />
25     self.faixas.remove((numero, nome))<br />
26<br />
27 # Criando objeto<br />
28<br />
29 novoCD = CDAudio(&#8216;Physical Graphitte&#8217;, &#8216;Led Zeppelin&#8217;);<br />
30<br />
31 # Evocando métodos:<br />
32<br />
33 novoCD.adicionarFaixa(1,&#8217;Custard Pie&#8217;)<br />
34 novoCD.adicionarFaixa(2,&#8217;The Rover&#8217;)<br />
35<br />
36 # Listando a estrutura do objeto<br />
37<br />
38 print dir(novoCD)<br />
39<br />
40 # Acesando atributos<br />
41<br />
42 print &#8220;CD: %s, %s&#8221; % (novoCD.titulo, novoCD.autor)<br />
43 print novoCD.faixas</p>
<p>Namespaces</p>
<p>Um Namespace é um dicionário com os nomes válidos em um programa durante a sua execução. Sendo assim, quando fazemos i = 1, o nome i é colocado em um namespace. O nome pode ser localizado de duas formas:</p>
<p>* Nome não qualificado<br />
* Nome qualificado</p>
<p>Nomes não qualificados</p>
<p>Quando o nome da variável não foi qualificado (exemplo: i = 0, a busca é feita primeiro entre as variáveis locais (dica: para listar as variáveis locais: locals()), depois entre as variáveis globais (dica: para listar as variáveis globais: globals()) e por fim entre as variáveis pré-definidas do Python (builtins. Exemplos: True e False)<br />
Nomes qualificados</p>
<p>Quando o nome da variável foi qualificado (exemplo: livro.pagina, a busca é feita primeiro no objeto, depois na classe do objeto e segue a hierarquia de herança.<br />
List Comprehensions</p>
<p>List Comprehension é um nome pomposo para algo simples &#8211; uma construção que permite processar listas de uma forma bem próxima a matemática.</p>
<p>A sintaxe é [&lt;expressão&gt; for &lt;variável&gt; in &lt;lista&gt; if &lt;condição&gt;]</p>
<p>Aonde:</p>
<p>* &lt;lista&gt; é a lista original a ser processada;<br />
* &lt;variável&gt; ítem da lista a ser processada;<br />
* &lt;expressão&gt; expressão a ser aplicada em cada ítem;<br />
* &lt;condição&gt; condição que deve ser cumprida para que o ítem seja processado.</p>
<p>A parte for &lt;variável&gt; in &lt;lista&gt; pode se repetir N vezes.</p>
<p>A condição é opcional.</p>
<p>Exemplo:</p>
<p>Esconder número das linhas</p>
<p>1 &gt;&gt;&gt; # Multiplos de 4 entre 0 em 99:<br />
2 &#8230;<br />
3 &gt;&gt;&gt; [x for x in range(100) if x % 4 == 0]<br />
4 [0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96]<br />
5 &gt;&gt;&gt;</p>
<p>Generators</p>
<p>Muitas vezes, em programação, é necessário processar listas de elementos. Porém, manter listas inteiras em memória, dependendo do tamanho, podem causar problemas de performance. Para isso, no Python, temos os Generators.</p>
<p>Na sintaxe, os generators são parecidos com as funções, porém existem algumas diferenças significativas:</p>
<p>* Um objeto do tipo generator retorna um elemento de cada vez quando evocado (através do método next<br />
* O return habitual é substituido por yield<br />
* Como os elementos são gerados apenas quando (e se) necessário, o resultado é menos consumo de recursos (isto é chamado Lazy Evaluation)</p>
<p>Exemplo:</p>
<p>1 &gt;&gt;&gt; def getchar(word):<br />
2 &#8230;     for c in word:<br />
3 &#8230;         yield c<br />
4 &#8230;<br />
5 &gt;&gt;&gt; pythonchars = getchar(&#8216;Python&#8217;)<br />
6 &gt;&gt;&gt; pythonchars<br />
7 &lt;generator object at 0x009D5EE0&gt;<br />
8 &gt;&gt;&gt; pythonchars.next()<br />
9 &#8216;P&#8217;<br />
10 &gt;&gt;&gt; pythonchars.next()<br />
11 &#8216;y&#8217;<br />
12 &gt;&gt;&gt; pythonchars.next()<br />
13 &#8216;t&#8217;<br />
14 &gt;&gt;&gt; pythonchars.next()<br />
15 &#8216;h&#8217;<br />
16 &gt;&gt;&gt; pythonchars.next()<br />
17 &#8216;o&#8217;<br />
18 &gt;&gt;&gt; pythonchars.next()<br />
19 &#8216;n&#8217;<br />
20 &gt;&gt;&gt;</p>
<p>Generator Expressions</p>
<p>Generator Expressions (também chamadas de Genexps) são o equivalente a List Comprehensions para se criar Generators.</p>
<p>A sintaxe é semelhante a da List Comprehension, porém, numa Generator Expression se usa () (parantesis) para delimitar a expressão, ao invez de [] (colchetes) como na List Comprehension.</p>
<p>Uma Generator Expression pode ser vista também como a versão Lazy Evaluated da List Comprehension, já que cada elemento é gerado apenas quando necessario, e não todos de uma vez.</p>
<p>Exemplo (baseado num post de Guido Van Rossum em seu blog):</p>
<p>1 &gt;&gt;&gt; # funções uteis para usar com genexps<br />
2 &gt;&gt;&gt; def any(S):<br />
3 &#8230;    for x in S:<br />
4 &#8230;         if x:<br />
5 &#8230;            return True<br />
6 &#8230;    return False<br />
7 &#8230;<br />
8 &gt;&gt;&gt; def all(S):<br />
9 &#8230;     for x in S:<br />
10 &#8230;         if not x:<br />
11 &#8230;            return False<br />
12 &#8230;     return True<br />
13 &#8230;<br />
14 &gt;&gt;&gt; S = [42, 42]<br />
15 &gt;&gt;&gt; # Usando Genexps<br />
16 &gt;&gt;&gt; any(x &gt; 42 for x in S)     # True se algum elemento de S for &gt; 42<br />
17 &gt;&gt;&gt; all(x != 0 for x in S)     # True se todos os elemtos de S forem diferentes de zero</p>
<p>Um exemplo Completo</p>
<p>Pretendo deixar um aplicativo de exemplo para sintetizar tudo. Uma idéia que me ocorreu agora é fazer um programinha gráfico (usando tk) de perguntas e repostas (quiz). Não sei se é confundir muito botar tk no meio, mas creio que se a pessoa entendeu o tutorial vai ser capaz de entender um pouco do código, mesmo porque com o quiz eu posso usar dicionários, listas, abrir/fechar arquivos (aka usar módulos), talvez usar classes e mostrar um exemplo prático que teoricamente rodaria em todas as plataformas.</p>
<p>(Sugestão: Coloca o programa sim! Assim o tutorial &#8220;cresce&#8221; junto com o leitor, em vez de ficar só no conhecimento básico &#8211; tem é que mergulhar fundo! Ao infinito e além!!)</p>
<p>(Muito bom! Este exemplo completo seria muito interessante. De repente não utilizar a biblioteca gráfica, para não complicar, tendo em vista que a sintaxe do Python é bem particular, não tendo muitas semelhanças com as linguagens de uso corriqueiro)</p>
<p>(Po! Eu acho legal colocar o exemplo de quiz&#8230; ia simplificar muito o aprendizdo, visto que editar codigo eh um otimo aprendizado&#8230;)</p>
<p>(Acho que toolkits gráficos atrapalham para quem está aprendendo (até porque tem toneladas deles). Seria legal ter um tutorial só de tk com o programa completo. Pessoalmente, preferia que fosse PyGTK&#8230;)</p>
<p>(Eu tenho um pouco de experiencia com PyGTK, mas poderiamos fazer um no console tambêm. ~YuriSchlesner)</p>
<p>(Se esta página e´sobre uma introdução em Python nada mais justo que usar algo fraquinho como Tkinter. Andrik Machado Batista)</p>
<p>(Se Tkinter é fraquinho, portanto não muito útil, então porque não algo mais prático? Interface Web, por exemplo)</p>
<p>(Outra coisa &#8211; não seria melhor separar a página em partes? Ela está ficando um pouco grande&#8230;)<br />
Próximos passos</p>
<p>Existem muitos caminhos para continuar aprendendo Python. Algumas possibilidades são:</p>
<p>* Esse próprio site (PythonBrasil)<br />
* A documentação oficial do Python, em inglês (Python 2.4.1 Documentation)</p>
<div class="shr-publisher-387"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/05/21/intropython/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introdução ao PostgreSQL</title>
		<link>http://blog.deserv.info/2010/05/16/introducao-ao-postgresql/</link>
		<comments>http://blog.deserv.info/2010/05/16/introducao-ao-postgresql/#comments</comments>
		<pubDate>Mon, 17 May 2010 02:42:48 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Bancos de Dados]]></category>
		<category><![CDATA[PGSQL]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[SGBD]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[AIX]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[BSD]]></category>
		<category><![CDATA[HP-UX]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[SGI IRIX]]></category>
		<category><![CDATA[Solaris]]></category>
		<category><![CDATA[Tru64]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=376</guid>
		<description><![CDATA[Resumo da História do PostgreSQL É um poderoso SGBD com mais de 15 anos de ativo desenvolvimento. O PostgreSQL atual é derivado do POSTGRES, escrito pela universidade de Berkeley na Califórnia EUA). O POSTGRES foi inicialmente patrocinado pela Agência de Projetos de Pesquisa Avançados de Defesa (DARPA), pelo Escritório de Pesquisa sobre Armas (ARO), pela [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.deserv.info%252F2010%252F05%252F16%252Fintroducao-ao-postgresql%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FaALlqR%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Introdu%C3%A7%C3%A3o%20ao%20PostgreSQL%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><strong>Resumo da História do PostgreSQL<br />
</strong>É um poderoso SGBD com mais de 15 anos de ativo desenvolvimento.</p>
<p>O PostgreSQL atual é derivado do POSTGRES, escrito pela universidade de Berkeley na Califórnia EUA). O POSTGRES foi inicialmente patrocinado pela Agência de Projetos de Pesquisa Avançados de Defesa (DARPA), pelo Escritório de Pesquisa sobre Armas (ARO), pela Fundação acional de Ciências (NSF) e pelo ESF, Inc. <span id="more-376"></span></p>
<p>PostgreSQL é o trabalho coletivo de centenas de desenvolvedores, trabalhando sob vinte-um anos e desenvolvimento que começou na Universidade da Califórnia, Berkeley. Com seu suporte de onga data a funcionalidades de nível corporativo de bancos de dados transacionais e escalabilidade,<br />
o PostgreSQL está sendo utilizado por muitas das empresas e agências de governo mais exigentes.<br />
O PostgreSQL é distribuído sob a licensa BSD, que permite uso e distribuição sem ônus para plicações comerciais e não-comerciais.</p>
<p>POSTGRES &#8211; 1986<br />
POSTGRES 1 &#8211; 06/1989<br />
POSTGRES 2 &#8211; 06/1990<br />
POSTGRES 3 &#8211; 06/1991</p>
<p>O Informix (adquirido pela IBM) foi originado do código do POSTGRES<br />
Em 1994 Andrew Yu and Jolly Chen adiciona um interpretador de SQL substituindo o PostQUEL<br />
Ele muda de nome para Postgres95 e tve seu código completamente reescrito em ANSI C</p>
<p>Postgres95 &#8211; 01/05/1995<br />
PostgreSQL 1 – 05/09/1995</p>
<p>Em 1996 muda novamente de nome, agora para PostgreSQL<br />
PostgreSQL 6 &#8211; 29/01/1997 (do 1.09 passou para o 6)<br />
PostgreSQL 7 &#8211; 08/05/2000<br />
PostgreSQL 8 &#8211; 19/01/2005 (primeira versão for Windows)<br />
PostgreSQL 8.1 &#8211; 08/11/2005<br />
PostgreSQL 8.2 &#8211; 05/12/2006<br />
PostgreSQL 8.3 &#8211; 04/02/2008 (versão atual)</p>
<p>Uma nova versão sai aproximadamente a cada ano.</p>
<p>Fontes:<br />
<a href="http://www.postgresql.org/docs/8.3/interactive/release.html" target="_blank">http://www.postgresql.org/docs/8.3/interactive/release.html</a><br />
<a href="http://www.postgresql.org/docs/8.3/interactive/history.html" target="_blank">http://www.postgresql.org/docs/8.3/interactive/history.html</a></p>
<p><strong>Características Avançadas do PostgreSQL</strong><br />
- Exporta em XML<br />
- Busca Textual, com TSearch2<br />
- Novos tipos de dados: ENUM e matrizes de tipos compostos<br />
- Suporte a SNMP<br />
- Transações<br />
- Replicação<br />
- Banco de dados objeto-relacional<br />
- Suporte a transações (padrão ACID)<br />
- Lock por registro (row level locking)<br />
- Integridade referencial<br />
- Número ilimitado de linhas e índices em tabelas<br />
- Extensão para GIS (base de dados geo-referenciados)<br />
- Acesso via drivers ODBC e JDBC<br />
- Interface gráfica de gerenciamento<br />
- Uso otimizado de recursos do sistema operacional<br />
- Suporte aos padrões ANSI SQL 92 e 99<br />
- Joins: Implementa todos os tipos de join definidos pelo padrão SQL99: inner join, left, right, full uter join, natural join.<br />
- Triggers, views e stored procedures<br />
- Suporte ao armazenamento de BLOBs (binary large objects)<br />
- Sub-queries e queries definidas na cláusula FROM<br />
- Backup online<br />
- Sofisticado mecanismo de tuning<br />
- Suporte a conexões de banco de dados seguras (criptografia)<br />
- Modelo de segurança para o acesso aos objetos de banco de dados por usuários e grupos de suários</p>
<p>Suporte aos tipos de dados SQL92 e SQL99, incluindo INTEGER, NUMERIC, BOOLEAN, CHAR, VARCHAR, DATE, INTERVAL e TIMESTAMP. Também suporta armazenamento de binary large objects, incluindo imagens, sons ou vídeo. Tem interfaces de programação nativa para C/C++, PHP, Java, .Net, Perl, Python, Ruby, Tcl, ODBC,</p>
<p><strong>Fonte</strong>: site do Dextra Treinamentos<br />
Lista completa: <a href="http://www.postgresql.org/about/press/features83" target="_blank">http://www.postgresql.org/about/press/features83</a> e<br />
<a href="http://www.postgresql.org/docs/8.3/static/release-8-3.html" target="_blank">http://www.postgresql.org/docs/8.3/static/release-8-3.html</a></p>
<p><strong>Limites do PostgreSQL</strong></p>
<table border="0">
<thead>
<tr>
<th align="left"><strong>Limit</strong></th>
<th align="left"><strong>Value</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Maximum Database Size</td>
<td>Unlimited</td>
</tr>
<tr>
<td>Maximum Table Size</td>
<td>32 TB</td>
</tr>
<tr>
<td>Maximum Row Size</td>
<td>1.6 TB</td>
</tr>
<tr>
<td>Maximum Field Size</td>
<td>1 GB</td>
</tr>
<tr>
<td>Maximum Rows per Table</td>
<td>Unlimited</td>
</tr>
<tr>
<td>Maximum Columns per Table</td>
<td>250 &#8211; 1600 depending on column types</td>
</tr>
<tr>
<td>Maximum Indexes per Table</td>
<td>Unlimited</td>
</tr>
</tbody>
</table>
<p><strong>Licença</strong><br />
O PostgreSQL usa a licença <a href="http://www.postgresql.org/about/licence" target="_blank">BSD</a>, que apenas requer que o código fonte sob licensa mantenha o seu ireito de cópia e a informação da licensa. Essa licensa certificada pela OSI é amplamente vista omo flexível e amigável a empresas, já que ela nao restringe o uso do PostgreSQL com aplicações<br />
comerciais e proprietárias. Juntamente com suporte de várias empresas e propriedade pública do ódigo, a licensa BSD torna o PostgreSQL muito popular entre empresas que querem embutir o anco de dados nos seus próprios produtos sem temor de taxas, enclausuramento a uma empresa, ou udanças nos termos da licença.</p>
<p><strong>Sistemas Operacionais Suportados</strong><br />
Linux, UNIX (AIX, BSD, HP-UX, SGI IRIX, Mac OS X, Solaris, Tru64) e Windows.</p>
<p><strong>Quem oferece Suporte ao PostgreSQL no Brasil</strong><br />
- Carlos Smanioto (Bauru)<br />
- dbExperts (SP)<br />
- Dextra (Campinas)<br />
- Flexsolutions Consultores (Goiânia)<br />
- Locadata (Belo Horizonte)<br />
- Mosman Consultoria e Desenvolvimento (São Pedro &#8211; SP)<br />
- Studio Server Hospedagem de Sites (Santos)</p>
<p>Detalhes e Lista completa: <a href="http://www.postgresql.org/support/professional_support_southamerica" target="_blank">http://www.postgresql.org/support/professional_support_southamerica</a></p>
<p>Oferecem Suporte ao PostgreSQL (consultores individuais e empresas):<br />
Lista completa: <a href="http://www.postgresql.org/support/professional_support" target="_blank">http://www.postgresql.org/support/professional_support</a></p>
<p>Mais empresas e consutores que oferecem suporte ao PostgreSQL:<br />
<a href="http://www.opensourcexperts.com/Index/index_html/PostgreSQL/index.html" target="_blank">http://www.opensourcexperts.com/Index/index_html/PostgreSQL/index.html</a></p>
<p><strong>Algumas Empresas que Patrocinam o PostgreSQL<br />
</strong>- InterpriseDB<br />
- Fijitsu<br />
- RedHat<br />
- Skype<br />
- Sun</p>
<p>Lista completa &#8211; <a href="http://www.postgresql.org/about/sponsors" target="_blank">http://www.postgresql.org/about/sponsors</a><br />
<strong>Algumas Empresas que usam o PostgreSQL (internacionais)</strong><br />
- Apple<br />
- BASF<br />
- Cisco<br />
- OMS (Organização Mundial de Saúde)</p>
<p><strong>Algumas Empresas que usam o PostgreSQL (nacionais)</strong><br />
- FAB (Força Aérea Brasileira)<br />
- Prefeitura Municipal de Sobral<br />
- Vivo<br />
- DNOCS<br />
- DETRAN do Ceará</p>
<p><strong>Equipe de Desenvolvimento do PostgreSQL<br />
</strong><a href="http://www.postgresql.org/community/contributors/" target="_blank">http://www.postgresql.org/community/contributors/</a><br />
<strong>Comunidade Brasileira<br />
</strong><a href="http://www.postgresq.org.br/" target="_blank">http://www.postgresq.org.br </a></p>
<p style="text-align: right;">Fonte: http://postgresql.ribafs.org</p>
<div class="shr-publisher-376"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/05/16/introducao-ao-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Administração remota usando OpenVpn+NxServer</title>
		<link>http://blog.deserv.info/2010/04/28/administracao-remota-usando-openvpnnxserver/</link>
		<comments>http://blog.deserv.info/2010/04/28/administracao-remota-usando-openvpnnxserver/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 12:39:36 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Acesso Remoto]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[VPN]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[NxServer]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[OpenVPN]]></category>
		<category><![CDATA[PTPpoint-to-point-tunneling-protocol]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[TUN-TAP]]></category>
		<category><![CDATA[VNC]]></category>
		<category><![CDATA[XFree86]]></category>
		<category><![CDATA[Xorg]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=350</guid>
		<description><![CDATA[Durante algum tempo procurei uma forma segura para acessar meu desktop Linux do trabalho remotamente, a fim de facilitar na administração da rede. Ora ou outra, principalmente a noite e nos fim de semana, surgem problemas nos servidores ou no processamento que precisam ser resolvidos imediatamente. Para tal, precisava me locomover de casa até o trabalho, sendo que na maioria das vezes eram problemas simples, que poderiam ser resolvidos com poucos comandos ou configurações, e eu perdia um enorme tempo somente com a locomoção. Adicione a isso vários outros administradores (que na verdade são programadores e que utilizam Windows), necessitando acessar essa mesma rede para correções de erros ou configurações em programas quando eventual problema acontecia. ]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.deserv.info%252F2010%252F04%252F28%252Fadministracao-remota-usando-openvpnnxserver%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FaBiQHO%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Administra%C3%A7%C3%A3o%20remota%20usando%20OpenVpn%2BNxServer%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Introdução</p>
<p>Durante algum tempo procurei uma forma segura para acessar meu desktop Linux do trabalho remotamente, a fim de facilitar na administração da rede. Ora ou outra, principalmente a noite e nos fim de semana, surgem problemas nos servidores ou no processamento que precisam ser resolvidos imediatamente. Para tal, precisava me locomover de casa até o trabalho, sendo que na maioria das vezes eram problemas simples, que poderiam ser resolvidos com poucos comandos ou configurações, e eu perdia um enorme tempo somente com a locomoção. Adicione a isso vários outros administradores (que na verdade são programadores e que utilizam Windows), necessitando acessar essa mesma rede para correções de erros ou configurações em programas quando eventual problema acontecia.  <span id="more-350"></span></p>
<p>Pensando numa forma de facilitar na administração da nossa rede, de forma remota, ou seja, a partir de qualquer lugar e independente da plataforma operacional usada para acessar (Linux ou Windows), é que resolvi pesquisar e me aprofundar no assunto.</p>
<p>Achei diversas &#8220;receitas de bolos&#8221; que mostravam como fazer, mas encontrei nenhuma que me satisfizesse por completo, não queria apenas um nível de segurança, como acesso direto por ssh, como também gostaria de acessar meu desktop, afinal o ambiente da empresa é misto, ou seja, temos servidores com Linux, AIX e Windows, e para administrar os serviços Windows necessito de acesso ao seu desktop.</p>
<p>Enfim, após muita pesquisa e quebra-cabeça, descobri uma solução com OpenVPN + NxServer, sendo seus serviços disponibilizados numa máquina com Linux no meu trabalho. Neste computador temos instalado:</p>
<ul>
<li> Ambiente desktop (KDE)</li>
</ul>
<p>Um pacote chamado rdesktop, que na verdade é uma implementação cliente- servidor do próprio protocolo rdesktop utilizado pela Microsoft para o serviço de Terminal Service (esse programa é que faz a ponte de conexão para os desktops Windows na nossa rede)</p>
<ul>
<li> O servidor de VPN: OpenVPN</li>
</ul>
<p>Um programa que compartilha o desktop desta máquina (NxServer) que permite a conexão remota a partir da minha casa, independente do SO utilizado para me conectar (Linux ou Windows), ao desktop deste computador no trabalho.</p>
<ul>
<li> Servidor SSH</li>
</ul>
<p>O OpenVPN é um dos vários pacotes para Linux desenvolvidos para a criação de VPN (Virtual Private Network), existem outros como OpenSwan e outras formas de fazer, como por exemplo usar Ipsec, que é uma implementação do protocolo IP com segurança ou criptografia, feita pelo próprio kernel do Linux. Utilizei o OpenVPN por ser fácil de configurar e pela extensa documentação que o acompanha.</p>
<p>O NxServer é um serviço de compartilha a área de trabalho de um computador com Linux, igual ao VNC, só que muito mais rápido e seguro, permitindo acesso a até dois usuários simultaneamente, cada um com uma sessão independente e onde todos os dados transmitidos são criptografados. Lembrando que o próprio protocolo X (XFree86 ou Xorg) oferece a possibilidade de acesso remoto seguro em cima do protocolo SSH, isto é exatamente o que o NxServer faz.</p>
<p>Desta forma, teremos dois níveis de segurança, sendo um criado pelo túnel VPN e o outro pela implementação de segurança do pacote Nx.</p>
<p>Exemplo do diagrama da VPN:</p>
<p style="text-align: center;"><a title="Diagrama-da-vpn.png" href="http://under-linux.org/wiki/Arquivo:Diagrama-da-vpn.png"><img class="aligncenter" src="http://under-linux.org/wiki/images/thumb/d/d8/Diagrama-da-vpn.png/500px-Diagrama-da-vpn.png" border="0" alt="" width="500" height="298" /></a></p>
<p>Baseando-se no diagrama acima, verifica-se que usando a internet a partir da minha casa, criamos um túnel seguro com OpenVPN para acessar um servidor na empresa, o qual tem seu desktop compartilhado pelo NxServer, e a partir deste, acessamos a área de trabalho de qualquer computador com Windows XP ou 2003 usando o protocolo rdesktop, que é nativo do Windows para aplicações de Terminal Server.</p>
<p><a id="Configurando_o_servidor" name="Configurando_o_servidor"></a></p>
<h2>Configurando o servidor</h2>
<p><a id="Pr.C3.A9-requisitos" name="Pr.C3.A9-requisitos"></a></p>
<h3>Pré-requisitos</h3>
<p>Todos os procedimentos de instalação foram feitos usando a distribuição Debian e kernel 2.6, sendo que suponho que você já tenha um ambiente gráfico instalado, no caso o KDE.</p>
<p><strong>Utilizei o OpenVPN baseado no protocolo PTPpoint-to-point-tunneling-protocol), sendo que para funcionar é necessário o módulo TUN/TAP ativo no kernel.</strong></p>
<ol>
<li> Verifique em <strong>/lib/modules/<em>versao-do-kernel</em>/kernel/drivers/net/</strong> se existe o arquivo <strong>tun.ko</strong>&lt;/p&gt;</li>
<li> Se não existir, é necessário compilar este módulo no kernel e não explicarei nesta documentação como realizar tal procedimento.</li>
<li>Instale os pacotes openvpn, openssl, ssh e rdesktop</li>
</ol>
<p>apt-get update<br />
apt-get install openvpn openssl ssh rdesktop</p>
<p>4. Baixe os fontes *.deb do Nx no site www.nomachine.com</p>
<p>Por questão de dependência, é necessário baixar e instalar o nxclient, nxnode e nxserver, nessa ordem respectivamente.</p>
<p>dpkg -i nxclient_2.1.0-11_i386.deb</p>
<p><a id="Configurando_o_OpenVpn" name="Configurando_o_OpenVpn"></a></p>
<h3>Configurando o OpenVpn</h3>
<p>Existem vários modos de operação no OpenVpn, como <strong>Point-toPoint</strong>, <strong>Secret</strong> e <strong>TLS</strong>, estou utilizando o modo TLS, porque é o mais seguro. Não irei detalhar como funciona os outros modos citados acima. No caso do TLS, para utilizá-lo é preciso criar uma autoridade certificadora (ca), um certificado (cert), a chave privada (key) e a chave Diffie Hellman (dh) que são responsáveisl por autenticar a chave pública usada no cliente. Junto com o pacote openvpn vem alguns scripts que auxiliam na criação desses arquivos.</p>
<p>Copie a pasta /usr/share/doc/openvpn/examples/easy-rsa para /etc/openvpn/, então acesse /etc/openvpn/easy-rsa/2.0/</p>
<p>Edite o arquivo vars com as informações de país, estado e etc, então execute os comando abaixo preenchendo as informações necessárias:</p>
<ul>
<li> source ./vars # para carregar as varÃ¡veis editadas nesse arquivo</li>
</ul>
<ul>
<li> ./clean-all # para limpar todos os certificados, se eles existirem</li>
</ul>
<ul>
<li> ./build-ca # cria a autoridade certificadora</li>
</ul>
<ul>
<li> ./build-key-server server # cria o certificado e chave privada do servidor com os nomes server.crt e server.key</li>
</ul>
<ul>
<li> ./build-dh # cria a chave Diffie Hellman de 1024 bits</li>
</ul>
<ul>
<li> ./build-key-pass cliente # cria a chave pública com senha que deverá ser utilizada pelo cliente, com os nomes cliente.crt e cliente.key.</li>
</ul>
<p><strong>Atenção</strong>: não esqueça essa senha, ela será usada para a conexão do cliente.</p>
<p>Todos as chaves e certificados criados serão gravados no diretório <strong>/etc/openvpn/easy-rsa/2.0/keys/</strong>. Se já não estiver, o faça, e permita que somente o root tenha acesso a esse diretório.</p>
<p>Copie esse diretório keys para /etc/openvpn/</p>
<p>Crie e edite o arquivo /etc/openvpn/openvpn.conf com o conteúdo abaixo:</p>
<p>#Arquivo de configuracao do servidor VP<br />
#Interface virtual de rede utilizada<br />
dev tun<br />
# Modo de utilizacao da VPN<br />
tls-server<br />
# Arquivo de log e seu nivel<br />
log /etc/openvpn/vpn.log<br />
verb 3<br />
# Faixa de rede que sera utilizada na VPN<br />
# 20.0.0.1 # IP virtual do Servidor<br />
# 20.0.0.2 # IP virtual do Cliente<br />
ifconfig 20.0.0.1 20.0.0.2<br />
# Certificados utilizados para autenticacao<br />
ca /etc/openvpn/keys/ca.crt<br />
cert /etc/openvpn/keys/server.crt<br />
key /etc/openvpn/keys/server.key<br />
dh /etc/openvpn/keys/dh1024.pem<br />
# Porta padrao<br />
port 1194<br />
# Definindo o user padrao para executar o<br />
# daemon &#8220;openvpn&#8221; para nobody<br />
user nobody<br />
group nobody<br />
# Restringe o processo do openvpn somente ao diretorio /tmp<br />
chroot /tmp<br />
# Utilizando LZO como biblioteca de compreensao<br />
comp-lzo<br />
# Parametros utilizados para testar se a conexao<br />
# continua &#8220;de pe&#8221; e para manter estabelecida em<br />
# caso de firewall statefull<br />
ping 15<br />
# Evita que a interface virtual tun seja reiniciada e<br />
# os arquivos de chaves relidos. Essencial quando<br />
# se utiliza user nobody para execuÃ§Ã£o do processo<br />
persist-tun<br />
persist-key</p>
<p>Reinicie o serviço openvpn: /etc/init.d/openvpn restart</p>
<p>Execute ifconfig e você verá que foi criada a interface virtual tun0 com IP 20.0.0.1, também será mostrado o IP original do computador (eth0). &lt;p style=&#8221;text-indent: 26px;&#8221; align=&#8221;justify&#8221;&gt; É interessante verificar também os logs do openvpn em <strong>/etc/openvpn/vpn.log</strong></p>
<p><a id="Configurando_o_NxServer" name="Configurando_o_NxServer"></a></p>
<h3>Configurando o NxServer</h3>
<p>Os arquivos de configuração do nx são extensos e a princípio não há alterações a serem feitas, portanto apenas reinicie o serviço nxserver: /etc/init.d/nxserver restart.</p>
<p>Para quem quer se aventurar estejam a vontade para fuçar os arquivos de configuração.</p>
<p>Pronto, até aqui seu servidor já está pronto para autenticar a VPN e também com o desktop compartilhado.</p>
<p><a id="Configurando_o_Firewall" name="Configurando_o_Firewall"></a></p>
<h3>Configurando o Firewall</h3>
<p>Antes de passar para a configuração do cliente da VPN, se você possui um firewall, devemos fazer as devidas atualizações nas suas regras.</p>
<p>Como estamos falando em acessar um computador a partir da internet, é necessário que o mesmo possua um endereço IP válido para rotear na internet.</p>
<p>Ex: 200.175.x.y, pois do contrário você não conseguirá acessa-lo. Todo mundo que está conectado a internet já tem um IP válido, procure saber qual é, porque não entrarei nos méritos dessa questão.</p>
<p>No meu caso, possuo um firewall como barreira inicial para e da internet e quase todas as implementações de firewalls são feitas para realizarem “mascaramento” de endereços que vêem da internet, com destino as máquinas da rede interna. Portanto, para que a VPN possa funcionar é necessário que <strong>não haja</strong> esse <strong>mascaramento</strong>, ou seja, haverá apenas um <em><strong>redirect</strong></em> do nosso endereço de internet (200.175.x.y ou etc) para o destino na rede local (192.168.10.1, suponha que esse seja o IP original do servidor da VPN), só que neste caso, esse servidor da VPN vai estar numa <strong>DMZ</strong>.</p>
<p>Para quem já conhece, são os mesmos procedimentos tomados para acesso a um servidor Web. Tudo isto deve ser feito para que você possa autenticar a VPN a partir da sua usando um link ADSL ou mesmo internet discada.</p>
<p>Libere acesso no firewall da internet para o servidor VPN (192.168.10.1) na porta <strong>1194</strong> protocolo <strong>UDP</strong>.</p>
<p>No meu firewall, somente essas configurações foram necessárias. De acordo com a sua segmentação de rede, podem haver mais configurações.</p>
<p><a id="Configurando_o_cliente" name="Configurando_o_cliente"></a></p>
<h3>Configurando o cliente</h3>
<p>Vamos agora configurar o computador que fará o acesso à nossa VPN, ou nosso cliente.</p>
<p>Baixe e instale o cliente OpenVPN para Windows do site www.openvpn.org. Siga as instruções de instalação normalmente e você verá em Conexões de Rede que foi criado uma interface de rede virtual de nome TUN/TAP32.</p>
<p>Nas propriedades desse dispositivo adicione o IP 20.0.0.2 e mÃ¡scara 255.0.0.0.</p>
<p>O arquivo de configuração dessa máquina cliente é quase idêntico ao do servidor, sendo adicionado somente a opção <strong>remote</strong>. Crie um arquivo em <strong>C:\Arquivos de programas\OpenVPN chamado cliente.ovpn</strong> com o conteúdo abaixo:</p>
<p># will be pulling certain config file directives<br />
# from the server.<br />
client<br />
# Use the same setting as you are using on<br />
# the server. On most systems, the VPN will<br />
# not function unless you partially or fully disable<br />
# the firewall for the TUN/TAP interface.<br />
dev tun<br />
# Are we connecting to a TCP or<br />
# UDP server? Use the same setting as<br />
# on the server.<br />
proto udp<br />
# The hostname/IP and port of the server.<br />
# You can have multiple remote entries<br />
# to load balance between the servers.<br />
Remote 200.175.x.y 1194 # esse serÃ¡ o IP e a porta usada pelo seu servidor VPN na internet.<br />
ifconfig 20.0.0.2 20.0.0.1<br />
# Keep trying indefinitely to resolve the<br />
# host name of the OpenVPN server. Very useful<br />
# on machines which are not permanently connected<br />
# to the internet such as laptops.<br />
resolv-retry infinite<br />
# Most clients don&#8217;t need to bind to<br />
# a specific local port number.<br />
nobind<br />
# Try to preserve some state across restarts.<br />
persist-key<br />
persist-tun<br />
# SSL/TLS parms.<br />
# See the server config file for more<br />
# description. It&#8217;s best to use<br />
# a separate .crt/.key file pair<br />
# for each client. A single ca<br />
# file can be used for all clients.<br />
ca ca.crt<br />
cert cliente.crt<br />
key cliente.key<br />
# Enable compression on the VPN link.<br />
# Don&#8217;t enable this unless it is also<br />
# enabled in the server config file.<br />
comp-lzo<br />
# Set log file verbosity.<br />
Verb 3</p>
<p>Copie de forma segura (disquete, pendrive, etc) as chaves do cliente e o certificado que foram criados no Linux, e cole em C:\Arquivos de programas\OpenVPN. São eles:</p>
<ul>
<li> ca.crt</li>
<li> cliente.crt</li>
<li> cliente.key (somente)</li>
</ul>
<p>Copie openvpn.exe e os dois arquivos *.dll que estão em C:\Arquivos de programas\OpenVPN\bin para C:\Arquivos de programas\OpenVPN\. &lt;p style=&#8221;text-indent: 26px;&#8221; align=&#8221;justify&#8221;&gt;Pronto, nossa VPN já pode ser levantada. Crie um arquivo vpn.bat com o conteúdo abaixo, ele iniciará o processo da VPN.</p>
<p>&#8220;C:\Arquivos de programas\OpenVPN\openvpn.exe&#8221; &#8211;config cliente.ovpn &#8211;tls-client</p>
<p>Confirme se o servidor OpenVPN está em execução na máquina com Linux. Execute vpn.bat. Será necessário fornecer a senha usada na criação da chave do cliente. Se tudo der certo você verá algumas informações repetidas de tentativa de adição de rotas (é normal, inclusive a mensagem de erro no final), deixe o prompt aberto, não o feche.</p>
<p>Abra outro prompt do DOS e tente pingar 20.0.0.1, se responder pronto, nossa VPN estÃ¡ funcionando.</p>
<p>Detalhe: o próprio Daemon do OpenVPN, tanto no Linux, como no Windows, já cria as rotas padrões para a conexão.</p>
<p>Baixe e instale o cliente NX para Windows do site www.nomachine.com</p>
<p>Abra esse cliente e crie uma nova sessão com um nome qualquer, host 20.0.0.1 porta 22 e escolha o método de acesso de acordo com sua conexão (Ex: ADSL).</p>
<p>Na próxima tela escolha Unix; KDE; a resolução que quer usar e o <strong>mais importante:</strong> habilite criptografia TLS para todo o tráfego. Assim, tudo que for transmitido para ambos os lados será criptografado. Perceba que teremos 2 níveis de segurança: um na VPN que já é criptografada e outro do próprio cliente NX, que também garante a segurança de todo o tráfego.</p>
<p>Crie um atalho no desktop e pronto.</p>
<p>Conecte-se com o cliente NX instalado e forneça usuário e senha. Esses são os mesmos que você utiliza para efetuar logon no Desktop KDE do Linux. Tudo certo, você verá no seu desktop Windows uma janela que mostra o desktop do servidor Linux, no caso o KDE.</p>
<p>Verifique os computadores com Windows XP ou servidores com 2000 ou 2003 (Terminal Server deve estar habilitado) os quais você irá querer fazer acesso remoto. No XP libere conexão ao Desktop a partir de Propriedades do Sistema. Pronto já podemos acessar o Windows. Preste atenção na ponte que será utilizada para esse acesso: Windows na minha casa <strong>→</strong> Servidor Linux no trabalho <strong>→</strong> Windows XP ou 2003 no trabalho.</p>
<p>Na tela do Linux (KDE) que você está vendo no seu Desktop Windows, abra um konsole e digite:</p>
<p><strong>rdesktop ip_ou_nome_do_computador_que_quer_acessar &amp;</strong></p>
<p>rdesktop 192.168.10.20 &amp;<br />
rdesktop computador20 &amp;</p>
<p>Pronto agora, de forma segura, você pode administrar qualquer computador da sua rede a partir da sua casa. Divirta-se!!!</p>
<p><a id="Autor" name="Autor"></a></p>
<h2>Autor</h2>
<ul>
<li> Bruno Roberto</li>
<li> brunaocomanda@gmail.com</li>
</ul>
<p style="text-align: right;">Fonte: http://under-linux.org/</p>
<div class="shr-publisher-350"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/04/28/administracao-remota-usando-openvpnnxserver/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como Montar um Servidor NTP</title>
		<link>http://blog.deserv.info/2010/04/09/como-montar-um-servidor-ntp/</link>
		<comments>http://blog.deserv.info/2010/04/09/como-montar-um-servidor-ntp/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 00:52:44 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[datahora]]></category>
		<category><![CDATA[ntp]]></category>
		<category><![CDATA[ntpd]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[sincronizando relógios]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=325</guid>
		<description><![CDATA[O que é? A grosso modo podemos dizer que o NTP é um protocolo que visa manter os relógios dos diversos equipamentos de rede sincronizados. http://pt.wikipedia.org/wiki/NTP Para que relógios sincronizados? Simples, em caso de ataques ou análise de logs é muito importante que todos os equipamentos estejam com os relógios acertados. Imagine que você precise [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.deserv.info%252F2010%252F04%252F09%252Fcomo-montar-um-servidor-ntp%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2Fcv2ZpP%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Como%20Montar%20um%20Servidor%20NTP%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><h2>O que é?</h2>
<p>A grosso modo podemos dizer que o <acronym title="Network Time  Protocol">NTP</acronym> é um protocolo que  visa manter os relógios dos  diversos equipamentos de rede sincronizados.<br />
<a href="http://pt.wikipedia.org/wiki/NTP" target="_blank">http://pt.wikipedia.org/wiki/NTP</a></p>
<h2>Para que relógios sincronizados?</h2>
<p>Simples, em caso de ataques ou análise de logs é muito  importante que todos os equipamentos estejam com os relógios acertados.</p>
<p>Imagine que você precise ver o que um usuário fez, primeiro você  olha o firewall, horário de entrada 09:03:42, depois olha o servidor  web, horário de acesso 09:02:07, depois o servidor de email, 09:15:48,  cada maquina com um horário diferente e que foram acessadas praticamente  ao mesmo tempo. <span id="more-325"></span></p>
<p>Ao verificar o relógio de cada maquina você vê uma diferença  absurda em cada relógio, você pode fazer isso ai nas suas maquinas para  constatar, nenhum terá o horário igual a outra, a diferença varias em  minutos e não em segundos.</p>
<p>Isso é muito prejudicial, e no horário de verão? Ajustar o  horário maquina por maquina?</p>
<p>Todos esse problemas podem ser resolvidos usando o <acronym title="Network Time Protocol">NTP</acronym>, por exemplo, para  sincronizar uma maquina basta utilizar o comando.</p>
<pre>ntpdate pcdsh05.on.br
13 Jun 11:16:45 ntpdate[1437]: adjust time server 200.20.186.75 offset -0.032176 sec
</pre>
<p>Com esse comando eu sincronizo o meu Linux com o servidor <acronym title="Network Time Protocol">NTP</acronym> <em>pcdsh05.on.br</em>,  esse servidor é do <a href="http://www.on.br/">Observatório Nacional</a></p>
<p>Essa solução é totalmente viável para apenas uma ou duas  maquinas mas se você quiser sincronizar todas as maquina da rede isso  fica um pouco complicado devido a trafego na Internet, o protocolo é bem  compacto, usa <em>UDP</em> e cada troca de informação são usados poucos  pacotes como podemos ver abaixo</p>
<pre>11:22:28.967672 IP 10.10.1.7.123 &gt; 10.10.1.1.123: NTPv4, Client, length 48
11:22:28.967888 IP 10.10.1.1.123 &gt; 10.10.1.7.123: NTPv4, Server, length 48
11:22:28.968853 IP 10.10.1.7.123 &gt; 10.10.1.1.123: NTPv4, Client, length 48
11:22:28.969001 IP 10.10.1.1.123 &gt; 10.10.1.7.123: NTPv4, Server, length 48
11:22:28.969550 IP 10.10.1.7.123 &gt; 10.10.1.1.123: NTPv4, Client, length 48
11:22:28.969684 IP 10.10.1.1.123 &gt; 10.10.1.7.123: NTPv4, Server, length 48
11:22:28.970373 IP 10.10.1.7.123 &gt; 10.10.1.1.123: NTPv4, Client, length 48
11:22:28.970516 IP 10.10.1.1.123 &gt; 10.10.1.7.123: NTPv4, Server, length 48
</pre>
<p>Porem isso sendo feito por algunas centenas de maquina gera  bastante trafego no seu link, para contornar isso irei mostrar como  montar um servidor <acronym title="Network Time Protocol">NTP</acronym> em sua própria rede.</p>
<h2>Maquina usada nos testes</h2>
<pre>cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 7
model name      : Pentium III (Katmai)
stepping        : 3
cpu MHz         : 501.212
cache size      : 512 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 2
wp              : yes
bogomips        : 1004.19
</pre>
<pre>free
             total       used       free     shared    buffers     cached
Mem:        254048     230196      23852          0      74748      63128
-/+ buffers/cache:      92320     161728
Swap:       522104         96     522008
</pre>
<pre>cat /etc/fedora-release
Fedora Core release 4 (Stentz)
</pre>
<h2>Softwares necessários</h2>
<p>Para instalar usando o Fedora Core basta digitar o comando</p>
<pre>yum install ntp</pre>
<p>Com isso será instalado tanto os softwares clientes como o  servidor.</p>
<p>Ou você pode baixar a ultima versão do site http://www.ntp.org/</p>
<h2>Configurando o servidor</h2>
<p>Para configurar o servidor basta editar apenas um arquivo <a href="http://www.dotsharp.com.br/download/ntp.conf">/etc/ntp.conf</a> essa é a copia do arquivo que estou usando atualmente.</p>
<p>Não vou me estender muito nas configuração que podem ser feitas  no arquivo, para isso você pode ler o arquivo que está disponível no  site da RPN em <a href="http://www.rnp.br/_arquivo/cais/manual_ntp_v1b.pdf">http://www.rnp.br/_arquivo/cais/manual_ntp_v1b.pdf</a> essa documentação é muito boa, nesse arquivos irei centralizar na  criação rápida e fácil de um servidor.</p>
<pre># Permite acesso ao servidor para sincronizar mas nao permite modificacoes no servico
restrict default nomodify notrap noquery

# Permite acesso complete para a interface local
restrict 127.0.0.1

# Libera acesso a minha rede local
restrict 10.10.1.0 mask 255.255.255.0 nomodify notrap
restrict 10.1.0.0 mask 255.255.0.0 nomodify notrap

# Servidor para sincronizar o relógio
# Será usado em ordem
# o pcdsh05.on.br e stratum 1 todos os outros são stratum 2
server pcdsh05.on.br
server ntp.cais.rnp.br
server ntp.puc-rio.br
server ntp1.pucpr.br
server ntp.pop-rs.rnp.br
</pre>
<p>Mais servidores podem ser vistos em <a href="http://www.rnp.br/ntp/ntp-stratum2.html" target="_blank">http://www.rnp.br/ntp/ntp-stratum2.html</a></p>
<p>para ver como estão as suas permições use o comando <em>ntpdc</em>.</p>
<pre>#  ntpdc -nc reslist
   address          mask            count        flags
=====================================================================
0.0.0.0         0.0.0.0             14147  noquery, nomodify, notrap
10.1.0.0        255.255.0.0          2199  nomodify, notrap
10.10.1.0       255.255.255.0       10519  nomodify, notrap
10.10.1.1       255.255.255.255         0  ntpport, interface, ignore
127.0.0.1       255.255.255.255         2  none
127.0.0.1       255.255.255.255         0  ntpport, interface, ignore
</pre>
<p>Outro comando util é o <em>ntpq</em> com ele é possivel ver como  status dos servidores.</p>
<p>Com ele podemos ver o nivel na hierarquia que o servidor se  encontra, o delay e outras informações.</p>
<pre># ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*pcdsh05.on.br   .IRIG.           1 u  292 1024  377   45.989  -12.245   5.186
-titan.cais.rnp. 3.111.157.113    2 u  159 1024  377  180.385  -73.748 106.281
+139.82.34.11    200.143.193.3    3 u  208 1024  377   30.473  -15.311   0.586
+ntp.pucpr.br    192.5.41.209     2 u  249 1024  377   44.354  -23.184   1.113
-delta.pop-rs.rn 192.5.41.41      2 u  704 1024  377   69.726  -29.118   2.322
 LOCAL(0)        LOCAL(0)        10 l   63   64  377    0.000    0.000   0.004
</pre>
<p>Pronto agora que já configurou o arquivo basta iniciar o serviço</p>
<pre>service ntpd start</pre>
<p>e configurar para que ele seja iniciado todo vez que reiniciar a  maquina</p>
<pre>chkconfig ntpd on</pre>
<p>Pronto seu servidor está configurado e funcionando, para isso vá  em um cliente Linux e digite o comando.</p>
<pre>ntpdate SERVIDOR</pre>
<p>se você receber uma mensagem do tipo</p>
<pre>13 Jun 12:13:51 ntpdate[6157]: no server suitable for synchronization found</pre>
<p>Quer dizer que o seu servidor não está funcionando ainda, para  saber o porque digite o comando</p>
<pre>ntpdate -d SERVIDOR</pre>
<p>para executar o ntpdate em modo debug</p>
<pre>Looking for host SERVIDOR and service ntp
host found : SERVIDOR
transmit(10.10.1.7)
receive(10.10.1.7)
transmit(10.10.1.7)
receive(10.10.1.7)
transmit(10.10.1.7)
receive(10.10.1.7)
transmit(10.10.1.7)
receive(10.10.1.7)
transmit(10.10.1.7)
10.10.1.7: Server dropped: strata too high
server 10.10.1.7, port 123
stratum 16, precision -18, leap 11, trust 000
refid [10.10.1.7], delay 0.02612, dispersion 0.00000
transmitted 4, in filter 4
reference time:    00000000.00000000  Thu, Feb  7 2036  4:28:16.000
originate timestamp: c83954b4.4aeed890  Tue, Jun 13 2006 12:13:56.292
transmit timestamp:  c83954b4.4c0b45ae  Tue, Jun 13 2006 12:13:56.297
filter delay:  0.02629  0.02620  0.02617  0.02612
         0.00000  0.00000  0.00000  0.00000
filter offset: -0.00467 -0.00466 -0.00466 -0.00467
         0.000000 0.000000 0.000000 0.000000
delay 0.02612, dispersion 0.00000
offset -0.004673

13 Jun 12:13:56 ntpdate[6158]: no server suitable for synchronization found
</pre>
<p>Com isso podemos encontrar o problema na linha <em>stratum 16,  precision -18, leap 11, trust 000</em> essa linha fala que o nosso  servidor está em stratum 16, esse é o stratum máximo de um servidor <acronym title="Network Time Protocol">NTP</acronym>, ou seja, ele está em um  nível muito baixo e que não é confiável para ser usado para atualização  de nossas maquinas.</p>
<p>Mas porque isso está acontecendo se tudo está configurado  corretamente?</p>
<p>Fácil de responder, basta olhar no log do seu servidor.</p>
<pre>tail /var/log/messages
Jun 13 12:13:16 SERVIDOR ntpd[1688]: ntpd 4.2.0a@1.1196-r Fri May 12 09:51:35 EDT 2006 (1)
Jun 13 12:13:17 SERVIDOR ntpd[1688]: precision = 3.000 usec
Jun 13 12:13:17 SERVIDOR ntpd[1688]: Listening on interface wildcard, 0.0.0.0#123
Jun 13 12:13:17 SERVIDOR ntpd[1688]: Listening on interface wildcard, ::#123
Jun 13 12:13:17 SERVIDOR ntpd[1688]: Listening on interface lo, 127.0.0.1#123
Jun 13 12:13:17 SERVIDOR ntpd[1688]: Listening on interface eth0, 10.10.1.7#123
Jun 13 12:13:17 SERVIDOR ntpd[1688]: kernel time sync status 0040
Jun 13 12:13:17 SERVIDOR ntpd[1688]: frequency initialized 0.000 PPM from /var/lib/ntp/drift
</pre>
<p>O servidor NTP foi iniciado só que ainda não fez nenhuma  sincronização, aguarde um pouco até aparecer algo como.</p>
<pre>Jun 13 12:16:33 SERVIDOR ntpd[1688]: synchronized to 200.20.186.75, stratum 1</pre>
<p>Pronto, pelo que você pode verificar demorou cerca de três  minutos para ele fazer a primeira sincronização, o seu pode demorar um  pouco mais, isso é feito de forma automática por um algoritimo interno  do servidor e não pode ser mudado, ele mesmo calcula quando deve buscar  uma sincronização com o servidor de stratum superior.</p>
<p>Pronto agora você pode executar o ntpdate no cliente.</p>
<pre>ntpdate SERVIDOR
13 Jun 12:22:23 ntpdate[6187]: adjust time server 10.10.1.7 offset -0.021264 sec
</pre>
<p>Pronto agora sim o nosso cliente foi sincronizado com sucesso,  uma diferença de -0.021264 segundos, essa diferença varia muito.</p>
<h2>Automatizando</h2>
<h3>Com ntpd</h3>
<p>Essa configuração <strong>é mais recomendada</strong> pois o <em>ntpd</em> utiliza um algoritimo interno para determinar a quantidade de vezes que  ele precisa sincronizar, diminuindo o trafego de pacotes ntpd em sua  rede.</p>
<p>Para fazer uma configuração mais redonda você pode configurar o  arquivo <em><a href="http://www.dotsharp.com.br/download/ntp-client.conf">/etc/ntp.conf</a></em> do cliente informando os seguintes parametros.</p>
<pre>restrict default nomodify notrap noquery
restrict 127.0.0.1
server 10.10.1.1
server  127.127.1.0     # local clock
fudge   127.127.1.0 stratum 10
driftfile /var/lib/ntp/drift
broadcastdelay  0.008
keys            /etc/ntp/keys
</pre>
<p>Com esse simples arquivo de configuração o cliente irá manter o  relógio sincronizado, porém somente a própria maquina poderá acessar  a  interface aonde o NTP está rodando.</p>
<p>Para ativar o serviço basta executar os seguintes comandos</p>
<pre># chkconfig ntpd on
# service ntpd start
Starting ntpd:                                             [  OK  ]
</pre>
<h3>Com ntpdate</h3>
<p>Para  deixar as maquinas sincronizado a cada hora, basta criar  um script no diretório<em> /etc/cron.hourly/</em> chamado <em>timesync</em> com a seguinte linha.</p>
<pre>#vi /etc/cron.hourly/timesync
</pre>
<pre>#!/bin/sh
/usr/sbin/ntpdate -s 10.10.1.1
</pre>
<p>A opção -s server para ele não mostrar nada na saida padrão, o  retorno será enviado para o syslog coloco ele como executável.</p>
<pre>#chmod +x /etc/cron.hourly/timesync</pre>
<p>Pronto desta forma a minha maquina será sincronizada toda hora.</p>
<p>O NTPDate está sendo descontinuado <a href="http://ntp.isc.org/bin/view/Dev/DeprecatingNtpdate" target="_blank">http://ntp.isc.org/bin/view/Dev/DeprecatingNtpdate</a>,  porém eu ainda utilizo ele para fazer os testes iniciais de  funcionamento do servidor, essa informação foi passada pelo <em>Marcos  Vinicius Lazarini</em>.</p>
<h2>Horário de verão</h2>
<p>Para evitar problemas com o horário de verão eu configuro os  meus servidor para usarem o relógio de hardware em UTC, para fazer isso  no Fedora sigo os seguintes passos</p>
<p>Edito o arquivo <em>/etc/sysconfig/clock</em> e altero a linha <em>UTC=false</em> para <em>UTC=true</em>, executo o comando.</p>
<pre>hwclock --set --date="HH:MM" –utc</pre>
<p>Para poder ajustar o relógio do hardware para UTC, três horas a  menos que o nosso horário.</p>
<p>Como o NTP só configura relógio de software o relógio de  hardware ficará com uma referência que pode ser entendida  posteriormente.</p>
<p>Para verificar o horário de Greewich acesse <a href="http://www.timeanddate.com/worldclock/city.html?n=45" target="_blank">http://www.timeanddate.com/worldclock/city.html?n=45</a></p>
<h2>Cisco IOS</h2>
<p>Para configurar o roteador Cisco para utilizar o servidor NTP é  bem simples, acesso seu roteador e siga os comandos.</p>
<pre>Router&gt; enable
password: *********
Router# config t
Router(config)# ntp server 10.10.1.1
Router(config)# ntp server 10.10.1.2
Router(config)# exit
Router# wr mem
</pre>
<h2>Maquinas com Microsoft Windows</h2>
<h3>Windows XP</h3>
<p>Duplo clique o relógio na barra de tarefas<br />
Clicar na aba horário na Internet<br />
Marcar a opção sincronizar automaticamente e colocar o endereço do  seu servidor e clicar em atualizar agora.<br />
Pronto</p>
<p>É importante lembrar que o serviço <em>Horário do Windows</em> tem que estar iniciado</p>
<p>O Windows só atualiza o relógio a cada 10 dias e não funcionou  corretamente em meus testes.</p>
<h3>Windows 2000/2003</h3>
<p><em>Colaboração de Marcos Vinicius Lazarini</em></p>
<p>No  Windows 2000 em diante inclusive o Windows XP  existe um  serviço para sincronizar o relógio interno. para utiliza-lo você deve  abrir o Prompt de Comand.</p>
<p>Clique em Inciar -&gt; Executar.</p>
<p>Digite <em>cmd</em> e clique em OK.</p>
<p>No Prompt de Comando digite.</p>
<pre>net stop w32time
net time /setsntp:SERVIDOR
net start w32time
</pre>
<p>Lembrando que o serviço <em>Horário do Windows</em> deve estar  configurado como <em>automático</em>.</p>
<h3>Outras versões do Windows</h3>
<p>Você pode usar o programa <a href="http://www.dotsharp.com.br/programas/SP_TimeSync.html">SP_TimeSync</a>,   que eu uso, ou o <a href="http://www.dotsharp.com.br/programas/About_Time.html">About Time</a> ambos são gratuitos e funcionam bem melhor que o do Windows XP por dois  motivos, posso usar em outras versões do Windows e também posso  especificar em que período de tempo deverá ocorrer os sincronismos do  relógio.</p>
<h2>FAQ</h2>
<h3>Meu horário esta sendo atualizado com 3 horas a mais do que o  meu horário real</h3>
<p>Quando instalei o fedora, coloquei como São Paulo e marquei a  opção [X] UTC</p>
<p>Agora apenas entrei via setup e desmarquei esta opção UTC.</p>
<p>Agora quando executo o date, aparece BRT ao invés de UTC</p>
<p><em>Cristiano Borges Brasil</em></p>
<h3>the NTP socket is in use, exiting</h3>
<p>Esse problema que você está é porque o seu cliente Linux está  rodando o daemon do NTP.</p>
<p>Para resolver esse problema é bem facil, basta parar o serviço  do ntpd</p>
<pre>service ntpd stop</pre>
<p>Dai basta executar o ntpdate</p>
<h2>Referências</h2>
<ul>
<li><a href="http://www.ntp.org/" target="_blank">http://www.ntp.org/</a></li>
<li><a href="http://pt.wikipedia.org/wiki/NTP" target="_blank">http://pt.wikipedia.org/wiki/NTP</a></li>
<li><a href="http://www.rnp.br/_arquivo/cais/manual_ntp_v1b.pdf" target="_blank">http://www.rnp.br/_arquivo/cais/manual_ntp_v1b.pdf</a></li>
<li><a href="http://www.rnp.br/ntp/ntp-hierarquia.html" target="_blank">http://www.rnp.br/ntp/ntp-hierarquia.html</a></li>
<li><a href="http://www.on.br/" target="_blank">http://www.on.br/</a></li>
<li><a href="http://pcdsh01.on.br/" target="_blank">http://pcdsh01.on.br/</a></li>
<li><a href="http://www.rnp.br/ntp/ntp-stratum2.html" target="_blank">http://www.rnp.br/ntp/ntp-stratum2.html</a></li>
<li><a href="http://www.timeanddate.com/worldclock/city.html?n=45">http://www.timeanddate.com/worldclock/city.html?n=45</a></li>
<li><a href="http://www.arachnoid.com/abouttime/index.html">http://www.arachnoid.com/abouttime/index.html</a></li>
<li><a href="http://www.spdialer.com/timesync/">http://www.spdialer.com/timesync/</a></li>
</ul>
<h1>Autor</h1>
<p><a href="http://www.dotsharp.com.br/autores/Rodrigo_Luis_Silva.html">Rodrigo  Luis Silva</a> é especialista em sistemas GNU/Linux com ampla  experiência em diversas áreas, trabalha a mais de seis anos focado em  desvendar os diversos recursos existentes nesse sistema operacional.</p>
<p style="text-align: right;">Fonte: http://www.dotsharp.com.br</p>
<div class="shr-publisher-325"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/04/09/como-montar-um-servidor-ntp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Servidor web &#8211; Apache &#8211; dicas e tutoriais</title>
		<link>http://blog.deserv.info/2010/02/20/servidor-web-apache-dicas-e-tutoriais/</link>
		<comments>http://blog.deserv.info/2010/02/20/servidor-web-apache-dicas-e-tutoriais/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 13:44:30 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Apache 2]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[CL]]></category>
		<category><![CDATA[Conectiva]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[FC]]></category>
		<category><![CDATA[Fedora Core 5]]></category>
		<category><![CDATA[Firewall]]></category>
		<category><![CDATA[Kubuntu]]></category>
		<category><![CDATA[OpenSuse]]></category>
		<category><![CDATA[Página Protegida]]></category>
		<category><![CDATA[Proteção de Diretório]]></category>
		<category><![CDATA[Servidor Web]]></category>
		<category><![CDATA[Sistemas Operacionais Arquiteturas x86 e 64]]></category>
		<category><![CDATA[Suse]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=314</guid>
		<description><![CDATA[Sobre este documento

Versão simplificada do documento em formato texto, dicas e indicação de material relacionado ao servidor web Apache, linhas de comando e exemplos de configuração pronto para copiar e colar, mais detalhes, veja indicações no final deste documento, consulte também o FAQ com mensagens da Linux-br.

Os comandos e dicas podem não atender as suas necessidades, não ser compatível com sua instalação, use como referencia, tente adaptar ao seu ambiente.]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.deserv.info%252F2010%252F02%252F20%252Fservidor-web-apache-dicas-e-tutoriais%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FbOtSLH%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Servidor%20web%20-%20Apache%20-%20dicas%20e%20tutoriais%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><hr size="1" noshade="noshade" />
<h1>Sobre este documento</h1>
<p>Versão simplificada do documento em formato texto, dicas e indicação de material relacionado ao servidor web Apache, linhas de comando e exemplos de configuração pronto para copiar e colar, mais detalhes, veja indicações no final deste documento, consulte também o FAQ com mensagens da Linux-br.</p>
<p>Os comandos e dicas podem não atender as suas necessidades, não ser compatível com sua instalação, use como referencia, tente adaptar ao seu ambiente.  <span id="more-314"></span></p>
<hr size="1" noshade="noshade" />
<ul>
<li><a href="http://200.204.198.164/zago/apache.html#toc2">O que é Apache?</a></li>
<li><a href="http://200.204.198.164/zago/apache.html#toc3">Indicações para aplicação interna</a></li>
<li><a href="http://200.204.198.164/zago/apache.html#toc4">Instalar, iniciar e testar o servidor web</a>
<ul>
<li><a href="http://200.204.198.164/zago/apache.html#toc5">CentOS 5.0</a></li>
<li><a href="http://200.204.198.164/zago/apache.html#toc6">FC5 &#8211; Fedora core 5 arquitetura x86_64</a></li>
<li><a href="http://200.204.198.164/zago/apache.html#toc7">OpenSUSE 11.1</a></li>
<li><a href="http://200.204.198.164/zago/apache.html#toc8">SUSE 10</a></li>
<li><a href="http://200.204.198.164/zago/apache.html#toc9">SUSE 10 e 10.1 &#8211; Diretório com senha &#8211; página protegida</a></li>
<li><a href="http://200.204.198.164/zago/apache.html#toc10">SUSE 10.1 &#8211; i386</a></li>
<li><a href="http://200.204.198.164/zago/apache.html#toc11">Conectiva 10</a></li>
<li><a href="http://200.204.198.164/zago/apache.html#toc12">CL10 &#8211; Diretório com senha &#8211; página protegida</a></li>
<li><a href="http://200.204.198.164/zago/apache.html#toc13">kubuntu 6.06</a></li>
<li><a href="http://200.204.198.164/zago/apache.html#toc14">Debian (Sarge 3.1)</a></li>
</ul>
</li>
<li><a href="http://200.204.198.164/zago/apache.html#toc15">Firewall &#8211; Regras de iptables</a></li>
<li><a href="http://200.204.198.164/zago/apache.html#toc16">DNS</a></li>
<li><a href="http://200.204.198.164/zago/apache.html#toc17">Google &#8211; incluir e excluir páginas &#8211; robots.txt</a></li>
<li><a href="http://200.204.198.164/zago/apache.html#toc18">Ambiente de testes</a></li>
<li><a href="http://200.204.198.164/zago/apache.html#toc19">Indicação de sites e material relacionado ao servidor Apache</a>
<ul>
<li><a href="http://200.204.198.164/zago/apache.html#toc20">Apache + Java</a></li>
<li><a href="http://200.204.198.164/zago/apache.html#toc21">Senhas, autenticação e controles de acesso</a></li>
<li><a href="http://200.204.198.164/zago/apache.html#toc22">Estatisticas e relatórios</a></li>
</ul>
</li>
</ul>
<hr size="1" noshade="noshade" /><a name="toc1"></a></p>
<p><a name="toc2"></a></p>
<h1>O que é Apache?</h1>
<p>O que significa apache?</p>
<p>Apache é um servidor de páginas web, quer saber mais?.</p>
<p>Digite na caixa de pesquisa do google, <code>define:apache</code> não entendeu porque está em ingles? então use tradutor do próprio google, copie a URL atual e no final da página, clique em &#8220;Ferramentas de idiomas&#8221;, cole o endereço, clique em &#8220;traduzir&#8221;, ou acesse diretamente o tradutor em <a href="http://translate.google.com/translate_t">http://translate.google.com/translate_t</a> ou CTRL+T abre outra aba no browser para colar a URL.</p>
<p>Já que está procurando no google, na caixa de pesquisa, acrescente ao termo pesquisado  +apache ~linux, exemplos:</p>
<pre>    senha  +apache ~linux
    server +apache ~linux
    how to apache ~linux
</pre>
<p>Use e abuse da criatividade, tente com outras variações, use também expressões em ingles e o tradutor.</p>
<p>Consulte as páginas do manual; <code>man apache</code></p>
<p>Procurando listas de discussão?, pesquise por algo semelhante a;</p>
<pre>  lista apache-br
  mail list apache ~linux
  mailing list apache ~linux
</pre>
<p><a name="toc3"></a></p>
<h1>Indicações para aplicação interna</h1>
<p>Apache como servidor web tem destinação como servidor de páginas para internet, mas pode ser usado como um servidor web para acesso restrito, servir exclusivamente para estações da rede interna.</p>
<p>Considere usar o micro que compartilha a internet, firewall ou proxy como um servidor web interno, não consome muitos recursos, consome espaço em HD conforme o que for disponibilizado.</p>
<p>Algumas vantagens de manter o servidor web interno.</p>
<p>Disponibilizar a página da empresa em maquina interna, economia de banda, ou disponibizar documentos diversos, tutoriais, instruções, normas da empresa e etc&#8230;</p>
<p>Baixar arquivos grande e disponibilizar internamente, grande economia de banda, download interno muito rápido, separação destes arquivos com o do servidor de arquivos, proteção contra virus quando acessado por estações windows, evita que usuários fiquem navegando na net a procura do pacote e outras vantagens&#8230;</p>
<p>Criar páginas com senha para restringir o acesso, utilizo muito em casos de copia de HD, em reinstalações, principalmente do windows, não perco tempo, simplesmente faço copia completa para um diretório protegido por senha, depois passo o anti-virus do Linux e passo o login e senha ao usuário para acessar via Freenx ou winscp e copiar o que for de interesse dele.</p>
<p>Disponibilizar relatorios do SARG, relatórios de uso da internet com dados dos logs do Squid.</p>
<p>Webmail interno, considere usar servidor de e-mail interno com webmail e neste servidor fazer o controle de e-mail, aplicar suas regras e filtros.</p>
<p>Repositório local do seu gerenciador de pacotes smart, apt e etc.., use as imagens ISO da distro para disponibilizar a instalação de pacotes, faça o mesmo com pacotes extras da distro, tem exemplos nos tutorias sobre smart e algumas distro.</p>
<p>Disponibilizar gravador de CD via rede, para backup ou outras apliações, via browser (web).</p>
<p><a name="toc4"></a></p>
<h1>Instalar, iniciar e testar o servidor web</h1>
<p>Neste documento tem tópico especifico sobre algumas distro, em cada distribuição, muda alguns comandos e detalhes da configuração, procure neste documento pelo tópico especifico sobre sua distro e versão, quando não encontrar, tente fazer via Webmin, tem modulo de configuração do Apache, cofigura o servidor web em diversas distro, procure no menu do Webmin por;</p>
<p>Servers -&gt; Apache Webserver</p>
<p>Pesquise também nas ferramentas de sua distro, algumas tem seu próprio configurador, como yast no SUSE, Drakconf no Mandriva e etc&#8230;</p>
<p>Não esqueça de pesquisar no melhor manual de todos Google&#8230;.</p>
<p>Testar funcionamento do servidor apache, na propria maquina coloque na URL de algum navegador; <code>http://localhost</code>, ou <code>http://ip-da-maquina</code>, neste formato <code>http://192.168.1.3</code>, utilizando IP pode testar a partir de outra maquina da rede ou via internet com IP da internet, isto abre a página padrão em algumas distro ou lista o diretório vazio, caso falhe, então verifique se o servidor está rodando, se está ouvindo na porta 80, se tem regras de firewall liberando, considere que algumas operadores de ADSL bloqueiam a porta 80, alguns modem ADSL tem regras internas fazendo este bloqueio e muitos outros detalhes, portanto verifique o funcionamento na maquina local e depois tente localizar e isolar o probleam da conexão externa.</p>
<p>Obter informações do servidor, requer lynx instalado, execute no console uma das opções abaixo, pode ser na própria maquina ou outra qualquer da rede local, ou via web use o IP da internet ou dominio quando o servidor responde por um, execute neste formato;</p>
<pre>  lynx -dump -head http://localhost
  lynx -dump -head http://192.168.1.2
  lynx -dump -head http://www.dominio.com
</pre>
<p>Exemplo de resultado obtido na rede interna, resposta do server no OPENSUSE</p>
<pre>  suse64:~ # lynx -dump -head http://192.168.1.2
  HTTP/1.1 200 OK
  Date: Mon, 27 Mar 2006 02:11:20 GMT
  Server: Apache/2.2.0 (Linux/SUSE)
  Connection: close
  Content-Type: text/html
</pre>
<p>Reinstalar o Apache, antes de qualquer ação, faça copia dos arquivos de confgiuração, salve em outro local, por segurança, faça também backup dos dados, para reinstalar precisa; parar o serviço, pelo gerenciador de pacotes remover e depois instalar, neste processo vai gravar os arquivos de configuração default, fazendo a copia antes, tem como voltar ou usar na comparação, na remoção do apache o gerenciador de pacotes não remove os diretórios de dados onde estão as páginas web ou apontando o link simbolico, pelo menos não removeu quando tetei, mas isto muda conforme o gerenciador de pacotes e distro, portanto um backup antes nunca é demais.</p>
<p><a name="toc5"></a></p>
<h2>CentOS 5.0</h2>
<p>Instalar servidor web (apache)</p>
<pre>  yum install httpd -y
  yum install httpd-manual -y # documentação - opcional mas recomendado
  service httpd start  # iniciar somente agora.
  chkconfig httpd on  # iniciar automaticamente junto com boot
</pre>
<p>Veja também as dicas no tópico sobre FC5, são semelhantes e se aplicam também no CentOS 5.0</p>
<p><a name="toc6"></a></p>
<h2>FC5 &#8211; Fedora core 5 arquitetura x86_64</h2>
<p>Instalar e iniciar o servidor de páginas web &#8211; httpd-2.2.0-5.1.2@x86_64</p>
<p>Não testei em arquitetura ix86, acredito que não tem diferenças, pode seguir este tutorial também em instalações ix86, com cautela nos nomes dos pacotes que mudam de arquitetura, onde consta x86_64 deve ser algo entre i386 e i686, os arquivos de configuração e pacotes são os mesmos, muda somente a terminação do arquivo e mirrors (servidores de pacotes na internet)</p>
<p>Neste tópico não tive preocupação com segurança nem configuração de DNS, este servidor não está de cara para internet, funciona somente como servidor interno para FreeNX, webmail, web local, relatórios do SARG (Squid) e repositório local do smart para a rede interna (intranet).</p>
<p>Segue varias maneiras de instalar o servidor web, utilize somente uma delas;</p>
<p>Instalar via smart;</p>
<pre>  smart install httpd -y
  smart install httpd-manual -y # documentação - opcional mas recomendado
  service httpd start  # iniciar somente agora.
  chkconfig httpd on  # iniciar automaticamente junto com boot
</pre>
<p>Prontinho, acesse a partir da maquina local ou qualquer outra estação da rede, basta usar o IP do servidor na URL do navegador, acessa a página de teste &#8220;Fedora Core Test Page&#8221;</p>
<p>Crie diretórios abaixo de /var/www/html e disponibilize páginas para a rede interna, relatórios do Sarg e muito mais&#8230;.</p>
<p>Faça mais um teste, crie um diretório e copie uma figura ou texto, exemplo, criar o diretório programas para disponibilizar programas aos usuários da rede internet,</p>
<pre>  mkdir /var/www/html/programas

  cp arquivo.txt /var/www/html/programas
</pre>
<p>Na URL do navegador informe o IP mais o diretório, exemplo para servidor com IP 192.168.1.3, na URL fica assim;</p>
<p><code>192.168.1.3/programas</code></p>
<p>prontinho, vai acessar o texto &#8220;arquivo.txt&#8221; via navegador.</p>
<p>Criar sub-diretórios ou links para outros locais, crie abaixo de /var/www/html/ e para acessar, acrescente o nome do sub-diretório após o IP, neste formato;</p>
<p><code>http://IPouDominio/diretorio/</code></p>
<p><code>http://192.168.1.2/diretorio/</code></p>
<p>Disponibilizar outros diretórios, por exemplo o diretório /home/zago/guiaz, crie um link neste formato;</p>
<p><code>ln -s /caminho/origem/local /var/www/html/nome-do-local</code></p>
<p><code>ln -s /home/zago/guiaz /var/www/html/guiaz</code></p>
<p>Para acessar, na URL use este formato;</p>
<p><code>http://192.168.1.2/nome-do-local/</code></p>
<p>Arquivos de configuração ficam em <code>/etc/httpd</code></p>
<p>O caminho default do servidor de páginas em <code>/var/www/html/</code></p>
<p>Aproveite para instalar também a documentação, está no pacote httpd-manual, acesse; /var/www/manual/index.html, coloque na URL do konqueror ou navegue até lá, ou se preferir, crie um link para acessar também a partir de outras maquinas da rede</p>
<pre>  mkdir /var/www/html/manual

  ln -s /var/www/manual/index.html /var/www/html/manual
</pre>
<p>Nas demais maquinas da rede, acrescente  /manual/ após o IP na URL, neste formato;</p>
<p><code>http://192.168.1.2/manual/</code></p>
<p><a name="toc7"></a></p>
<h2>OpenSUSE 11.1</h2>
<p>Ambiente, OpenSUSE 11.1 instalado como estação de trabalho, rodando em ambiente grafico KDE 4.1 sem atualizações, com repositorio somente da imagem ISO do DVD local.</p>
<p>Instalar via yast em modo texto, simplesmente execute;</p>
<pre>  yast -i apache2
  sed -i "s/Options None/Options All/g" /etc/apache2/default-server.conf
  chkconfig apache2 on
  rcapache2 start
</pre>
<p>Prontinho, acesse este servidor de qualquer maquina de sua rede, digite o IP deste servidor na URL de seu navegador para acessar as paginas.</p>
<p>Neste tópico não tive preocupação com segurança nem configuração de DNS, este servidor não está de cara para internet, o firewall nega acesso externo, funciona somente como servidor interno, paginas web para rede interna, webmail, web local, relatórios do SARG (Squid) e repositório local de alguns programas (intranet), liberando a porta 80 para o mundo, qualquer um acessa este servidor pelo IP, basta indicar o IP na URL do navegador, como exemplo acesse o FAQ.</p>
<p><a href="http://200.204.198.164/zago/">http://200.204.198.164/zago/</a></p>
<p>Crie diretorios dentro de /srv/www/htdocs/ ou link para outros locais.</p>
<p>Exemplo para liberar todo o /home para outras maquinas da rede, nunca crie link para o /home, sempre indique o caminho completo do diretorio, dentro do /home estão os diretorios dos usuários, neste caso os dados pessoais cai na rede com acesso livre, sem senha e sem restrição via navegador.</p>
<pre>  mkdir /srv/www/htdocs/servidor

  ln -s /home /srv/www/htdocs/servidor

  Para acessar, na URL use este formato;

http://192.168.1.206/servidor
</pre>
<p>Veja outros topicos neste documento, tem opções e dicas para outras versões do SUSE que se aplica nesta versão.</p>
<p><a name="toc8"></a></p>
<h2>SUSE 10</h2>
<dl>
<dt>Consulte &#8220;Suse Linux Referêcia&#8221;, a configuração do Apache inicia na página 711 deste guia, como baixar este documento e mais dicas sobre ferramentas e aplicativos do SUSE 10 em;</dt>
<dd> </dd>
<dt><a href="http://www.zago.eti.br/distro/suse10-dicas.html">http://www.zago.eti.br/distro/suse10-dicas.html</a> </dt>
<dd> Instalar e iniciar o servidor de páginas web &#8211; Apache/2.0.54 (Linux/SUSE).  Neste tópico não tive preocupação com segurança nem configuração de DNS, este servidor não está de cara para internet, funciona somente como servidor interno para FreeNX, webmail, web local, relatórios do SARG (Squid) e repositório local do smart para a rede interna (intranet).  Segue varias maneiras de instalar o servidor web, utilize somente uma delas;  Instalar Apache2 via smart;</p>
<pre>  smart install apache2 -y
  sed -i "s/Options None/Options All/g" /etc/apache2/default-server.conf
  chkconfig apache2 on
  rcapache2 start
  #documentação opcional...
  smart install apache2-doc -y
  smart install apache2-example-pages -y
  smart install suselinux-manual_pt_BR -y
</pre>
</dd>
</dl>
<p>Instalar Apache2 via Yast</p>
<p>Instalar via yast em modo texto, simplesmente execute;</p>
<pre>  yast -i apache2
  sed -i "s/Options None/Options All/g" /etc/apache2/default-server.conf
  chkconfig apache2 on
  rcapache2 start
</pre>
<p>Em ambiente gráfico, execute yast2, entre em &#8220;serviços de rede&#8221; -&gt; &#8220;Servidor HTTP&#8221;, tem muitas opções de configuração, tentei a configuração default, confirmei todos os serviços e pacotes, inclusive o bind, instalou sem mensagens de erro, parece tudo OK, mesmo assim falhou, nem iniciou uma página de testes, via Yast2 ou webmin não consegui liberar sub-diretórios para montar servidor web interno, tentei liberando acesso geral com chmod e outras opções nos .conf mas persiste no erro de leitura protegida.</p>
<p>A solução foi alterar em /etc/apache2/default-server.conf a diretiva (Options None) para (Options All), use seu editor preferido para editar;</p>
<pre>  /etc/apache2/default-server.conf

  Localize (#Options None), remova o comentario e altere de None para All como neste exemplo;

  #Options None
  Options All
</pre>
<p>Ou em uma tacada só, copiar e colar, altera também as linhas comentadas, faça copia do arquivo antes da alteração, execute;</p>
<p><code>cp /etc/apache2/default-server.conf /etc/apache2/original-default-server.conf</code></p>
<p><code>sed -i "s/Options None/Options All/g" /etc/apache2/default-server.conf</code></p>
<p>Iniciar o servidor web (apache 2), sempre que alterar alguma diretiva de confiuguração precisa reinicar o servidor Apache, execute, <code>rcapache2 restart</code></p>
<p>Pronto para acessar, use o IP da maquina na URL, quando vazio exibe a lista de arquivos e diretórios, crie ou copie sua página em /srv/www/htdocs/, ou instale a página de exemplo;</p>
<p><code>smart install apache2-example-pages -y</code></p>
<p>Este exemplo é muito simples, instala o index.html e robots.txt, quando acessa o raiz exibe a mensagem <code>It works!</code>, edite esta mensagem em /srv/www/htdocs/index.html, se quiser as páginas indexadas nos mecanismos de busca, edite ou remova o robot.txt</p>
<p>Crie links para outros locais, ou crie sub-diretórios abaixo de /srv/www/htdocs/ e para acessar, acrescente o nome do sub-diretório após o IP, neste formato;</p>
<p><code>http://IPouDominio/diretorio/</code></p>
<p><code>http://192.168.1.2/diretorio/</code></p>
<p>Quando instalar a documentação, localize os index.html com find, (find / -name index.html), depois acesse via navegador local.</p>
<p>/usr/share/doc/manual/suselinux-manual_pt_BR/manual/index.html</p>
<p>/usr/share/doc/packages/</p>
<p>Pode criar link para acessar via navegador na maquina local ou a partir de qualquer maquina da rede, informando o IP mais o diretório ou arquivo, em meus testas acusava erro na troca de página, removi estas linhas de comando temporariamente, somente até descobrir a solução, caso queira tentar, serve como referencia as dicas abaixo.</p>
<p>Disponibilizar páginas e documentação no servidor Apache local, pode ser outros diretórios já existentes na maquina, como páginas do manual ou outros arquivos, por exemplo o diretório /home/zago/guiaz, pode criar um link no raiz ou criar criar sub-diretório como nome-do-local, crie também link neste formato;</p>
<pre>  mkdir /srv/www/htdocs/nome-do-local

  ln -s /caminho/origem/local /srv/www/htdocs/nome-do-local

  ln -s /home/zago/guiaz /srv/www/htdocs/nome-do-local

  Para acessar, na URL use este formato;

http://192.168.1.2/nome-do-local/
</pre>
<p>Prontinho, vai cair no diretório para onde criou o link, abrindo index.html, caso ele não exista, então listará os arquivos e diretórios no mesmo formato quando acessa o raiz deste site.</p>
<p>Quando falhar, siga esta dica.</p>
<p>Mensagen de erro quando tenta acessar páginas antes de alterar para a diretiva &#8220;Options All&#8221;, ao tentar acesso por outra maquina da rede, retorna esta mensagem no browser</p>
<pre>  Access forbidden!

  You don't have permission to access the requested directory. There is either no index document or the directory is read-protected. 

  If you think this is a server error, please contact the webmaster. 

  Error 403

  192.168.1.240
   Sun Oct 23 22:45:28 2005
   Apache/2.0.54 (Linux/SUSE)
</pre>
<p>Nos logs registra este erro;</p>
<pre>  linux:/var/log/apache2 # tail access_log
  192.168.1.53 - - [23/Oct/2005:22:31:05 -0200] "GET / HTTP/1.1" 403 1018 "-" "Mozilla/5.0 (compatible; Konqueror/3.2; Linux) (KHTML, like Gecko)"

  linux:/var/log/apache2 # cat error_log
  [Sun Oct 23 22:30:57 2005] [notice] mod_python: Creating 32 session mutexes based on 150 max processes and 0 max threads.
  [Sun Oct 23 22:30:58 2005] [notice] Apache/2.0.54 (Linux/SUSE) configured -- resuming normal operations
  [Sun Oct 23 22:31:05 2005] [error] [client 192.168.1.53] Directory index forbidden by rule: /srv/www/htdocs/
</pre>
<p>Arquivos de configuração em <code>/etc/apache2</code></p>
<p>Caminho do servidor de páginas <code>/srv/www/htdocs</code></p>
<p>Esta configuração foi testada depois de configurado pelo Yast2, ainda não tentei instalar usando somente comandos do smart.</p>
<p>Configurando via webmin 1.240 retorna esta mensagem;</p>
<p><code>O arquivo executável /usr/sbin/httpd2-worker do servidor Apache não existe. Se o apache está instalado, ajuste a configuração do módulo para usar o caminho correto.</code></p>
<p>Clique na parte que der foco na mensagem acima e altere a diretiva &#8220;Caminho do executável httpd&#8221;, preencha com &#8220;/usr/sbin/httpd2-prefork&#8221;, pode salvar que abre nas configurações do servidor httpd.</p>
<p>Aproveite para instalar também a documentação e página de exemplo (apache2-doc e apache2-example-pages), acesse acrescentando /manual/ após o IP na URL, neste formato;</p>
<p><code>http://192.168.1.2/manual/</code></p>
<p><a name="toc9"></a></p>
<h2>SUSE 10 e 10.1 &#8211; Diretório com senha &#8211; página protegida</h2>
<p>Ambiente; SUSE 10 ou OPENSUSE 10.1, rodando apache2 sem problemas, outras maquinas da rede ou web acessando páginas ou diretórios.</p>
<p>Proteger diretórios no servidor web, pedir login e senha para liberar acesso a diretórios do servidor apache2.</p>
<p>Exemplo de como pedir login e senha para acessar um diretório, proteger o diretório  <code>/srv/www/htdocs/livros</code></p>
<p>criar diretório e chamar editor &#8220;vi&#8221;;</p>
<pre>  mkdir /srv/www/htdocs/livros
  cd /srv/www/htdocs/livros
  vi .htaccess # ou seu editor preferido
</pre>
<p>segue copia do meu .htpasswd, ajuste somente o diretório a proteger.</p>
<p>opensuse101:~ # cat /srv/www/htdocs/livros/.htaccess</p>
<pre>  AuthUserFile /etc/apache2/.htpasswd
  AuthGroupFile /dev/null
  AuthName "Aceso Restrito"
  AuthType Basic

  Options All
  &lt;Limit GET POST&gt;
  require valid-user
  &lt;/Limit&gt;
</pre>
<p>Editar /etc/apache2/httpd.conf, inserir após a última linha o texto abaixo:</p>
<pre>  #primeiro diretorio a proteger
  &lt;Directory "/srv/www/htdocs/livros"&gt;
  AllowOverride All
  &lt;/Directory&gt;
</pre>
<p>Criar usuário e senha, pode e deve ser diferente do usuário do sistema</p>
<p><code>htpasswd2 -c -b -m /etc/apache2/.htpasswd usuario senha</code></p>
<p><code>htpasswd2 -c -b -m /etc/apache2/.htpasswd zago minhasenha</code></p>
<p>Reiniciar o servidor web; <code>rcapache2 restart</code></p>
<p><code>-c</code> cria novo arquivo de senhas, remove usuários já existentes, para adicionar novos usuários mantendo os  já existentes, elimine a diretiva -c, para adicionar novos usuários, use neste formato.</p>
<p><code>htpasswd2  -b -m /etc/apache2/.htpasswd zago minhasenha</code></p>
<p>Pronto, teste o acesso, informando na URL o IP mais o diretório;</p>
<p><code>http://192.168.1.53/livros/</code></p>
<p>Quando OK abre a tela de login e senha, (user e passwd), quando falhar reveja a configuração.</p>
<p>Atenção&#8230;</p>
<p>Depois de qualquer alteração, antes de efetuar novo teste de conexão, no servidor tem que reiniciar o apache, no cliente tem que fechar o navegador e abrir novamente.</p>
<p>Trocar senha;</p>
<p><code>htpasswd2 -b -m /etc/apache2/.htpasswd zago novasenha</code></p>
<p>Criar novos usuários;</p>
<p><code>htpasswd2 -b -m /etc/apache2/.htpasswd novouser umasenha</code></p>
<p>Para meu uso na rede interna está muito bom, em micros de cara para internet requer uma pesquisa sobre segurança, senha forte e outras formas de controle/autenticação.</p>
<p>Existem outras maneiras de controlar o acesso e autenticação, como exemplo segue o link sobre PAM com modulo para Apache;</p>
<p><a href="http://pam.sourceforge.net/mod_auth_pam/">http://pam.sourceforge.net/mod_auth_pam/</a></p>
<p><a name="toc10"></a></p>
<h2>SUSE 10.1 &#8211; i386</h2>
<dl>
<dt>Consulte &#8220;Suse Linux Referêcia&#8221;, como baixar este documento e mais dicas sobre ferramentas e aplicativos do SUSE 10.1</dt>
<dd> </dd>
<dt><a href="http://www.zago.eti.br/distro/suse10.1-dicas.html">http://www.zago.eti.br/distro/suse10.1-dicas.html</a> </dt>
<dd> Instalar e iniciar o servidor de páginas web &#8211; Apache/2.2.0 (Linux/SUSE). Neste tópico não tive preocupação com segurança nem configuração de DNS, este servidor não está de cara para internet, funciona somente como servidor interno para FreeNX, webmail, web local, relatórios do SARG (Squid) e repositório local do smart para a rede interna (intranet).  Segue as linhas de comando para instalar o servidor web Apache2 via smart; </dd>
</dl>
<pre>  smart install apache2 -y
  sed -i "s/Options None/Options All/g" /etc/apache2/default-server.conf
  chkconfig apache2 on
  rcapache2 start
  #documentação opcional...
  smart install apache2-doc -y
  smart install apache2-example-pages -y
  smart install suselinux-manual_pt_BR -y
</pre>
<p>No comando &#8220;rcapache2 start&#8221; deve retornar mensagem semelhante a esta;</p>
<pre>  opensuse101:/home/zago # chkconfig apache2 on
  opensuse101:/home/zago # rcapache2 start
  Starting httpd2 (worker)                                              done
</pre>
<p>OK, servidor apache no AR, crie links, diretórios ou páginas a partir de /srv/www/htdocs/, exemplo para criar o diretório com estas mensagens do FAQ.</p>
<p><code>mkdir /srv/www/htdocs/zago/</code></p>
<p>Copiar os textos para este diretório e acessar de qualquer maquina, informe o IP e diretório, neste exemplo acesse;</p>
<p><a href="http://200.204.198.164/zago">http://200.204.198.164/zago</a></p>
<p>Veja mais dicas no tópico sobre SUSE 10.1, as dicas sobre link e criar diretórios são iguais nas duas versões SUSE, procure também no menu deste documento &#8220;SUSE 10&#8243;.</p>
<p><a name="toc11"></a></p>
<h2>Conectiva 10</h2>
<p>No Conectiva o Apache &#8211; servidor web &#8211; já vem configurado com página padrão de exemplo, colocar esta página no ar é muito simples, basta executar:</p>
<pre>  apt-get install apache
  service apache start
</pre>
<p>Prontinho, servidor web rodando, faça o teste, na própria maquina abra o navegador e digite na URL o próprio IP da maquina, ou simplesmente <code>localhost</code>, acessar a partir de outra maquina da rede, na URL coloque o IP da maquina que está rodando o apache para acessar a página padrão, veja um exemplo desta página, acesse 200.204.198.164.</p>
<p>Aproveite e instale também a documentação para acessar a partir da página padrão.</p>
<p><code>apt-get install apache-doc</code></p>
<p>Esta página padrão fica em /srv/www/default/html, pode substitui-la ou criar diretórios, veja o exemplo para a documentação, quando instalada fica no sub-diretório manual.</p>
<p>Iniciar o servidor junto com o boot da maquina, toda vez que ligar o micro inicia também o servidor web; <code>chkonfig apache on</code></p>
<p>Conferir se está rodando; <code>service apache status</code></p>
<p>Acompanhe o log do apache</p>
<p><code>tail -f /var/log/httpd/access_log</code></p>
<p>veja também:</p>
<p><code>/var/log/httpd/error_log</code></p>
<p>Criar repositório de programas, considere usar o servidor como um servidor web interno, com acesso somente pelas estações da rede, pode instalar quantos servidor quiser pela rede.</p>
<p>Exemplo para criar o diretório programas para disponibilizar programas para as demais estações rede, Firefox, OpenOffice, anti-virus e outros utilitários, basta criar o diretório, tornar um usuário como dono para salvar os arquivos e prontinho, veja estes comandos para criar o diretório programas e tornar o usuário zago o dono do diretório para dar manutenção, salvar e remover progrmas no diretório;</p>
<pre>  mkdir /srv/www/default/html/programas
  chown zago /srv/www/default/html/programas
</pre>
<p>Acessar este diretório, na URL dos navegadores das maquinas da rede, use o IP do servidor mais o diretório, neste formato;</p>
<p><code>http://192.168.1.3/programas/</code></p>
<p>Observe que o acesso via linha de comando é diferente da indicação na URL, o local é o mesmo, a diferença está forma de acesso, via browser o diretório raiz é o html que fica em /srv/www/default/html.</p>
<p>Manutenção neste diretório, em ambiente gráfico faça remotamente via konqueror com fish ou via ssh -X, com outros serviços como; mount (NFS), Freenx, winscp, scp, acesse via ssh e baixe via wget, tem muitas maneiras&#8230;</p>
<p>Este servidor interno tem muitas vantagens, faz o download uma única vez, economiza banda, agiliza o download, evita perda de tempo dos usuários procurando na net pelo pacote e outras vantagens.</p>
<p>OBS., CL10 instalado com CD upd1 vem com apache 2.0.49, o httpd.conf default desta versão do apache no CL10 não mostra os diretórios abaixo de /srv/www/default/html ou retornar no navegador a mensagem de acesso negado.</p>
<p>Solução; altere em /etc/apache/conf/httpd.conf, procure pela diretiva <code>Options None</code>, altera para <code>Options All</code>, depois reinicie o apache <code>service apache restart</code> e prontinho, pode acessar os diretórios criados abaixo de html sem problemas, utilizo este recurso em servidores exclusivo para rede interna, em servidor de cara para internet pesquise sobre segurança e outros cuidados como criar link para o diretório onde está a página.</p>
<p>Colinha do zago (faz a alteração indicada acima, basta copiar e colar);</p>
<p><code>sed -i "s/Options None/Options All/g" /etc/apache/conf/httpd.conf</code></p>
<p><code>service apache restart</code></p>
<p>Falha ao iniciar o Apache, quando obter o resultado abaixo.</p>
<p><code>service apache start</code></p>
<pre>  Iniciando Apache web server (httpd): httpd: Could not determine the server's
  fully qualified domain name, using 127.0.0.1 for ServerName
                                                                  [FALHOU]
</pre>
<p>Isto indica erro no nome da maquina, alterou depois da instalação do CL10 ou está usando menos de 3 termos na identificação, tem que corrigir para algo no formato.</p>
<p>server.zago.eti.br, maquina.dominio.net, maquina.dominio.com.br e etc.. não pode usar menos que 3 palavras nesta identificação, procure fazer esta alteração pelo linuxconf, basta instalar o linux e entrar na configuração de rede, procure o local onde aparece o nome da maquina e dominio, faça a alteração que deverá funcionar sem problemas, caso queira tentar pelo modo manual, altere em /etc/hosts e nas configurações da placa de rede que estão abaixo de /etc/sysconfig.</p>
<p><a name="toc12"></a></p>
<h2>CL10 &#8211; Diretório com senha &#8211; página protegida</h2>
<p>Ambiente; Conectiva 10 rodando servidor web, considerando o uso com as configurações default da instalação, proteger diretório contra acesso indesejado, criar diretório squid com acesso exclusivo de um usuário, por segurança deve alterar user e senha deste exemplo, também deve ser diferente de usuários do sistema.</p>
<p>Neste exemplo a seguir, usuário = squid e senha = minhasenha.</p>
<p>criar diretório squid e dentro dele o arquivo de cotrole .htaccess.</p>
<p><code>mkdir /srv/www/default/html/squid</code></p>
<p>use seu editor preferido ou vi /srv/www/default/html/squid/.htaccess crie o arquivo /srv/www/default/html/squid/.htaccess com este conteúdo.</p>
<pre>  AuthUserFile /etc/.htpasswd
  AuthGroupFile /dev/null
  AuthName "Area Squid"
  AuthType Basic
  &lt;Limit GET&gt;
  require user squid
  &lt;/Limit&gt;
</pre>
<p>use seu editor preferido ou vi /etc/apache/conf/httpd.conf edite o /etc/apache/conf/httpd.conf para incluir as linhas abaixo no final dele.</p>
<pre>  &lt;Directory /srv/www/default/html/squid&gt;
  require user squid
  AuthType Basic
  AuthName squid
  AuthUserFile /etc/.htpasswd
  &lt;/Directory&gt;
</pre>
<p>crie o arquivo de senhas, neste exemplo; login=squid, senha=minhasenhacd /etc</p>
<p>Execute a linha de comando dentro do diretório que deseja proteger e onde criou  o arquivo .htaccess, neste exemplo o caminho é este.</p>
<p>cd /srv/www/default/html/squid/</p>
<p><code>htpasswd -cb /etc/.htpasswd squid minhasenha</code></p>
<p>reinicie o serviço apache</p>
<p>&#8220;service apache restart &#8220;</p>
<p>No navegador da maquina ou de outra da rede, na URL use IP/squid, exemplo;</p>
<p><code>http://192.168.1.3/squid/</code></p>
<p>Na tela de autenticação informe em usuário=squid  senha=minhasenha</p>
<p><a name="toc13"></a></p>
<h2>kubuntu 6.06</h2>
<p>Instale o pacote apache2, via seu gerenciador de pacotes, ou execute no konsole do root</p>
<p>aptitude install apache2</p>
<p>Prontinho, apache instalado e rodando, para acessar a página default, use o IP do servidor apache na URL do navegador, pode ser na própria maquina ou outra qualquer da rede, isto acessa o diretório raiz e mostra o diretório da página default, também mostra a versão (Apache/2.0.55 (Ubuntu)). Caso falhe, verifique se não ocorreu erros durante a intalação, se não tem restrição no firewall ou outro problema na rede.</p>
<p>O raiz do servidor web fica em /var/www/, faça test com copia de algum arquivo texto ou página web, ou crie diretórios, exemplo para criar diretório programas,</p>
<p>mkdir /var/www/programas</p>
<p>Copie algum arquivo texto ou páginas em HTML e acesse via navegador, acrescente /programas depois do IP, neste formato.</p>
<p>192.168.1.2/programas</p>
<p><a name="toc14"></a></p>
<h2>Debian (Sarge 3.1)</h2>
<p>Como root em linha de comando;</p>
<p><code>aptitude install apache</code></p>
<p>Após o dialogo, Servidor web instalado e iniciado automaticamente,</p>
<p>Exemplo para criar o diretório programas para disponibilizar programas para as demais estações rede, Firefox, OpenOffice, anti-virus e outros utilitários, basta criar o diretório, tornar um usuário como dono para salvar os arquivos e prontinho, veja estes comandos para criar o diretório programas e tornar o usuário zago o dono do diretório para dar manutenção, salvar e remover programas no diretório;</p>
<pre>    mkdir /var/www/programas
    chown zago /var/www/programas
</pre>
<p>Acessar este diretório, na URL dos navegadores das maquinas da rede, use o IP do servidor mais o diretório, neste formato;</p>
<p><code>http://192.168.1.3/programas/</code></p>
<p>Observe que o acesso via linha de comando é diferente da indicação na URL, o local é o mesmo, a diferença está na forma de acesso, via browser o diretório raiz é o www que fica em /var/www.</p>
<p>Acompanhe o log em;</p>
<p><code>tail -f /var/log/apache/access.log</code></p>
<p><a name="toc15"></a></p>
<h1>Firewall &#8211; Regras de iptables</h1>
<p>O acesso ao servidor web é feito pela porta 80, precisa abrir esta porta no firewall para liberar o acesso.</p>
<p>Em servidores internos, servidor apache para fornecer programas e documentos somente para a rede interna, quando instalado em micro de cara para internet, como no caso de micros compartilhando a internet e fazendo o firewall. Neste ambiente, quando deseja fechar para o mundo e abrir somente para a rede interna, em micros com duas placas de rede, use esta regra no firewall.</p>
<pre>  ##### Libera servidor web somente para rede interna, fechar para o mundo.
  $iptables -A INPUT -p tcp --dport 80 -i $EXTERNA -j DROP
  $iptables -A INPUT -p tcp --dport 80 -i $INTERNA -j ACCEPT
</pre>
<p>No exemplo acima DROP fecha acesso na interface externa e ACCEPT libera acesso na interface interna, desta forma permite acesso somente quando vem da rede local (ACCEPT na interface $INTERNA), fecha acesso vindo da internet (DROP na interface $EXTERNA ). Altere conforme seu firewall também as variaveis $iptables para o caminho do iptables, $EXTERNA para interface externa conectada ao mundo, $INTERNA para interface interna ligada a rede interna.</p>
<p>As duas regras com ACCEPT libera  tudo,  tanto para acessos vindo da rede interna como da internet.</p>
<p>$iptables, $EXTERNA e $INTERNA são variaveis definidas no inicio do firewall, faça o mesmo no seu firewall ou use o device em lugar da variavel (eth0, eth1&#8230;)</p>
<dl>
<dt>Página com FAQ e mais dicas sobre firewall.</dt>
<dd> </dd>
<dt><a href="http://www.zago.eti.br/firewall/A-menu-firewall.html">http://www.zago.eti.br/firewall/A-menu-firewall.html</a></dt>
<dd> </dd>
</dl>
<p><a name="toc16"></a></p>
<h1>DNS</h1>
<dl>
<dt>Configuração de DNS veja FAQ;</dt>
<dd> </dd>
<dt><a href="http://www.zago.eti.br/dns.txt">http://www.zago.eti.br/dns.txt</a></dt>
<dd> </dd>
<dt><a href="http://www.zago.eti.br/dns1.txt">http://www.zago.eti.br/dns1.txt</a></dt>
<dd> </dd>
<dt><a href="http://www.zago.eti.br/dns-redeinterna.txt">http://www.zago.eti.br/dns-redeinterna.txt</a></dt>
<dd> Servidor web interno com acesso colocando IP na URL não precisa configurar DNS, para usar dominio, mesmo em rede interna precisa configurar alguma forma de resolver nomes. Servidores para o mundo também pode ser acessado pelo IP, por exemplo este; 200.204.198.164, também precisa de cuidados especiais, para responder por dominios, obrigatoriamente precisa do DNS. Pense na segurança. </dd>
</dl>
<p><a name="toc17"></a></p>
<h1>Google &#8211; incluir e excluir páginas &#8211; robots.txt</h1>
<p>Não sei explicar os mecanismos de pesquisa do Google, Yahoo e muitos outros.</p>
<p>Sei que procuram pelo arquivo robots.txt, caso encontre este arquivo no seu site, eles respeitam as instruções, exemplo que informa para todos que não deve pesquisar neste site, crie um arquivo no raiz do site com nome de robots.txt com este conteúdo.</p>
<pre>  User-Agent: *
  Disallow: /
</pre>
<p>O exemplo acima é copia do kernel.org, como tem este arquivo no raiz, seu conteúdo não é pesquisado nem aparece nas pesquisas dos mecanismos de busca.</p>
<p><a href="ftp://mirrors.kernel.org/robots.txt">ftp://mirrors.kernel.org/robots.txt</a></p>
<p>Sem este arquivo no raiz do site, os mecanismos de busca acham qualquer página em seu servidor web sem proteção por senha, mesmo quem não usa um domínio e coloca o servidor no ar com acesso somente via IP, como é meu caso que mantenho o FAQ em um servidor sob um dominio e também mantenho um mirror do FAQ em minha maquina com IP fixo, o Google pega os dois.</p>
<p>Basta alguma referencia na web para acessarem seu IP, nem precisa solicitar a inclusão de suas páginas, de forma automatica, periodicamente os robots do Google acessam seu servidor para atualizar o banco de dados, não sei informar com qual frequência nem critérios, nas páginas dele tem informações e endereços para entrar em contato.</p>
<p>Verifique nos logs do Apache que acha o IP destes mecanismos de buscas, alguns tem identificação, quando aparece somente o IP dá um pouco de trabalho, tem que pegar o IP e levantar de quem são, neste meio aparece Google e outros mecanismos de busca.</p>
<p>Isto é muito bom, não paga nada para divulgar seu site, nem precisa fazer cadastro, não precisa fazer nada, basta colocar o site no ar que depois de algum tempo vai aparecer nos mecanismos de busca, inclusive o Google, caso queira, pode se fazer o cadastro, na maioria dos mecanismo de busca tem alguma opção, alguns tem até classificação por assunto e etc&#8230;</p>
<p>Quando não quiser o conteúdo de seu servidor web ou páginas fazendo parte das pesquisas do Google, siga estas dicas.</p>
<dl>
<dt>Como excluir suas páginas ou servidor web das pesquisas do Google.</dt>
<dd> </dd>
<dt>Informações do Google para Webmasters &#8211; Googlebot: Indexador do Google</dt>
<dd> </dd>
<dt><a href="http://www.google.com/webmasters/bot.html#howoften">http://www.google.com/webmasters/bot.html#howoften</a></dt>
<dd> </dd>
</dl>
<p><a name="toc18"></a></p>
<h1>Ambiente de testes</h1>
<p>Considere criar um ambiente para testar configurações, não adianta reclamar que não tem &#8220;verba&#8221;, não custa nada, o pouco tempo que investir agora vai lhe poupar muito mais no futuro além de evitar muitos problemas, considere um bom investimento de tempo, pode instalar diversos Servidores web pela rede sem problema algum, veja estas dicas.</p>
<p>A maneira mais segura, utilize duas maquinas da rede, nestas maquinas tem a liberdade de testar tudo antes de fazer promessas, o mais importante, sem gastos e tudo legalmente, faça instalação dual-boot, assim quando terminar os testes, reinicie a maquina e selecione a opção de boot normal, tudo fica como antes, já entendeu!, nestas maquinas ficam duas instalações, uma para o trabalho normal e outra de testes.</p>
<p>Utilize estações da rede para instalar dual-boot, siga estas dicas.</p>
<dl>
<dt>Veja dicas de como fazer duas instalações Linux no mesmo HD, utilize estações para testes, evite em servidores embora seja possivel, passo a passo em</dt>
<dd> </dd>
<dt><a href="http://www.zago.eti.br/boot_div.txt">http://www.zago.eti.br/boot_div.txt</a></dt>
<dd> </dd>
<dt>Dual boot Linux e windows &#8211; Aproveite e veja a dica sobre backup da instalação completa do windows na partição Linux, quando algum virus comer o windows ou precisar reinstalar, vai poupar muito tempo, basta uma simples cópia de volta para recuperar a instalação do windows, passo a passo em.</dt>
<dd> </dd>
<dt><a href="http://www.zago.eti.br/boot-dual-win-e-linux.html">http://www.zago.eti.br/boot-dual-win-e-linux.html</a></dt>
<dd> </dd>
</dl>
<p>Nesta estação (instalação) de testes, vai utilizar somente parte do espaço do HD e nada mais.</p>
<p>Com o Apache configurado na maquina de testes, utilize qualquer estação da rede para acessa-la.</p>
<p>Prontinho, tem tudo que precisa para testar configuração , diretivas de configuração, testes de páginas, uso de scripts e banco de dados, quando concluir a configuração, basta repetir o processo no principal, ou simplificando, copiar os arquivos de configuração.</p>
<p>Considere manter esta instalação como backup do servidor, em casos de emergencia, nunca se sabe quando vai ocorrer acidentes, queimar a maquina, HD ou uma pane qualquer no servidor, nestas situações basta ajustes no DNS, IP, dominio, eventualmente troca de local ou cabos para subir esta instalação em lugar do servidor principal, em minutos se faz a troca do IP e sobe o backup do servidor web, o maior problema é restaurar os dados, sobre backup e restore voce já sabe como lidar, mantenha o backup atualizado nela também.</p>
<p><a name="toc19"></a></p>
<h1>Indicação de sites e material relacionado ao servidor Apache</h1>
<p>FAQ com mensagens da lista Linux-br em;</p>
<dl>
<dt><a href="http://www.zago.eti.br/apache.txt">http://www.zago.eti.br/apache.txt</a></dt>
<dd> </dd>
<dt><a href="http://www.zago.eti.br/apache1.txt">http://www.zago.eti.br/apache1.txt</a></dt>
<dd> </dd>
<dt><a href="http://www.zago.eti.br/apache2.txt">http://www.zago.eti.br/apache2.txt</a></dt>
<dd> </dd>
<dt><a href="http://www.zago.eti.br/apache-2.0.txt">http://www.zago.eti.br/apache-2.0.txt</a></dt>
<dd> </dd>
<dt><a href="http://www.zago.eti.br/asp.txt">http://www.zago.eti.br/asp.txt</a></dt>
<dd> </dd>
<dt>Documentação oficial &#8211; Inicie pelo site do projeto, muita documentação, lista de discussão, download e muito mais, acesse;</dt>
<dd> </dd>
<dt><a href="http://httpd.apache.org/">http://httpd.apache.org/</a></dt>
<dd> </dd>
</dl>
<p>Algumas indicações, material em portugues e aplicativos.</p>
<dl>
<dt>Servidor Web &#8211; Apache</dt>
<dd> </dd>
<dt><a href="http://www.conectiva.com/doc/livros/online/10.0/servidor/pt_BR/ch10.html#www.apache">http://www.conectiva.com/doc/livros/online/10.0/servidor/pt_BR/ch10.html#www.apache</a></dt>
<dd> </dd>
</dl>
<dl>
<dt>veja também o FAQ do apache em:</dt>
<dd> </dd>
<dt><a href="http://httpd.apache.org/docs/misc/FAQ.html#indexes">http://httpd.apache.org/docs/misc/FAQ.html#indexes</a></dt>
<dd> </dd>
<dt><a href="http://www.conectiva.com.br/cpub/pt/incConectiva/suporte/pr/servidores.apache.html">http://www.conectiva.com.br/cpub/pt/incConectiva/suporte/pr/servidores.apache.html</a></dt>
<dd> </dd>
<dt><a href="http://www.conectiva.com.br/doc/livros/online/7.0/servidor/www002.html">http://www.conectiva.com.br/doc/livros/online/7.0/servidor/www002.html</a></dt>
<dd> </dd>
</dl>
<dl>
<dt>A S P &#8211; Sobre ASP no servidor Apache.</dt>
<dd> </dd>
<dt><a href="http://www.apache-asp.org/">http://www.apache-asp.org</a></dt>
<dd> </dd>
<dt>As mensagens sobre ASP estão no FAQ</dt>
<dd> </dd>
<dt><a href="http://www.zago.eti.br/asp.txt">http://www.zago.eti.br/asp.txt</a></dt>
<dd> </dd>
<dt>configurar apache</dt>
<dd> </dd>
<dt><a href="http://www.underlinux.com.br/sections.php?op=viewarticle&amp;artid=10">http://www.underlinux.com.br/sections.php?op=viewarticle&amp;artid=10</a></dt>
<dd> </dd>
</dl>
<dl>
<dt>JAVA &#8211; Servidor Web Apache rodar aplicações Java por padrão precisa do jakarta tomcat. veja em:</dt>
<dd> </dd>
<dt><a href="http://jakarta.apache.org/tomcat/index.html">http://jakarta.apache.org/tomcat/index.html</a></dt>
<dd> </dd>
</dl>
<dl>
<dt>WebCounter, que é um contador muito bom e fácil de instalar noLinux. </dt>
<dd> </dd>
<dt><a href="http://www.muquit.com/muquit/software/Count/Count.html">http://www.muquit.com/muquit/software/Count/Count.html</a></dt>
<dd> </dd>
</dl>
<dl>
<dt>SSL &#8211; Site em ingles, tem um guia Apache SSL completo GRÁTIS da Thawte, sobre seguranca Apache SSL.</dt>
<dd> </dd>
<dt><a href="http://www.thawte.com/ucgi/gothawte.cgi?a=n33460139407026000">http://www.thawte.com/ucgi/gothawte.cgi?a=n33460139407026000</a></dt>
<dd> </dd>
</dl>
<dl>
<dt>Dominios vituais</dt>
<dd> </dd>
<dt><a href="http://www.dicas-l.com.br/dicas-l/20010928.shtml">http://www.dicas-l.com.br/dicas-l/20010928.shtml</a> e</dt>
<dd> </dd>
<dt><a href="http://www.dicas-l.com.br/dicas-l/19980505.shtml">http://www.dicas-l.com.br/dicas-l/19980505.shtml</a></dt>
<dd> </dd>
<dt>Virtual Host &#8211; capacidade de hospedar mais do que um web site numa única máquina, com um endereço IP ou mais. Nesse artigo aprenderemos os fundamentos básicos para se configurar virtual hosts no servidor.</dt>
<dd> </dd>
<dt><a href="http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=1638">http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=1638</a></dt>
<dd> </dd>
</dl>
<p><a name="toc20"></a></p>
<h2>Apache + Java</h2>
<dl>
<dt>rodar aplicações em java</dt>
<dd> </dd>
<dt><a href="http://tomcat.apache.org/">http://tomcat.apache.org/</a></dt>
<dd> </dd>
</dl>
<p><a name="toc21"></a></p>
<h2>Senhas, autenticação e controles de acesso</h2>
<dl>
<dt>Colocar senha em diretórios, pedir senha pra acessar via web. </dt>
<dd> </dd>
<dt><a href="http://httpd.apache.org/docs/howto/auth.html">http://httpd.apache.org/docs/howto/auth.html</a></dt>
<dd> </dd>
<dt><a href="http://httpd.apache.org/docs/misc/FAQ.html#user-authentication">http://httpd.apache.org/docs/misc/FAQ.html#user-authentication</a></dt>
<dd> </dd>
<dt>1.11. Como faço para Autenticar usuários no apache?</dt>
<dd> </dd>
<dt><a href="http://www.conectiva.com.br/cpub/pt/incConectiva/suporte/pr/sistema.rede.apache.authsenhas.html">http://www.conectiva.com.br/cpub/pt/incConectiva/suporte/pr/sistema.rede.apache.authsenhas.html</a></dt>
<dd> </dd>
<dt>Uso e Segurança com o .htaccess no Apache</dt>
<dd> </dd>
<dt><a href="http://www.devin.com.br/eitch/htaccess/">http://www.devin.com.br/eitch/htaccess/</a></dt>
<dd> </dd>
<dt>Usando script cgi na proteção de senhas, procure por password protection em <a href="http://www.cgi-resources.com/">www.cgi-resources.com</a> por exemplo.</dt>
<dd> </dd>
<dt><a href="http://httpd.apache.org/docs/location.html">http://httpd.apache.org/docs/location.html</a></dt>
<dd> </dd>
<dt><a href="http://www.apacheweek.com/features/userauth">http://www.apacheweek.com/features/userauth</a></dt>
<dd> </dd>
</dl>
<dl>
<dt>Bom resumo dos vários métodos de autenticação existentes no apache</dt>
<dd> </dd>
<dt><a href="http://sec.ure.org/apache_auth.shtml">http://sec.ure.org/apache_auth.shtml</a></dt>
<dd> </dd>
</dl>
<dl>
<dt>Criar repositório de senhas para a web,  explica também sobre os perigos de usar /etc/passwd</dt>
<dd> </dd>
<dt><a href="http://www.linuxplanet.com/linuxplanet/tutorials/1527/7/">http://www.linuxplanet.com/linuxplanet/tutorials/1527/7/</a></dt>
<dd> </dd>
<dt><a href="http://httpd.apache.org/docs-2.0/howto/htaccess.html">http://httpd.apache.org/docs-2.0/howto/htaccess.html</a> </dt>
<dd> </dd>
<dt>mini-tutorial:</dt>
<dd> </dd>
<dt><a href="http://www.bignosebird.com/apache/a10.shtml">http://www.bignosebird.com/apache/a10.shtml</a></dt>
<dd> </dd>
<dt>como configurar autenticação no apache.</dt>
<dd> </dd>
<dt><a href="http://httpd.apache.org/docs/howto/auth.html">http://httpd.apache.org/docs/howto/auth.html</a></dt>
<dd> </dd>
</dl>
<p><a name="toc22"></a></p>
<h2>Estatisticas e relatórios</h2>
<dl>
<dt>Gerar relatorios de acesso, procure e pesquise por WEBALIZER</dt>
<dd> </dd>
</dl>
<dl>
<dt>AWStats official web site &#8211; Free real-time logfile analyzer to get advanced statistics (GNU GPL).</dt>
<dd> </dd>
<dt><a href="http://awstats.sourceforge.net/">http://awstats.sourceforge.net/</a></dt>
<dd> </dd>
</dl>
<dl>
<dt>Página principal deste site (FAQ)</dt>
<dd> </dd>
<dt><a href="http://www.zago.eti.br/menu.html">http://www.zago.eti.br/menu.html</a></dt>
<dd> </dd>
</dl>
<p><!-- html code generated by txt2tags 2.3 (http://txt2tags.sf.net) --> <!-- cmdline: txt2tags -t html /home/zago/guiaz/apache.t2t --></p>
<div class="shr-publisher-314"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/02/20/servidor-web-apache-dicas-e-tutoriais/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Compartilhamento com NFS</title>
		<link>http://blog.deserv.info/2010/02/05/compartilhamento-com-nfs/</link>
		<comments>http://blog.deserv.info/2010/02/05/compartilhamento-com-nfs/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 12:47:14 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Compartilhamento de Arquivos]]></category>
		<category><![CDATA[NFS]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=307</guid>
		<description><![CDATA[Este tutorial descreve uma maneira fácil de como configurar o serviço NFS (Network File System) para habilitar o compartilhamento para uma ou mais máquinas-cliente. NFS Server Utilizando o editor de texto da sua preferência, editar o arquivo: # vi /etc/exports O arquivo deve conter a linha: /dados/backup 192.168.1.2(rw,async) Em que: /dados/backup é o diretório que [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.deserv.info%252F2010%252F02%252F05%252Fcompartilhamento-com-nfs%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2Fc710RS%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Compartilhamento%20com%20NFS%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><!-- hotwords -->Este tutorial descreve uma maneira fácil de como configurar o serviço <em>NFS (Network File System)</em> para habilitar o compartilhamento para uma ou mais máquinas-cliente.</p>
<p><span id="more-307"></span></p>
<p><strong>NFS Server</strong></p>
<p>Utilizando o  <a onclick="hwClick2340581(undefined);return false;" onmouseover="hw2340581(event, this, 'undefined'); this.style.cursor='hand'; this.style.textDecoration='underline'; this.style.borderBottom='solid';" onmouseout="hideMaybe('HOTWordsTitle'); this.style.cursor='hand'; this.style.textDecoration='underline'; this.style.borderBottom='dotted 1px'; " href="http://www.vivaolinux.com.br/dica/Compartilhamento-NFS#">editor</a> de texto da sua preferência, editar o arquivo:</p>
<p><strong># vi /etc/exports </strong></p>
<p>O  <a onclick="hwClick1340581(undefined);return false;" onmouseover="hw1340581(event, this, 'undefined'); this.style.cursor='hand'; this.style.textDecoration='underline'; this.style.borderBottom='solid';" onmouseout="hideMaybe('HOTWordsTitle'); this.style.cursor='hand'; this.style.textDecoration='underline'; this.style.borderBottom='dotted 1px'; " href="http://www.vivaolinux.com.br/dica/Compartilhamento-NFS#">arquivo</a> deve conter a linha:</p>
<div>/dados/backup 192.168.1.2(rw,async)</div>
<p>Em que:</p>
<ul>
<li> /dados/backup é o diretório que será compartilhado com as máquinas-cliente;</li>
<li> 192.168.1.2 determina o ip da máquina-cliente;</li>
<li> (rw) permissão que a máquina-cliente tem ao acessar o compartilhamento leitura e escrita (read/write);</li>
<li> (async) o NFS trabalha de forma assíncrona, ou seja, sem precisar esperar uma resposta do cliente a cada pacote enviado, isto torna a transferência de arquivo mais rápida.</li>
</ul>
<p>Se você quer que o  <a onclick="hwClick0340581(undefined);return false;" onmouseover="hw0340581(event, this, 'undefined'); this.style.cursor='hand'; this.style.textDecoration='underline'; this.style.borderBottom='solid';" onmouseout="hideMaybe('HOTWordsTitle'); this.style.cursor='hand'; this.style.textDecoration='underline'; this.style.borderBottom='dotted 1px'; " href="http://www.vivaolinux.com.br/dica/Compartilhamento-NFS#">usuário</a> remoto tenha privilégios de root, insira no final da linha: no_root_squash</p>
<div>192.168.1.2(rw,async) no_root_squash</div>
<p>Cada usuário remoto que precisar acessar nosso servidor NFS deverá ter seu endereço ip declarado no arquivo:</p>
<div>192.168.1.2(rw,async) no_root_squash<br />
192.168.1.23(rw,async)<br />
192.168.1.6(rw,async) no_root_squash<br />
192.168.1.22(ro,async)</div>
<p>A última linha foi configurada com permissão (ro) read only, com esta opção estamos informando que a máquina-cliente tem apenas permissão de leitura, ou seja, os arquivos podem ser lidos porém não alterados.</p>
<p>Salve o arquivo :wq e no terminal digite:</p>
<p><strong># exportfs </strong></p>
<p>Com esse comando o arquivo /etc/exports será lido e o kernel será atualizado com as mudanças realizadas.</p>
<p><strong>NFS Cliente</strong></p>
<p>Na máquina-cliente, abrir um terminal e digitar:</p>
<p><strong># mkdir /backup </strong></p>
<p>Em seguida, montar o diretório usando o comando mount com o parâmetro -t nfs.</p>
<p><strong># mount -t nfs 192.168.1.1:/dados/backup /backup</strong></p>
<p>Se é um compartilhando que você precisa acessar frequentemente, é recomendado que você configure no arquivo /etc/fstab para que o sistema se encarregue de montá-lo durante o processo de boot do sistema.</p>
<p><strong># vi /etc/fstab </strong></p>
<div>192.168.1.1:/dados/backup /backup nfs auto,exec 0 0</div>
<ul>
<li> 192.168.1.1:/dados/backup &#8211;  endereço do servidor NFS;</li>
<li> /backup é o diretório local do cliente;</li>
<li> nfs especifica o sistema de arquivo;</li>
<li> auto faz com que o compartilhamento seja montando durante o boot do sistema;</li>
<li> exec permite executar programas dentro do diretório compartilhado.</li>
</ul>
<p>Salvar o arquivo e saia :wq, a partir do próximo reboot do sistema seu diretório NFS já será montado automaticamente.</p>
<p>Espero que este artigo esclareça algumas dúvida.</p>
<div class="shr-publisher-307"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/02/05/compartilhamento-com-nfs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recuperando senhas de root com LILO ou GRUB</title>
		<link>http://blog.deserv.info/2010/02/04/recuperando-senhas-de-root-com-lilo-ou-grub/</link>
		<comments>http://blog.deserv.info/2010/02/04/recuperando-senhas-de-root-com-lilo-ou-grub/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 12:44:14 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Acesso Remoto]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[Grub]]></category>
		<category><![CDATA[lilo]]></category>
		<category><![CDATA[Quebrando Senha de Root]]></category>
		<category><![CDATA[Resetando Senha de Root]]></category>
		<category><![CDATA[Senha de Root]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=304</guid>
		<description><![CDATA[Não é difícil encontrar usuários iniciantes e até mesmo alguns com já alguma experiência que se deparam com situações em que não lembram suas senhas de root, ou simplesmente esqueceram a que definiram na hora da instalação de seu sistema. Existem várias maneiras para se recuperar esta senha como o popular boot em um Live [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.deserv.info%252F2010%252F02%252F04%252Frecuperando-senhas-de-root-com-lilo-ou-grub%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FaXblEj%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Recuperando%20senhas%20de%20root%20com%20LILO%20ou%20GRUB%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Não é difícil encontrar usuários iniciantes e até mesmo alguns com já alguma experiência que se deparam com situações em que não lembram suas senhas de root, ou simplesmente esqueceram a que definiram na hora da instalação de seu sistema.<br />
<span id="more-304"></span><br />
Existem várias maneiras para se recuperar esta senha como o popular boot em um Live CD para redefinir a senha na famosa gambiarra. Porém, porque dar a volta no quarteirão sabendo-se que a minha porta está logo atrás?</p>
<p>Aqui estarei explicando a maneira que, em minha experiência, foi a mais prática e simples de se fazer este procedimento. Utilizando o seu Gerenciador de Boot é simples, rápido e prático recuperar aquela senha tão importante de super usuário ou root.</p>
<p>Descreverei os processos nos dois populares Gerenciadores de Boot que todos conhecem:</p>
<h1>LILO</h1>
<p>Ao iniciar a tela de prompt do Lilo digite o seguinte comando:</p>
<p><strong>linux single</strong></p>
<p>Este comando serve para indicar que o sistema deverá iniciar em modo monousuário e assim fará login como root sem lhe pedir senha para isto. Portanto ao iniciar o sistema, você já estará como root. Você não sabe a senha, mas já é um começo. Então vamos terminar.</p>
<p>No terminal digite o seguinte comando para setar uma nova senha de root:</p>
<p><strong># passwd</strong></p>
<p>Pronto, com isso você já setou uma nova senha de root. ;]</p>
<p>Agora seguindo&#8230;</p>
<h1>GRUB</h1>
<p>Ao iniciar a tela do GRUB apresentando suas opções de boot, selecione a opção de seu <a href="http://www.vivaolinux.com.br/linux/">Linux</a> e pressione a tecla &lt;e&gt;. Assim você habilitará uma linha de comandos de inicialização. Então pressione novamente a tecla &lt;e&gt; para habilitar a escrita, então dê um espaço e em seguida acrescente o número 1 que deve ficar no final da linha e em seguida finalmente tecle ENTER e em seguida &lt;b&gt; para poder iniciar o sistema.</p>
<p>O que fizemos foi setar o sistema para iniciar em modo monousuário, logando-se automaticamente como root sem lhe pedir uma senha para isso.</p>
<p>Iniciado o sistema, basta digitar o seguinte comando para setar uma nova senha de root ou super usuário:</p>
<p><strong># passwd</strong></p>
<p>Agora você está com uma nova senha de root. ;]</p>
<p>OBS: Caso o seu Linux possua senha para iniciar em monousuário, o procedimento não dará certo. Porém em 95% dos casos ela funcionará perfeitamente.</p>
<p>Espero ter ajudado com este pequeno tutorial. Boa Sorte!</p>
<div class="shr-publisher-304"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/02/04/recuperando-senhas-de-root-com-lilo-ou-grub/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Integração simples do Apache 2 com Tomcat 5</title>
		<link>http://blog.deserv.info/2010/02/03/integracao-simples-do-apache-2-com-tomcat-5/</link>
		<comments>http://blog.deserv.info/2010/02/03/integracao-simples-do-apache-2-com-tomcat-5/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 12:41:54 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Instalação e Compilação de SW]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Apache 2]]></category>
		<category><![CDATA[httpd]]></category>
		<category><![CDATA[JRE]]></category>
		<category><![CDATA[TomCat]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=302</guid>
		<description><![CDATA[Tutorial Basico de integração do Apache 2 com Tomcat. Instalando pacotes necessários: $ sudo aptitude install apache2 libapache2-mod-jk Configurando Apache e Tomcat: Crie um arquivo workers.properties no diretório do Apache: $ sudo vi /etc/apache2/workers.properties Adicione nele as seguintes linhas: workers.tomcat_home=$CATALINA_HOME workers.java_home=$JAVA_HOME ps=/ worker.list=worker1 worker.default.port=8080 worker.default.host=localhost worker.default.type=ajp13 worker.default.lbfactor=1 Crie um arquivo tomcat.conf no diretório conf.d do [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.deserv.info%252F2010%252F02%252F03%252Fintegracao-simples-do-apache-2-com-tomcat-5%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FcZiJIw%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Integra%C3%A7%C3%A3o%20simples%20do%20Apache%202%20com%20Tomcat%205%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div>Tutorial Basico de integração do Apache 2 com Tomcat.</div>
<div><span id="more-302"></span></div>
<div>Instalando pacotes necessários:</p>
<p><strong>$ sudo aptitude install apache2 libapache2-mod-jk</strong></p>
<p>Configurando Apache e Tomcat:</p>
<p>Crie um  <a onclick="hwClick161723(undefined);return false;" onmouseover="hw161723(event, this, 'undefined'); this.style.cursor='hand'; this.style.textDecoration='underline'; this.style.borderBottom='solid';" onmouseout="hideMaybe('HOTWordsTitleBIGIframe1'); this.style.cursor='hand'; this.style.textDecoration='underline'; this.style.borderBottom='dotted 1px'; " href="http://www.vivaolinux.com.br/dica/Integracao-simples-do-Apache-2-com-Tomcat-5#">arquivo</a> <em>workers.properties</em> no diretório do Apache:</p>
<p><strong>$ sudo vi /etc/apache2/workers.properties</strong></p>
<p>Adicione nele as seguintes linhas:</p>
</div>
<div>workers.tomcat_home=$CATALINA_HOME<br />
workers.java_home=$JAVA_HOME<br />
ps=/<br />
worker.list=worker1</p>
<p>worker.default.port=8080<br />
worker.default.host=localhost<br />
worker.default.type=ajp13<br />
worker.default.lbfactor=1</p></div>
<div>
Crie um arquivo <em>tomcat.conf</em> no diretório conf.d do Apache:</p>
<p><strong>$ sudo vi /etc/apache2/conf.d/tomcat.conf</strong></p>
<p>Adicione nele as seguintes linhas:</p>
</div>
<div><span style="color: #004080;"># Where to find workers.properties</span><br />
JkWorkersFile /etc/apache2/workers.properties</p>
<p><span style="color: #004080;"># Where to put jk logs</span><br />
JkLogFile /var/log/apache2/mod_jk.log</p>
<p><span style="color: #004080;"># Set the jk log level [debug/error/info]</span><br />
JkLogLevel info</p>
<p><span style="color: #004080;"># Select the log format</span><br />
JkLogStampFormat &#8220;[%a %b %d %H:%M:%S %Y] &#8221;</p>
<p><span style="color: #004080;"># JkOptions indicate to send SSL KEY SIZE,</span><br />
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories</p>
<p><span style="color: #004080;"># JkRequestLogFormat set the request format</span><br />
JkRequestLogFormat &#8220;%w %V %T&#8221;</p>
<p><span style="color: #004080;"># Send servlet for context / to worker named worker1</span><br />
JkMount / worker1<br />
<span style="color: #004080;"># Send JSPs for context /* to worker named worker1</span><br />
JkMount /* worker1</div>
<p>Pronto, agora acesse a aplicação  <a onclick="hwClick361723(undefined);return false;" onmouseover="hw361723(event, this, 'undefined'); this.style.cursor='hand'; this.style.textDecoration='underline'; this.style.borderBottom='solid';" onmouseout="hideMaybe('HOTWordsTitle'); this.style.cursor='hand'; this.style.textDecoration='underline'; this.style.borderBottom='dotted 1px'; " href="http://www.vivaolinux.com.br/dica/Integracao-simples-do-Apache-2-com-Tomcat-5#">Tomcat</a> em http://localhost, dessa vez sem especificar a porta.</p>
<div class="shr-publisher-302"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/02/03/integracao-simples-do-apache-2-com-tomcat-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial Tomcat &#8211; Instalação e Configuração Básica</title>
		<link>http://blog.deserv.info/2010/01/22/tutorial-tomcat-instalacao-e-configuracao-basica/</link>
		<comments>http://blog.deserv.info/2010/01/22/tutorial-tomcat-instalacao-e-configuracao-basica/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 12:59:09 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Instalação e Compilação de SW]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[JSP]]></category>
		<category><![CDATA[Tom Cat]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=266</guid>
		<description><![CDATA[Nota: Na revisão 13 deste tutorial, o conteúdo foi bastante ampliado e atualizado. Os tópicos de criação e configuração de contexto sofreram as maiores mudanças, visando melhor organização e padronização do ambiente, inclusive passando a funcionar de forma unificada tanto para a versão 5 quanto a 4 do Tomcat. A revisão 18 passou a cobrir [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.deserv.info%252F2010%252F01%252F22%252Ftutorial-tomcat-instalacao-e-configuracao-basica%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F7CLeyP%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Tutorial%20Tomcat%20-%20Instala%C3%A7%C3%A3o%20e%20Configura%C3%A7%C3%A3o%20B%C3%A1sica%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><pre>Nota: Na revisão 13 deste tutorial, o conteúdo foi bastante ampliado e atualizado. Os tópicos de criação e configuração de
contexto sofreram as maiores mudanças, visando melhor organização e padronização do ambiente, inclusive passando a funcionar de
forma unificada tanto para a versão 5 quanto a 4 do Tomcat. A revisão 18 passou a cobrir também Tomcat 5.5. A revisão 25
começou a cobrir Tomcat 6.0. <span id="more-266"></span></pre>
<p>Os arquivos de configuração e exemplos listados aqui estão também disponíveis para baixar (download), como um pacote compactado ZIP:</p>
<pre>   * Arquivos de exemplo deste Tutorial: <a title="http://www.deserv.info/wiki/downloads/tomcat_arqs.zip" rel="nofollow" href="http://www.deserv.com.br/wiki/downloads/tomcat_arqs.zip">Download tomcat_arqs.zip (ZIP)</a>

   * Tutorial em arquivo TXT: <a title="http://www.deserv.info/wiki/downloads/tutorialtomcat.txt.gz" rel="nofollow" href="http://www.deserv.com.br/wiki/downloads/tutorialtomcat.txt.gz">Tutorial TomCat.gz</a></pre>
<h2><span class="mw-headline">Introdução </span></h2>
<p>O Tomcat é um servidor de aplicações Java para web. É software livre e de código aberto, surgido dentro do conceituado projeto Apache Jakarta e que teve apoio e endosso oficial da Sun Microsystems como Implementação de Referência (RI) para as tecnologias Java Servlet e JavaServer Pages (JSP). Atualmente, o Tomcat tem seu próprio projeto de desenvolvimento independente, dentro da Apache Software Foundation. O Tomcat é robusto e eficiente o suficiente para ser utilizado mesmo em um ambiente de produção.</p>
<p>Nota: A partir do Java EE 5.0, com as versões de especificações Servlet 2.5 e JSP 2.1, a implementação de referência (RI) destas tecnologias passou a ser o servidor de aplicações Java EE 5.0 completo (Web e EJB) Sun Java System Application Server Platform Edition 9, baseado no projeto de software livre GlassFish Community.</p>
<p>Tecnicamente, o Tomcat é um Conteiner Web, parte da plataforma corporativa Java Enterprise Edition (Java EE, anteriormente denominada J2EE) que abrange as tecnologias Servlet e JSP, incluindo tecnologias de apoio relacionadas como Realms e segurança, JNDI Resources e JDBC DataSources. O Tomcat tem a capacidade de atuar também como servidor web/HTTP autônomo, ou pode funcionar integrado a um servidor web dedicado, como Apache httpd ou Microsoft IIS, ou ainda como parte integrante de um servidor de aplicações mais amplo, como JBoss AS, provendo os recursos de Java Servlet e JSP.</p>
<p>O Tomcat porém não implementa um conteiner EJB. Para aplicações Java Enterprise Edition (Java EE) que utilizam Enterprise JavaBeans (EJB), você deve procurar um servidor de aplicações Java EE completo, como JBoss AS (software livre), GlassFish (software livre), Apache Geronimo (software livre), IBM WebSphere (comercial), BEA WebLogic (comercial), Oracle AS (comercial), ou o Java EE SDK que inclui Sun Java System Application Server Platform Edition (gratuito), entre outros.</p>
<p>Este é um tutorial de instalação e configuração básica do Tomcat. Ele foi escrito e testado com base em instalações do Tomcat 4.1, 5.0, 5.5 e 6.0 em Windows, Unix e Linux. As configurações aqui propostas são para criar um ambiente de desenvolvimento bem simples e independente de qualquer ambiente integrado de desenvolvimento (IDE), suficiente para um primeiro contato com o Tomcat e as tecnologias Java para web. O tutorial, porém, não cobre o aprendizado da linguagem Java ou das tecnologias Servlet e JSP em si, nem tampouco o desenvolvimento de aplicações para web. Para mais informações sobre esses tópicos, veja as seções 15 e 16 ao final deste tutorial. Alternativas? Se você quer considerar alternativas ao Tomcat, uma boa opção é o projeto Jetty, servidor web e contêiner Servlet Java, também software livre. Jetty 6 suporta as mais recentes especificações Servlet 2.5 e JSP 2.1 da plataforma Java EE 5.0.</p>
<p><a id="Instalar_Java_-_JSE_SDK_.28JDK.29" name="Instalar_Java_-_JSE_SDK_.28JDK.29"></a></p>
<h2><span class="editsection"> </span><span class="mw-headline">Instalar Java &#8211; JSE SDK (JDK) </span></h2>
<p>O Tomcat é inteiramente escrito em Java e, portanto, necessita de uma Java Virtual Machine (JVM) — Máquina Virtual Java — para ser executado. Assim, é necessário ter a plataforma Java Padrão, Java Platform Standard Edition (Java SE), previamente instalada.</p>
<p>Na Tecnologia Java, existem duas distribuições do Java SE:</p>
<p>* Java Runtime Engine (JRE) — Mecanismo de Execução Java: inclui a JVM, bibliotecas e outros componentes necessários para executar<br />
aplicações ou applets escritas em linguagem Java. É o produto adequado para quem é apenas usuário da tecnologia Java.    * Software Development Kit (SDK) — Kit de Desenvolvimento de Software — do Java SE, mais conhecido como Java Development Kit (JDK):<br />
inclui todo o JRE, mais ferramentas de linha de comando como compilador, debugador e outros componentes necessários para construir<br />
aplicações Java.</p>
<p>Tomcat 4.1 e 5.0 necessitavam do JDK, para compilar as páginas JSP. O Tomcat 5.5 em diante traz embutido e usa o complilador Java Eclipse JDT para compilar JSP. Assim, o Tomcat a partir da versão 5.5 necessita apenas do JRE, mas o JDK ainda é útil para o desenvolvedor.</p>
<p>Para seu ambiente de desenvolvimento Java com Tomcat, onde você deve criar aplicações Java em geral, utilize o JDK completo.</p>
<p>1.1. Qual versão de JDK utilizar</p>
<p>A versão mais atual da plataforma Java SE é a 6, lançada em dezembro de 2006. As duas versões anteriores, Java SE 5 (desde setembro 2004) e J2SE 1.4.2 (desde junho 2003), ainda são consideradas ativas. Já o J2SE 1.3.1 encerrou seu ciclo de vida e não deve ser usado para nenhum propósito.</p>
<p>O Tomcat 6.0 requer Java SE 5.0 ou superior. O Tomcat 5.5 suporta também J2SE 1.4.x, mas é necessário instalar um pacote adicional de compatibilidade.</p>
<p>Se você está iniciando um novo ambiente de desenvolvimento, a princípio o mais adequado é utilizar a versão mais recente, JDK 6, que inclui todas as melhorias e facilidades atuais para a tecnologia Java padrão. O Java SE 6 é plenamente compatível com as versões anteriores, exceto raras exceções. Havendo impossibilidade de usar o Java SE 6, o Java SE 5 também funciona muito bem com Tomcat.</p>
<p>Considere optar por versão anterior de JDK somente se o Java SE mais recente ainda não está disponível para o seu sistema operacional, ou se há alguma restrição de suporte, compatibilidade com aplicações pré-existentes ou outro impedimento crítico. Fim do ciclo de vida: As versões de Java SE anteriores da Sun gradualmente atingem um período de transição para fim do ciclo de vida (End of Life &#8211; EOL), que se encerra (End of Service Life &#8211; EOSL) normalmente após a disponibilização pública (General Availability &#8211; GA) de duas versões seguintes de Java SE. A transição para EOL do J2SE 5.0 iniciou em 2008-04-08 e vai até 2009-10-30. O Java SE for Business 5.0 oferece período de suporte estendido. A transição EOL do J2SE 1.4.2 foi de 2006-12-12 a 2008-10-30. E J2SE 1.3.1 encerrou seu período de 2004-10-25 a 2006-12-11, exceto na plataforma Solaris 8 onde o suporte ao J2SE 1.3.1 continua até o fim do Vintage Support de cinco anos do sistema operacional.</p>
<p>A plataforma Java SE (JRE e JDK) é disponibilizada nativa para cada sistema operacional suportado pela tecnologia Java. Desde o Java SE 5.0, a Sun Microsystems provê JDK para os sistemas operacionais Windows, Linux e Solaris. A HP fornece JDK para seu HP-UX desde dezembro de 2004; a Apple disponibiliza o JDK 5.0 para seu Mac OS X desde abril de 2005, com suporte a 64-bits, e trouxe o Java SE 6 (1.6.0_05) no Mac OS X 10.5 Update 1 em maio de 2008.</p>
<p>Quando este tutorial foi editado, a atualização mais recente de Java SE SDK disponibilizada pela Sun Microsystems era JDK 6.0 Update 13, para Windows, Linux e Solaris.</p>
<p>Para obter o Java SE SDK (JDK) e informações sobre a instalação em seu sistema operacional, acesse os links correspondentes a seguir:</p>
<p>Windows, Linux e Solaris, 32 e 64 bits &#8211; Sun</p>
<p>* Download: <a class="external free" title="http://java.sun.com/javase/downloads/" rel="nofollow" href="http://java.sun.com/javase/downloads/">http://java.sun.com/javase/downloads/</a> (JDK 6), ou anteriores JDK 5, J2SE 1.4.2 SDK        * Informação: Java Se 6 Update Release Notes (sumário das mudanças em todos os lançamentos de atualização da versão 1.6.0)<br />
- Java Runtime Environment Windows Installation for JavaSE 6u10, Java SE 6 Notas de Versão<br />
- Instalação da Plataforma; ou veja “Notas de Instalação” e “Configurações de Sistema Suportadas” para as versões anteriores<br />
5.0 ou 1.4.2</p>
<p>Mac OS X &#8211; Apple</p>
<p>* Download: Apple &#8211; Java Downloads, Apple Downloads &#8211; Mac OS X Updates        * Informação: Apple Developer Connection: Java, Java for Apple Mac OS X</p>
<p>HP-UX &#8211; HP</p>
<p>* Download: Java technology software for HP-UX        * Informação: HP Unix &#8211; Java Information Library</p>
<p>FreeBSD</p>
<p>* Download: FreeBSD JDK Distributions        * Informação: FreeBSD Java Project     * Home-page: <a class="external free" title="http://java.sun.com/javase/" rel="nofollow" href="http://java.sun.com/javase/">http://java.sun.com/javase/</a></p>
<p>Mais detalhes sobre convenções de nome e versão do ambiente Java padrão podem ser encontrados em J2SE Code Names e Version 1.5.0 or 5.0. Nota: É possível haver várias versões de JDK/JRE instaladas no computador em locais distintos, convivendo sem problema. Neste caso, é importante ficar atento a qual versão será selecionada para uso do Tomcat. A variável de ambiente padrão JAVA_HOME deve ser definida (e mantida atualizada) indicando o local de instalação do J2SE preferencial (veja tópico 1.3 adiante). Esta variável é consultada pelo Tomcat e vários outros sistemas baseados em Java para determinar a JVM preferencial.</p>
<p>1.2. Instalação Passo-a-Passo do JDK</p>
<p>* 1.2.1. Instalar JDK para Windows    * 1.2.2. Instalar JDK para Solaris/Linux</p>
<p>1.3. JAVA_HOME</p>
<p>Complementando a instalação do Java 2 SDK, defina a variável de ambiente JAVA_HOME apontando para seu local de instalação. Esta variável de ambiente padrão é usada pelo Tomcat e vários outros sistemas baseados em Java, para determinar a JVM preferencial. Isto é muito importante se houver mais de uma instalação de J2SE no computador, mas a variável JAVA_HOME deve ser definida mesmo se houver apenas uma versão instalada. Importante: Modifique o caminho para JAVA_HOME de acordo com a versão e o local de instalação do JDK em seu computador. Nota: Quando instalar uma nova versão de Java, lembre-se de também atualizar a variável de ambiente JAVA_HOME.</p>
<p>Windows 2000 ou superior:</p>
<p>Acesse &#8220;Painel de Controle&#8221; &gt; Sistema &gt; aba &#8220;Avançado&#8221;. Pressione o botão &#8220;Variáveis de ambiente&#8221;<br />
. No grupo &#8220;Variáveis do sistema&#8221; (recomendado, pois fica valendo para todos os usuários),<br />
ou ainda &#8220;Variáveis de usuário&#8221; (se desejar apenas para seu usuário), crie uma nova variável JAVA_HOME, ou edite se já existente,<br />
definindo como valor o caminho da pasta de instalação, por exemplo C:\Arquivos de programas\Java\jdk1.6.0_13 (ver imagem).    A nova configuração passa a valer imediatamente após o &#8220;OK&#8221;, exceto para janelas de prompt de comando (console) já abertas.</p>
<p>Windows 9x / NT:</p>
<p>Edite o arquivo autoexec.bat, para incluir a linha:    set JAVA_HOME=C:\Arquivos de programas\Java\jdk1.6.0_13    Reinicie o sistema para a nova configuração ser efetivada.</p>
<p>Unix / Linux:</p>
<p>Edite o profile do usuário (para sh: ~/.profile) ou global do sistema (/etc/profile), para incluir a linha:    JAVA_HOME=/opt/javase; export JAVA_HOME    Reinicie a sessão ou terminal para a nova configuração ser efetivada.    No Linux, também é possível incluir a variável de ambiente no arquivo global de ambiente /etc/environment: JAVA_HOME=/opt/javase</p>
<p>Para mais informações sobre variáveis de ambiente recomendadas, veja também a seção 13 deste tutorial.</p>
<p><a id="Instalar_Tomcat" name="Instalar_Tomcat"></a></p>
<h2><span class="editsection"><a title="Editar seção: Instalar Tomcat" href="http://www.deserv.com.br/wiki/index.php?title=TomCat&amp;action=edit&amp;section=4"></a></span><span class="mw-headline">Instalar Tomcat </span></h2>
<p>2.1. Qual versão de Tomcat utilizar</p>
<p>O Tomcat tem evoluído paralelamente à evolução da Plataforma Java EE e suas especificações para web, especialmente Java Servlet e JavaServer Pages (JSP). O quadro a seguir relaciona as versões de Tomcat com as respectivas versões de tecnologias suportadas.</p>
<p>Tomcat	Servlet	JSP	Java EE 6.0	2.5	2.1	Java EE 5.0 5.5	2.4	2.0	J2EE 1.4 4.1	2.3	1.2	J2EE 1.3</p>
<p>Se você está iniciando o aprendizado e desenvolvimento Java para web, é recomendado utilizar a versão mais atualizada Tomcat 6.0, que é compatível com as especificações e tecnologias mais recentes e é o foco principal de desenvolvimento do projeto Tomcat. A maior parte dos recursos atuais é compatível com versões anteriores. Para mais informações sobre as versões de Tomcat, veja Apache Tomcat Versions.</p>
<p>A versão anterior 5.5 do Tomcat ainda é muito utilizada, pois a especificação J2SE 1.4 e suas tecnologias, bem como os produtos baseados nelas, estão maduros e bem difundidos no mercado. Já o Tomcat 4.1 está muito defasado e não é recomendado.</p>
<p>Para obter o Tomcat e informações sobre instalação e documentação, acesse o site Apache Tomcat, na Apache Software Foundation:</p>
<p>* Download: <a class="external free" title="http://tomcat.apache.org/download-60.cgi" rel="nofollow" href="http://tomcat.apache.org/download-60.cgi">http://tomcat.apache.org/download-60.cgi</a> * Informação: Tomcat 6.0 Setup e RUNNING.txt 6.0, Tomcat 5.5 Setup e RUNNING.txt 5.5, RUNNING.txt 4.1    * Home-Page: tomcat.apache.org (antigo jakarta.apache.org/tomcat/)</p>
<p>Dica: Fique atento às versões do Tomcat que corrigem vulnerabilidades de segurança e atualize seu Tomcat regularmente. Veja: Apache Tomcat 6.x vulnerabilities e 5.x vulnerabilities.</p>
<p>Quando este tutorial foi editado, a versão estável mais recente era Tomcat 6.0.18 (APIs Servlet 2.5 e JSP 2.1, integrantes do Java EE 5.0). O download do instalador para Windows pode ser acessado no site primário em apache-tomcat-6.0.18.exe (instalador com serviço Windows). A página principal de download apresenta todas as alternativas de versões de Tomcat e repositórios de download (mirrors). Importante: O Tomcat 6.0 requer Java SE 5.0 ou superior. O Tomcat 5.5 suporta também J2SE 1.4.x, mas é necessário baixar e descompactar o pacote adicional de compatibilidade com JDK 1.4 (apache-tomcat-5.5.*-compat.zip).</p>
<p>Tomcat 4.1 e 5.0 exigiam um JDK instalado. O Tomcat 5.5 em diante necessita apenas do JRE, embora o JDK continue útil para o desenvolvedor. De qualquer forma, é interessante que esteja definida a variável de ambiente JAVA_HOME apontando para o local de instalação do JDK mais atual. Importante &#8211; Tomcat Windows: No passo &#8220;Java Virtual Machine path selection&#8221; do instalador, certifique-se de informar o caminho correto do JDK.</p>
<p>Na instalação Windows, a seleção de componentes personalizada (Custom) permite instalar e ativar o Tomcat como serviço no Windows NT/2000 ou superior, pelo item &#8220;Service&#8221;. No Tomcat 5 em diante, o serviço é sempre instalado e o item &#8220;Service&#8221; apenas escolhe a sua ativação automática na inicialização do Windows.</p>
<p>O diretório principal (local de instalação) do Tomcat é referenciado posteriormente neste tutorial como CATALINA_HOME. Na documentação e scripts do Tomcat, esse diretório é também referenciado assim, pois Catalina é o nome-código do projeto Tomcat e seu contêiner Servlet. Importante: O separador de diretórios mais usado aqui é a barra normal (/) do Unix e Linux; usuários do Windows devem substituir pela barra-invertida (\) quando apropriado. Note que a barra de Unix é aceita como separador de diretório mesmo em Windows nos arquivos de configuração do Tomcat e pelos programas java e javac.</p>
<p>2.2. Instalação Passo-a-Passo do Tomcat</p>
<p>Siga o anexo correspondente à versão desejada, para um passo-a-passo do processo de instalação e configuração inicial do Tomcat:</p>
<p>* 2.2.1. Instalar Tomcat 6.0 (ou 5.5) para Windows    * [Obsoleto] Versões anteriores para Windows: 2.2.1A. Tomcat 5.0 e 2.2.1B. Tomcat 4.1    * 2.2.2. Instalar Tomcat em Unix/Linux  <a id="Iniciar_e_parar_o_Tomcat" name="Iniciar_e_parar_o_Tomcat"></a></p>
<h2><span class="editsection"><a title="Editar seção: Iniciar e parar o Tomcat" href="http://www.deserv.com.br/wiki/index.php?title=TomCat&amp;action=edit&amp;section=5"></a></span><span class="mw-headline">Iniciar e parar o Tomcat </span></h2>
<p>Você pode executar o Tomcat instalando como serviço (Windows NT/2000 ou superior), com inicialização automática ou manual; ou executá-lo como processo isolado (qualquer sistema operacional), por um atalho no menu Iniciar do Windows ou por script shell (.bat/.sh). Veja a seguir a seção correspondente à forma de inicialização desejada.</p>
<p>3.1. [Windows] Tomcat como serviço</p>
<p>Nota: O Tomcat Monitor foi atualizado várias vezes durante a evolução do Tomcat 5. Os procedimentos e ilustrações apresentados a<br />
seguir refletem o Apache Service Manager incluso no Tomcat 5.0.22 em diante. Existem algumas diferenças nas versões anteriores.     * [Windows] Para iniciar e parar o Tomcat (5 em diante) como serviço, o recomendo é usar o Tomcat Monitor, que consiste na<br />
ferramenta Apache Service Manager (Procrun) fornecida com o Tomcat:          1. Inicie o Tomcat Monitor utilizando o atalho em: Iniciar &gt; Programas &gt; Apache Tomcat &gt; Monitor Tomcat. Deve surgir um<br />
pequeno ícone (ver imagem) na área de notificação da barra de tarefas do Windows (ao lado do relógio). Este ícone indica o estado<br />
atual do serviço Tomcat (quadrado vermelho = parado, triângulo verde = iniciado).          2. Clique no ícone com o botão direito do mouse; no menu de contexto que se abre, escolha &#8220;Start service&#8221; ou &#8220;Stop<br />
service&#8221;.       Através da opção &#8220;Configure&#8221; do Tomcat Monitor, ou do ícone &#8220;Configure Tomcat&#8221; no menu iniciar, você acessa a caixa de<br />
Propriedades do Tomcat, onde pode configurar opções úteis como a gravação de log do servidor (aba Logging) e o runtime/JRE e<br />
Máquina Virtual Java a utilizar (aba Java), entre outros.     * [Windows] Alternativamente em Windows, também é possível usar os recursos do próprio gerenciador de serviços do sistema<br />
operacional para iniciar, parar e reiniciar o serviço Apache Tomcat, através do Gerenciador de Serviços do Windows em:<br />
Iniciar &gt; Configurações &gt; Painel de Controle &gt; Ferramentas Administrativas &gt; Serviços (ver imagem). Ou através do prompt de comandos,<br />
no console texto:       Tomcat 5 em diante              o Iniciar: net start &#8220;Apache Tomcat&#8221;              o Parar: net stop &#8220;Apache Tomcat&#8221;      Tomcat 4.1              o Iniciar: net start &#8220;Apache Tomcat 4.1&#8243;              o Parar: net stop &#8220;Apache Tomcat 4.1&#8243;</p>
<p>Para mais informações sobre como gerenciar e executar o Tomcat como serviço do Windows, o uso dos programas tomcat6w.exe (Procrun Service Manager) e tomcat6.exe (Service Runner) e seus respectivos parâmetros de linha de comando, veja a página Apache Tomcat 6.0 &#8211; Windows service HOW-TO.</p>
<p>3.2. Tomcat como processo</p>
<p>* Para iniciar e parar o Tomcat como processo pelo prompt de comandos (console ou shell) do sistema operacional:          1. defina as variáveis de ambiente JAVA_HOME e CATALINA_HOME, para apontar o diretório principal da instalação do Java SDK<br />
e do Tomcat, respectivamente. O recomendado é criar o script [Windows] setenv.bat ou [Unix] setenv.sh dentro de<br />
CATALINA_HOME/bin, com estas configurações (veja seção 13 deste tutorial);          2. vá para o diretório bin do Tomcat:                 o [Windows] cd %CATALINA_HOME%\bin                o [Unix] cd $CATALINA_HOME/bin          3. execute o script desejado:                 o Iniciar: [Windows] startup.bat  ou  catalina start                      [Unix] startup.sh  ou  catalina.sh start                o Parar: [Windows] shutdown.bat  ou  catalina stop                      [Unix] shutdown.sh  ou  catalina.sh stop     * [Windows] Para iniciar e parar o Tomcat 4.1 graficamente como processo, existem atalhos em: Iniciar &gt; Programas &gt; Apache<br />
Tomcat 4.1. Use o atalho &#8220;Start Tomcat&#8221; para iniciar o Tomcat; e &#8220;Stop Tomcat&#8221; para finalizar.</p>
<p>Observações importantes para a plataforma Windows:</p>
<p>* Um erro comum é ter o Tomcat já iniciado como serviço e tentar iniciá-lo novamente, como processo. A segunda execução não<br />
conseguirá ser iniciada, acusando que já existe algum servidor utilizando o seu porto (port 8080). Neste caso, obviamente seria<br />
necessário antes parar o serviço, se realmente fosse desejado iniciar o Tomcat como processo.     * Quando o Tomcat é iniciado como processo console, abre-se uma janela console (ver imagem). Mantenha a janela aberta e não<br />
feche manualmente. A janela console fecha automaticamente quando é acionado o comando de encerrar o processo (Shutdown do Tomcat).  <a id="Testar_Tomcat" name="Testar_Tomcat"></a></p>
<h2><span class="editsection"> </span><span class="mw-headline">Testar Tomcat </span></h2>
<p>Para testar se o Tomcat está rodando ok após iniciado, abra o browser e vá para o endereço:</p>
<p><a class="external free" title="http://localhost:8080/" rel="nofollow" href="http://localhost:8080/">http://localhost:8080/</a></p>
<p>Na home-page padrão do Tomcat, o link &#8220;Tomcat Documentation&#8221; dá acesso a toda a documentação necessária, instalada localmente, inclusive a API Servlet/JSP da Sun, inclusa com o Tomcat.</p>
<p>O Tomcat inclui um contexto chamado Tomcat Manager, que provê uma interface web amigável para gerenciar as aplicações (contextos) — listar, parar, iniciar, recarregar, instalar (deploy), remover (undeploy) — e ver informações e estado do servidor e de suas conexões/threads. O instalador Windows solicita o login de usuário (padrão é admin) e a senha para acesso a este recurso.</p>
<p>Para acessar o Tomcat Manager, siga o link respectivo no quadro &#8220;Administration&#8221; da home-page padrão do servidor, ou acesse diretamente o endereço <a class="external free" title="http://localhost:8080/manager/html" rel="nofollow" href="http://localhost:8080/manager/html">http://localhost:8080/manager/html</a>. Atenção: No Tomcat 5.5, a aplicação Administration não é mais instalada por padrão. É necessário fazer download e instalação do pacote adicional apache-tomcat-5.5.*-admin.tar.gz para usá-la. Esta aplicação permite criar, excluir e configurar de forma gráfica itens correspondentes aos elementos e atributos disponíveis no arquivo de configuração server.xml.</p>
<p>Se você ainda não entende bem a estrutura e características da configuração de um servidor de aplicação web Java como o Tomcat, não altere nada sem saber. Você pode contudo acessar a ferramenta de Gerenciamento (Tomcat Manager), fornecer o login e senha do usuário administrativo configurado na instalação e visualizar o Estado do Servidor, que apresenta uma série de informações técnicas sobre o funcionamento do servidor Tomcat. Administração Avançada: Uma poderosa ferramenta (de terceiros) para monitoramento e gerenciamento para o Apache Tomcat é o Lambda Probe, projeto de software livre. É uma alternativa avançada ao Tomcat Manager, oferecendo recursos adicionais. Lambda Probe é compatível com Tomcat 5.x e 6 (Probe 1.7b) e roda como uma aplicação web (contexto) instalada no próprio Tomcat.</p>
<p><a id="Criar_contexto_de_desenvolvimento" name="Criar_contexto_de_desenvolvimento"></a></p>
<h2><span class="editsection"> </span><span class="mw-headline">Criar contexto de desenvolvimento </span></h2>
<p>Para executar seus servlets e JSPs, você precisa colocá-los dentro de um contexto de aplicação web (ServletContext). Cada contexto é uma unidade de aplicação web Java (servlet/JSP) que possui suas próprias configurações.</p>
<p>Para organizar o desenvolvimento, é interessante criar um contexto novo e ativar sua opção reloadable (recarga automática das classes modificadas). Para isso, faça o seguinte:</p>
<p>5.1. Estrutura de diretórios</p>
<p>Crie um diretório que será a sua estrutura de desenvolvimento web Java. Uma organização simples sugerida é a seguinte:</p>
<p>* dev/          o src/ (os fontes .java ficam aqui, organizados em pacotes/diretórios)          o web/ (arquivos do módulo web)                + WEB-INF/ (diretório obrigatório)                      # classes/ (os .class gerados devem ser direcionados para cá)                      # lib/ (pacotes jar de bibliotecas utilizadas devem ficar aqui)                      # web.xml (arquivo XML de configuração do contexto)                + (aqui entram os JSPs; podem ser criados sub-diretórios)                + index.jsp (home-page do módulo Java web), ou um index.html</p>
<p>Supondo que seu diretório &#8220;dev&#8221; seja em C:\dir\dev\ (Windows), assim, o módulo web ficaria em C:\dir\dev\web.</p>
<p>Nota: Esta estrutura, apesar de simples, costuma ser suficiente e adaptável ao modelo de organização da maioria das ferramentas<br />
(IDEs) de desenvolvimento Java (como Eclipse, NetBeans, JDeveloper etc.), ao menos para um único projeto. Para referências<br />
sobre modelos de organização de projeto e código-fonte, veja a seção 16 &#8211; Mais informações deste tutorial.</p>
<p>5.2. Criar contexto de aplicação web</p>
<p>A tarefa aqui consiste em criar no Tomcat um novo contexto de aplicação web, para seu ambiente de desenvolvimento. Existem<br />
basicamente três meios de se criar um contexto no Tomcat, cuja configuração corresponde a um código XML com um elemento Context:</p>
<p>* Usar um dos mecanismos de Deployment Automático de Aplicação do Host no Tomcat. Este é o meio mais recomendado, pois permite<br />
configuração automática do contexto na inicialização e atualização dinâmica da aplicação web durante a execução do Tomcat.<br />
Usaremos este meio na forma mais simples e direta, criando um arquivo XML separado com as configurações do contexto.     * Editar o arquivo de configuração principal do servidor Tomcat. Consiste em criar um elemento Context diretamente no arquivo<br />
conf/server.xml, dentro de um elemento Host. Este meio, ainda muito usado até o Tomcat 4, não é mais recomendado a partir do<br />
Tomcat 5, em prol do Deployment Automático. A criação de um contexto pelo arquivo server.xml tem várias desvantagens: não é<br />
dinâmica pois atualizações neste arquivo só podem ser re-lidas reiniciando o Tomcat, cria o risco de invalidar toda a<br />
configuração do servidor se for cometido um erro na sintaxe de uma tag de contexto, e mistura configurações de servidor com<br />
configurações de contexto.     * Pela aplicação de Administração do Tomcat com interface web, quando instalada.</p>
<p>Existem ainda outras formas de criação e configuração automática de um contexto de aplicação web, como o uso de um pacote Web Application Archive (WAR) e o arquivo META-INF/context.xml dentro do WAR. Para mais informações, veja a documentação Deployer HOW-TO (apenas Tomcat 5) e Context Container na Referência de Configuração do Servidor Tomcat.</p>
<p>Criando o arquivo dev.xml:</p>
<p>Criaremos um arquivo XML, para o novo contexto chamado &#8220;dev&#8221;. O arquivo deve ficar em:     Tomcat 5+:        CATALINA_HOME/conf/Catalina/localhost/dev.xml        Catalina é o mecanismo e localhost (máquina local) é o hostname padrão.    Tomcat 4:        CATALINA_HOME/webapps/dev.xml        webapps é o diretório base de aplicações definido no atributo appBase do Host.</p>
<p>Crie o arquivo dev.xml na localização já descrita, com o conteúdo do quadro a seguir. O conteúdo é a definição do Context, precedida pela tag de identificação de arquivo XML:</p>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;iso-8859-1&#8243;?&gt;     &lt;Context path=&#8221;/dev&#8221; docBase=&#8221;C:/dir/dev/web&#8221;     reloadable=&#8221;true&#8221; crossContext=&#8221;true&#8221; debug=&#8221;3&#8243;&gt;    &lt;/Context&gt;  Importante: O principal atributo definido é o docBase do elemento Context, especificando o caminho completo para o diretório base<br />
dos arquivos desta aplicação web. Modifique este atributo para informar a localização do dev/web em seu computador.  Nota: No Tomcat 4.1, era possível configurar no Context um elemento aninhado Logger para opções de log do contexto. No Tomcat 5.5<br />
em diante, o tratamento de logging foi totalmente reestruturado. Uma conseqüência importante é que o elemento Logger deixou de<br />
existir. Para detalhes sobre configurar e utilizar logs em sua aplicação, veja a seçãoo 12 &#8211; Logs deste tutorial. Crédito:</p>
<p>Alternativa: Tomcat Administration Tool:</p>
<p>Atenção: Para ter a aplicação Administration no Tomcat 5.5, baixe e instale o pacote adicional apache-tomcat-5.5.*-admin.tar.gz.</p>
<p>Apresentamos aqui uma alternativa à criação do arquivo dev.xml, caso você queira experimentar o uso da aplicação web de Administração do Tomcat. Neste caso, ao invés de criar o arquivo XML, siga estes passos:</p>
<p>1. Abra a ferramenta Tomcat Administrator via web e forneça o login (padrão: admin) e senha do usuário administrativo,<br />
conforme configurado durante a instalação.        2. No navegador em árvore do frame à esquerda, escolha: Tomcat Server &gt; Service (Catalina) &gt; Host (localhost).        3. No frame principal à direita: Host Actions &gt; Create New Context.        4. Preencha os atributos do novo contexto conforme o quadro do tópico anterior, que apresenta o código do elemento Context.        5. Crie a seguir, dentro do novo contexto, um Logger para gerar arquivos de log separados para sua aplicação. Considere os<br />
atributos também com base no mesmo quadro.  <a id="Configurar_contexto:_web.xml" name="Configurar_contexto:_web.xml"></a></p>
<h2><span class="editsection"> </span><span class="mw-headline">Configurar contexto: web.xml </span></h2>
<p>O arquivo WEB-INF/web.xml é o descritor do contexto de aplicação web, segundo a especificação Java Servlet/J2EE. As informações nele contidas são as configurações específicas da aplicação.</p>
<p>Nosso contexto de desenvolvimento terá apenas as seguintes configurações:</p>
<p>* informações textuais de título (elemento display-name, nome para exibição no Gerenciador) e comentário de descrição<br />
(description) do contexto, úteis para identificação e documentação;     * uma definição servlet associada à classe do invocador genérico InvokerServlet do Tomcat, usada para executar os servlets que<br />
você criar;     * um mapeamento (elemento servlet-mapping) genérico associando o padrão de endereço URI /servlet/* à definição do invoker<br />
criada, indicando que qualquer nome dentro do caminho /servlet/ neste contexto deve ser reconhecido como servlet e portanto<br />
repassado ao invoker do Tomcat para execução.</p>
<p>Crie o arquivo web.xml descritor para o novo contexto de aplicação web criado, dentro do diretório dev/web/WEB-INF/. Um conteúdo mínimo para ele, com as configurações apresentadas, é listado a seguir.</p>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;ISO-8859-1&#8243;?&gt;  &lt;web-app xmlns=&#8221;<a class="external free" title="http://java.sun.com/xml/ns/javaee" rel="nofollow" href="http://java.sun.com/xml/ns/javaee">http://java.sun.com/xml/ns/javaee</a>&#8221;  xmlns:xsi=&#8221;<a class="external free" title="http://www.w3.org/2001/XMLSchema-instance" rel="nofollow" href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>&#8221;  xsi:schemaLocation=&#8221;<a class="external free" title="http://java.sun.com/xml/ns/javaee" rel="nofollow" href="http://java.sun.com/xml/ns/javaee">http://java.sun.com/xml/ns/javaee</a> <a class="external free" title="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" rel="nofollow" href="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd</a>&#8221;  version=&#8221;2.5&#8243;&gt; 	&lt;display-name&gt;Desenvolvimento&lt;/display-name&gt; 	&lt;description&gt; 		Descritor do contexto de desenvolvimento. 	&lt;/description&gt;  	&lt;servlet&gt; 		&lt;servlet-name&gt;dev-invoker&lt;/servlet-name&gt; 		&lt;servlet-class&gt; 			org.apache.catalina.servlets.InvokerServlet 		&lt;/servlet-class&gt; 		&lt;init-param&gt; 			&lt;param-name&gt;debug&lt;/param-name&gt; 			&lt;param-value&gt;0&lt;/param-value&gt; 		&lt;/init-param&gt; 		&lt;load-on-startup&gt;2&lt;/load-on-startup&gt; 	&lt;/servlet&gt;  	&lt;servlet-mapping&gt; 		&lt;servlet-name&gt;dev-invoker&lt;/servlet-name&gt; 		&lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt; 	&lt;/servlet-mapping&gt; &lt;/web-app&gt;</p>
<p>Como se pode observar no XML anterior, ele se refere ao descritor de Aplicação Web da especificação Servlet 2.5 (integrante do Java EE 5). Para utilizar apenas recursos de uma versão anterior de descritor de Aplicação Web, substitua o cabeçalho do XML e a definição da tag raiz web-app pelo da respectiva versão. Eis a alteração de cabeçalho para Servlet 2.4:</p>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;ISO-8859-1&#8243;?&gt; &lt;web-app xmlns=&#8221;<a class="external free" title="http://java.sun.com/xml/ns/j2ee" rel="nofollow" href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a>&#8221;  xmlns:xsi=&#8221;<a class="external free" title="http://www.w3.org/2001/XMLSchema-instance" rel="nofollow" href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>&#8221;  xsi:schemaLocation=&#8221;<a class="external free" title="http://java.sun.com/xml/ns/j2ee" rel="nofollow" href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a> <a class="external free" title="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" rel="nofollow" href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</a>&#8221;  version=&#8221;2.4&#8243;&gt; 	&#8230; &lt;/web-app&gt;</p>
<p>E a seguir o cabeçalho para a especificação Servlet 2.3. Note que a estrutura do XML na versão 2.3 é definida por um DTD definido na tag DOCTYPE, enquanto as versões mais recentes usam XML Schema (XSD), definido por atributos de namespace na própria tag web-app.</p>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;ISO-8859-1&#8243;?&gt; &lt;!DOCTYPE web-app  PUBLIC &#8220;-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN&#8221;  &#8220;<a class="external free" title="http://java.sun.com/dtd/web-app_2_3.dtd" rel="nofollow" href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>&#8220;&gt;  &lt;web-app&gt; 	&#8230; &lt;/web-app&gt;  <a id="Ativar_contexto" name="Ativar_contexto"></a></p>
<h2><span class="editsection"> </span><span class="mw-headline">Ativar contexto </span></h2>
<p>Para garantir a ativação do novo contexto criado, reinicie o Tomcat (stop/start).</p>
<p>Tomcat 5+:</p>
<p>Logo após a inicialização do Tomcat, o arquivo de log da saida padrão do servidor Tomcat, criado em logs com o nome stdout.log, deve iniciar com um conteúdo similar ao trecho apresentado a seguir. Observe a mensagem (em destaque no quadro) que indica que o contexto configurado pelo arquivo dev.xml foi processado.</p>
<p>12/09/2004 12:09:00 org.apache.coyote.http11.Http11Protocol init    INFO: Initializing Coyote HTTP/1.1 on port 8080    12/09/2004 12:09:01 org.apache.catalina.startup.Catalina load    INFO: Initialization processed in 2234 ms    (&#8230;)    12/09/2004 12:09:06 org.apache.catalina.core.StandardHostDeployer install    INFO: Processing Context configuration file URL file:          &#8230;/Tomcat6.0/conf/Catalina/localhost/dev.xml</p>
<p>O Tomcat 5 em diante gera por padrão muito menos mensagens em log para os contextos do que o Tomcat 4, de forma que a inicialização não gera nenhuma mensagem no arquivo de log específico do contexto dev. Por isso, não estranhe se você não encontrar inicialmente nenhum arquivo localhost_dev_log.*.txt na pasta logs.</p>
<p>Tomcat 4:</p>
<p>Logo após a inicialização do Tomcat, o arquivo de log geral do host para o servidor Tomcat, que é criado em logs com nome no formato localhost_log.2004-09-12.txt, onde 2004-09-12 corresponde ao ano, mês e dia atuais, deve iniciar com um conteúdo similar ao trecho apresentado a seguir. Observe a mensagem (em destaque no quadro) que indica que o contexto configurado pelo arquivo dev.xml foi processado.</p>
<p>2004-&#8230; HostConfig[localhost]: Deploying configuration descriptor admin.xml    2004-&#8230; HostConfig[localhost]: Deploying configuration descriptor dev.xml    2004-&#8230; HostConfig[localhost]: Deploying configuration descriptor manager.xml    2004-&#8230; WebappLoader[/manager]: Deploying class repositories to work directory    (&#8230;)</p>
<p>E o arquivo de log do novo contexto, que é criado com nome no formato localhost_dev_log.*.txt, deve ter um conteúdo inicial similar ao seguinte:</p>
<p>2004-&#8230; WebappLoader[/dev]: Deploying class repositories to work directory             &#8230;/Tomcat4.1/work/Standalone/localhost/dev    2004-&#8230; WebappLoader[/dev]: Deploy class files /WEB-INF/classes to /dir/dev/web/WEB-INF/classes    2004-&#8230; WebappLoader[/dev]: Reloading checks are enabled for this Context    2004-&#8230; StandardManager[/dev]: Seeding random number generator class java.security.SecureRandom    2004-&#8230; StandardManager[/dev]: Seeding of random number generator has been completed    2004-&#8230; StandardWrapper[/dev:default]: Loading container servlet default    2004-&#8230; StandardWrapper[/dev:invoker]: Loading container servlet invoker    2004-&#8230; StandardWrapper[/dev:dev-invoker]: Loading container servlet dev-invoker  <a id="Testar_contexto" name="Testar_contexto"></a></p>
<h2><span class="editsection"> </span><span class="mw-headline">Testar contexto </span></h2>
<p>Para testar o novo contexto, acesse o endereço:</p>
<p><a class="external free" title="http://localhost:8080/dev/" rel="nofollow" href="http://localhost:8080/dev/">http://localhost:8080/dev/</a></p>
<p>Se você criou um index.html no diretório de desenvolvimento (dev/web/), você deve ver esta página. Senão, verá apenas uma listagem do diretório gerada pelo Tomcat.</p>
<p>Se o Tomcat retornar a página de erro 404 &#8211; Não Encontrado, houve algum problema de forma que o contexto não foi ativado. O problema mais comum é haver algum erro de sintaxe no elemento Context no arquivo XML que define o contexto. Verifique os logs do Tomcat, conforme a seção 12 adiante, à procura de erros. Você pode também usar algum dos muitos Validadores de XML existentes como auxílo, como por exemplo o serviço on-line de Validação de XML do STG, que verifica um XML em arquivo, URI na web ou o texto copiado diretamente em um formulário.</p>
<p><a id="Bibliotecas_Servlet" name="Bibliotecas_Servlet"></a></p>
<h2><span class="editsection"> </span><span class="mw-headline">Bibliotecas Servlet </span></h2>
<p>Para compilar servlets, você precisa essencialmente importar os pacotes javax.servlet e javax.servlet.http. As bibliotecas com estes pacotes também estão inclusas como JAR no Tomcat e devem ser adicionadas ao CLASSPATH do compilador javac:</p>
<p>Tomcat 5+:    CATALINA_HOME/common/lib/servlet-api.jar    CATALINA_HOME/common/lib/jsp-api.jar Tomcat 4:    CATALINA_HOME/common/lib/servlet.jar</p>
<p>onde CATALINA_HOME é o diretório principal de instalação do Tomcat.</p>
<p>Se você tem o J2EE SDK da Sun instalado, pode alternativamente usar o j2ee.jar incluso com ele, que contém todas as APIs do Java EE inclusive Servlet/JSP. Mas o mais simples é usar o(s) jar(s) do Tomcat. Isso garante total compatibilidade entre a versão das APIs Servlet/JSP usadas no desenvolvimento e no seu Tomcat.</p>
<p>Além disso, se o código Java de uma classe servlet sua importar pacotes ou classes de uma biblioteca de terceiros (que não seja parte das APIs J2SE e Servlet/JSP), o JAR com as classes compiladas desta biblioteca deve estar no diretório WEB-INF\lib\ para que o Tomcat encontre.</p>
<p><a id="Testar_seus_servlets" name="Testar_seus_servlets"></a></p>
<h2><span class="mw-headline">Testar seus servlets </span></h2>
<p>O pacote ZIP com os arquivos deste tutorial (veja a Introdução) inclui o fonte de um servlet bem simples AloMundoServ.java, que pode ser usado como primeiro teste, similar a: view plaincopy to clipboardprint?</p>
<p>Se o arquivo estiver em dev/src/, você pode abrir uma janela de comandos (prompt) neste local, certificar-se que o CLASSPATH está devidamente configurado conforme a seção 9 deste tutorial, e executar o compilador javac, direcionando o destino para ../web/WEB-INF/classes/:</p>
<p>javac -d ../../web/WEB-INF/classes AloMundoServ.java</p>
<p>Depois que um servlet for compilado e o .class resultante colocado em dev/web/WEB-INF/classes/, com as configurações de mapeamento servlet genérico que fizemos no contexto, você acessa seu servlet com o URI /dev/servlet/NomeDaClasseServlet (sem o .class). Para o exemplo compilado AloMundoServ.class, acesse o servlet com o seguinte URL:</p>
<p><a class="external free" title="http://localhost:8080/dev/servlet/AloMundoServ" rel="nofollow" href="http://localhost:8080/dev/servlet/AloMundoServ">http://localhost:8080/dev/servlet/AloMundoServ</a></p>
<p>Podem ser criados, no web.xml, outros mapeamentos específicos para uma ou mais servlets. Para isso, você deve conhecer a sintaxe dos elementos &lt;servlet&gt; e &lt;servlet-mapping&gt;.</p>
<p><a id="Testar_seus_JSPs" name="Testar_seus_JSPs"></a></p>
<h2><span class="mw-headline">Testar seus JSPs </span></h2>
<p>Os JSPs colocados em dev/web/ (exemplo: arquivo alomundo.jsp) são acessados assim:</p>
<p><a class="external free" title="http://localhost:8080/dev/alomundo.jsp" rel="nofollow" href="http://localhost:8080/dev/alomundo.jsp">http://localhost:8080/dev/alomundo.jsp</a></p>
<p>Podem ser criados sub-diretórios dentro do diretório principal do contexto, para organizar os arquivos JSP e arquivos estáticos (HTML, imagens etc.). Estes sub-diretórios se refletirão diretamente no URL (endereço) de uma página JSP neles contida. Uma página JSP em dev/web/subdir/pagina.jsp neste contexto terá URL <a class="external free" title="http://localhost:8080/dev/subdir/pagina.jsp" rel="nofollow" href="http://localhost:8080/dev/subdir/pagina.jsp">http://localhost:8080/dev/subdir/pagina.jsp</a>. É recomendado não utilizar espaços nem caracteres acentuados nos nomes de sub-diretório. Além disso, procure usar apenas letras minúsculas, o que é o mais comum em endereços web.</p>
<p>No Tomcat 5 ou inferior, se a configuração não estiver apontando para a localização correta do JDK (Java SDK) mas sim para a do JRE (Java Runtime), a tentativa de exibição de um novo JSP pode resultar no seguinte erro:</p>
<p>HTTP Status 500 &#8211; Exception report  exception org.apache.jasper.JasperException: Unable to compile class for JSP</p>
<p>No Java compiler was found to compile the generated source for the JSP. This can usually be solved by copying manually $JAVA_HOME/lib/tools.jar from the JDK to the common/lib directory of the Tomcat server, followed by a Tomcat restart. If using an alternate Java compiler, please check its installation and access path.</p>
<p>O JRE não inclui as ferramentas de compilação Java, necessárias para a compilação dinâmica de páginas JSP novas ou modificadas. Daí o erro. Para solucionar, re-configure ou re-instale o Tomcat informando o caminho correto do Java SDK (JDK), ou então recorra à alternativa sugerida na mensagem de erro: copie manualmente o arquivo lib/tools.jar do JDK para o diretório common/lib do Tomcat e re-inicie o Tomcat (shutdown/start).</p>
<p><a id="Logs" name="Logs"></a></p>
<h2><span class="mw-headline">Logs </span></h2>
<p>Para configurar a gravação de log (registro histórico) em sua aplicação, veja a página Logging in Tomcat 6.0 (ou 5.5) para detalhes.</p>
<p>As opções e preferências de geração de log das aplicações rodando no Tomcat devem ser configuradas diretamente no arquivo de configuração do mecanismo/framework de logging em uso:</p>
<p>* Tomcat Juli e Java SE Logging: TOMCAT_HOME/conf/logging.properties;    * Apache Log4j: TOMCAT_HOME/lib/log4j.properties.</p>
<p>Em Windows, lembre-se que a opção Configure Tomcat (veja tópico 3.1) permite definir o nível padrão, localização e prefixo dos arquivos de log do Tomcat.</p>
<p>Para ver logs de acesso, erro e depuração, leia os txt&#8217;s gerados em: CATALINA_HOME\logs\</p>
<p>Quando existirem muitos arquivos de log no Tomcat de desenvolvimento e você quiser limpar o diretório para facilitar o rastreamento dos logs, pode:</p>
<p>1. Parar (stop) o Tomcat.   2. Remover todos os arquivos de log existentes em CATALINA_HOME\logs\, ou movê-los para uma área de backup.   3. Iniciar (start) novamente o Tomcat.</p>
<p>Inspecionar as mensagens de saída informativas e de erro do Tomcat é importante para depurar e fazer diagnóstico do servidor, como identificar problemas na inicialização do Tomcat, acompanhar o processamento dos arquivos de configuração (server.xml, web.xml) e da inicialização e finalização do Tomcat, bem como visualizar quaisquer exceções Java levantadas. Estes são os arquivos de log do servidor, que devem ser inspecionados:</p>
<p>* stdout.log: arquivo que recebe toda a saída padrão de mensagens informativas geradas na execução do Tomcat e seus contextos<br />
(exceto quando o Tomcat é iniciado pelo prompt de comandos, quando as mensagens aparecem diretamente no console.<br />
Inclui também as mensagens de saída que, até o Tomcat 4.1 ficavam no arquivo separado localhost_log.    * stderr.log: analogamente ao stdout, o stderr recebe toda a saída de erro gerada na execução do Tomcat.</p>
<p>As saídas padrão (stdout) e de erro (stderr) podem ser exibidas de diversas formas, dependendo de como o Tomcat foi inicializado:</p>
<p>Tomcat como Serviço Windows ou Processo com direcionamento de log</p>
<p>Por padrão, as mensagens informativas (saída padrão) e de erro do servidor Tomcat são direcionadas para os arquivos stdout.log<br />
e stderr.log respectivamente, localizados em CATALINA_HOME\logs\.</p>
<p>Tomcat como Processo console</p>
<p>Na janela de console são exibidas as mensagens da saída padrão (stdout) e de erro (stderr).  <a id="Vari.C3.A1veis_de_Ambiente" name="Vari.C3.A1veis_de_Ambiente"></a></p>
<h2><span class="mw-headline">Variáveis de Ambiente </span></h2>
<p>É útil deixar configuradas algumas variáveis de ambiente relacionadas a Java e ao Tomcat. A variável JAVA_HOME foi abordada no tópico 1.3 deste tutorial. As variáveis de ambiente relacionadas são:</p>
<p>JAVA_HOME     Local de instalação do Kit de Desenvolvimento Java J2SE (JDK).  CATALINA_HOME     Local de instalação do Tomcat.  CLASSPATH    Caminhos (pacotes e diretórios) de localizações de classes Java; o classpath deve incluir o(s) jar(s) dos pacotes Servlet<br />
e JSP do Tomcat.  PATH    Caminhos (diretórios) de localizações de executáveis no sistema operacional, deve incluir o diretório bin das ferramentas do<br />
Java SDK.</p>
<p>Windows (Painel de Controle ou arquivo autoexec.bat), ou criar um script setenv.bat:</p>
<p>set JAVA_HOME=C:\Arquivos de programas\Java\jdk1.6.0_13 set CATALINA_HOME=C:\Arquiv~1\Apache~1\Tomcat 6.0 set CLASSPATH=%CATALINA_HOME%\common\lib\servlet-api.jar;.;%CLASSPATH% set CLASSPATH=%CATALINA_HOME%\common\lib\jsp-api.jar;%CLASSPATH% set PATH=%JAVA_HOME%\bin;%PATH%</p>
<p>Se decidir usar o JRE ao invés do JDK, substitua o JAVA_HOME anterior:</p>
<p>set JAVA_HOME=C:\Arquivos de programas\Java\jre6</p>
<p>Unix/Linux (user/system profile), ou criar um script setenv.sh:</p>
<p>JAVA_HOME=/opt/javase CATALINA_HOME=/opt/tomcat CLASSPATH=$CATALINA_HOME/common/lib/servlet-api.jar:.:$CLASSPATH CLASSPATH=$CATALINA_HOME/common/lib/jsp-api.jar:$CLASSPATH PATH=$JAVA_HOME/bin:$PATH  # Sintaxe Bourne shell (sh), Korn shell (ksh), Bash e similares: export JAVA_HOME CATALINA_HOME CLASSPATH PATH  Importante: Modifique os caminhos JAVA_HOME e CATALINA_HOME de acordo com as versões e os locais de instalação em seu computador.<br />
Para Tomcat 4.1, a biblioteca a ser incluída no CLASSPATH era apenas servlet.jar, conforme visto na seção 9 deste tutorial.</p>
<p>Mais informações sobre variáveis de ambiente:</p>
<p>* Variável de ambiente, verbete em Wikipédia.    * Guia Foca GNU/Linux &#8211; Personalização do Sistema, nível Intermediário &#8211; Capítulo 21, por Gleydson Mazioli da Silva. Também<br />
como Capítulo 8 da Versão nível Avançado.    * Conhecendo Variáveis de Ambiente (Sistema), por Alberto Leal, Microsoft TechNet Brasil.    * JAVA Configurando Variáveis de Ambiente no Windows (PDF), por Cesar Rodrigo, .cseg Automation.    * Java Environment Variables and Path (em inglês), documentação Sun Microsystems.  <a id="Material_de_refer.C3.AAncia" name="Material_de_refer.C3.AAncia"></a></p>
<h2><span class="mw-headline">Material de referência </span></h2>
<p>O Tomcat vem com material de referência completo, documentação e exemplos. Tudo pode ser acessado localmente on-line (Tomcat iniciado) a partir dos links na home-page padrão do Tomcat, em <a class="external free" title="http://localhost:8080/" rel="nofollow" href="http://localhost:8080/">http://localhost:8080/</a>. Este material também está disponível no site do Projeto Apache Tomcat.</p>
<p>* Documentação do Tomcat, acessível on-line em <a class="external free" title="http://localhost:8080/tomcat-docs/" rel="nofollow" href="http://localhost:8080/tomcat-docs/">http://localhost:8080/tomcat-docs/</a>, ou off-line (arquivos HTML em disco)<br />
em CATALINA_HOME\webapps\tomcat-docs\index.html           o Configuration Reference, com toda a sintaxe do arquivo de configuração do servidor Tomcat conf\server.xml: config/          o Servlet/JSP Javadocs, inclui convenientemente toda a API Servlet e JavaServer Pages (JSP) da Sun correspondente à versão<br />
implementada pelo Tomcat: servletapi/ e, em separado a partir do Tomcat 5 (JSP 2.0), jspapi/.     * Exemplos prontos para executar, com código-fonte       Tomcat 5+:              o JSP Examples: <a class="external free" title="http://localhost:8080/jsp-examples/" rel="nofollow" href="http://localhost:8080/jsp-examples/">http://localhost:8080/jsp-examples/</a> o Servlet Examples: <a class="external free" title="http://localhost:8080/servlets-examples/" rel="nofollow" href="http://localhost:8080/servlets-examples/">http://localhost:8080/servlets-examples/</a> Tomcat 4:              o Servlet Examples: <a class="external free" title="http://localhost:8080/examples/servlets/" rel="nofollow" href="http://localhost:8080/examples/servlets/">http://localhost:8080/examples/servlets/</a> o JSP Examples: <a class="external free" title="http://localhost:8080/examples/jsp/" rel="nofollow" href="http://localhost:8080/examples/jsp/">http://localhost:8080/examples/jsp/</a> <a id="E_agora.3F" name="E_agora.3F"></a></p>
<h2><span class="mw-headline">E agora? </span></h2>
<p>Terminada a instalação do software, está aberta a sua temporada de desenvolvimento Java para web. A tecnologia e as informações envolvidas na programação são assuntos muito mais abrangentes e não estão no escopo deste tutorial. Para desenvolver em Java para web, você deve ter bons fundamentos dos seguintes tópicos essenciais:</p>
<p>* orientação a objetos;    * linguagem de programação Java e APIs da plataforma Java SE;    * arquitetura e mecanismos de sistemas web e o protocolo HTTP;    * HTML, CSS e JavaScript;    * Java Web = Servlets, JSP e JavaBeans.</p>
<p>Para fazer projetos bem estruturados, você também deve saber:</p>
<p>* padrões de projeto/desenho/modelagem (design patterns);    * bibliotecas de tag (taglibs) em JSP, em especial a JSP Standard Tag Library (JSTL);</p>
<p>E para fazer aplicações completas, você deverá conhecer e utilizar:</p>
<p>* framework JavaServer Faces (JSF) — componentes de interface com usuário e fluxos de navegação — para aplicações web baseado<br />
no padrão Modelo-Visão-Controle (MVC); ou outro framework independente como Struts, Wicket, Tapestry, Mentawai etc.;    * mapeamento objeto-relacional para persistência em banco de dados, seja com Java Persistence API (JPA) ou frameworks como<br />
Hibernate ou Oracle TopLink;    * Enterprise JavaBeans (EJB) ou outra arquitetura para componentes de negócio, como Spring Framework.</p>
<p>Se você ainda não tem domínio dos tópicos essenciais, recomendo um bom curso (ou cursos), em sala de aula, e a leitura de bons livros. O mesmo vale para os tópicos mais avançados. Há ainda muitas referências disponíveis na web e uma boa quantidade de grupos de usuários e listas de discussão sobre Java, inclusive no Brasil.</p>
<p>Para produtividade, é importante também um bom ambiente integrado de desenvolvimento (IDE). A ferramenta mais usada, gratuita e livre, é o Eclipse. Há também os ótimos NetBeans (livre), Borland JBuilder (gratuito e comercial), Oracle JDeveloper (gratuito) e IntelliJ IDEA (comercial), para citar alguns. Mas nenhuma ferramenta vai dispensar o conhecimento da arquitetura JEE e das tecnologias envolvidas.</p>
<p>Por fim, existem tópicos avançados sobre Tomcat não abordados por este tutorial, como:</p>
<p>* distribuição e publicação (deployment) de aplicações web;    * integração com servidores web/HTTP, como Apache httpd e Microsoft IIS;    * administração, monitoramento, configuração e calibração do Tomcat para ambientes de produção e de alto desempenho.  <a id="Mais_informa.C3.A7.C3.B5es" name="Mais_informa.C3.A7.C3.B5es"></a></p>
<h2><span class="mw-headline">Mais informações </span></h2>
<p><em>Glossário</em></p>
<p>Catalina é o nome-código do Servlet Container do Tomcat, Jasper é seu processador JSP e Coyote (JK) é o sub-projeto que desenvolve os conectores do Tomcat a vários servidores web (httpd).</p>
<p>Outros Tutoriais</p>
<p>* Tutoriais Tomcat: Instalação, Configuração e Integração com Apache; por Gleydson Lima, J2EE Brasil.        * Apache HTTP server e Tomcat, o HowTo fácil sem o mod_jk; por Paulo Silveira, 2006-09-25, no blog da Caelum.        * Tomcat 5 on Linux Step-By-Step, by Pascal Chong, junho 2004. [Em Inglês]        * Configuring &amp; Using Apache Tomcat: Um tutorial sobre instalação e uso de Tomcat 6 ou Tomcat 5.5 para desenvolvimento de<br />
Servlet e JSP; por Marty Hall, Core Servlets. [Em Inglês]        * Java EE Tutorials, versões 5, 1.4 e 1.3; por Sun Microsystems, disponíveis on-line (HTML) e em PDF [Em inglês].              o The Java EE 5 Tutorial, setembro 2007: a Parte II &#8211; Web Tier cobre Java Servlet (2.5), JavaServer Pages (JSP 2.1),<br />
JavaServer Pages Standard Tag Library (JSTL) e JavaServer Faces (JSF 1.2).              o The J2EE 1.4 Tutorial, dezembro 2005: cobre introdução a aplicações web (Capítulo 3), Java Servlet 2.4, JSP 2.0,<br />
JSTL e JSF 1.1 (Capítulos 11 a 22).        * JSP Tutorial. [Em Inglês]        * The Java Web Services Tutorial, for Java Web Services Developer&#8217;s Pack, v2.0, 17 fev. 2006: Getting Started with Tomcat,<br />
Tomcat Administration Tool, Tomcat Web Application Manager; por Eric Armstrong at all, Sun Developer Network. Web Services<br />
Tutorial 1.0. [Em Inglês]        * YoLinux Tutorial: Java Servlets, JSP, Tomcat, Apache and Linux, por Greg Ippolito, YoLinux. [Em Inglês]        * Java and Tomcat on Mac OS X, Part I, Apple Developer Connection. Part II. [Em Inglês]        * HOWTO: Building Apache HTTPd + Tomcat on Linux, por John Turner. [Em Inglês]        * Integrating Tomcat and Apache on Red Hat, por Mike Millson. [Em Inglês]        * Using Apache Tomcat 4, Java Boutique. [Em Inglês]</p>
<p>Apache Tomcat</p>
<p>* Projeto Apache Tomcat &#8211; Servlet/JSP Container e Tomcat Connectors        * Apache Tomcat Wiki &#8211; Tomcat FAQ        * Apache Commons &#8211; Daemon: daemons (jsvc para Unix) e serviços (Procrun para Win32) baseados em Java</p>
<p>Livros sobre Tomcat</p>
<p>* Tomcat: The Definitive Guide, Segunda edição (e 1ª edição, junho 2003), por Jason Brittain e Ian F. Darwin; outubro 2007,<br />
O&#8217;Reilly Media, ISBN: 0-596-10106-6, 494 p. Leia trechos no O&#8217;Reilly Safari &#8211; Tomcat.        * Beginning JSP, JSF and Tomcat Web Development: From Novice to Professional, por Giulio Zambon, Michael Sekle; novembro<br />
2007, Apress, ISBN-13: 978-1-59059-904-4, 448 p.        * Pro Apache Tomcat 6, por Matthew Moodie, Kunal Mittal (Ed.); março 2007, Apress, ISBN-13: 978-1-59059-785-9, 325 p.        * Pro Apache Tomcat 5/5.5, por Matthew Moodie; dezembro 2004, Apress, ISBN: 1-59059-331-6, 379 p.        * Professional Apache Tomcat 6, por Vivek Chopra, Sing Li, Jeff Genender; agosto 2007, Wrox (Programmer to Programmer),<br />
ISBN-13: 978-0-471-75361-2, 629 p.        * Professional Apache Tomcat 5, por Vivek Chopra, Amit Bakore, Ben Galbraith, Sing Li, Chanoch Wiggers; maio 2004, Wrox<br />
(Programmer to Programmer), ISBN: 0-7645-5902-8, 624 p.        * Sams Teach Yourself JavaServer Pages 2.0 with Apache Tomcat in 24 Hours, Complete Starter Kit (PDF eBook), por Mark<br />
Wutka, Alan Moffet, Kunal Mittal; fevereiro 2004, Que Publishing, ISBN-13: 978-0-7686-6025-8, 552 p.        * Tomcat 5 Unleashed, por Lajos Moczar; agosto 2004, Sams, ISBN: 0-672-32636-1, 768 p.</p>
<p>Java Servlet &amp; JSP &#8211; Java EE Web</p>
<p>* Sun Java Servlet        * Sun JavaServer Pages (JSP)        * JavaServer Pages Standard Tag Library (JSTL)        * Jakarta Taglibs: implementação livre de JSTL 1.1 (para JSP 2.0) e JSTL 1.0 (para JSP 1.2)        * Java EE 5 Technologies &#8211; Web Application: JavaServer Faces 1.2, JavaServer Pages 2.1, JSP Standard Tag Library e Java<br />
Servlet 2.5; tecnologias, JSRs e especificações, por Sun Microsystems.        * J2EE v1.4 Documentation, por Sun Microsystems.        * Referências sobre JavaServer &amp; J2EE, por Márcio d&#8217;Ávila.</p>
<p>Especificações Servlet, JSP e JSTL</p>
<p>* Java Servlet 2.5 Specification (Maintenance Release 2), 11 set. 2007, JSR 154.        * Java Servlet 2.4 Specification (Final Release), 24 nov. 2003, JSR 154.        * JavaServer Pages 2.1 Specification (Final Release), 11 mai. 2006, JSR 245.        * JavaServer Pages 2.0 Specification (Final Release), 24 nov. 2003, JSR 152.        * Java Servlet 2.3 and JavaServer Pages 1.2 Specifications (Final Release), 25 set. 2001, JSR 53.        * JavaServer Pages Standard Tag Library (JSTL) Specification 1.2 (Maintenance Release 2), 11 mai. 2006, JSR 52.        * JavaServer Pages Standard Tag Library (JSTL) Specification 1.1 (Maintenance Release), 24 nov. 2003, JSR 52.        * JavaServer Pages Standard Tag Library (JSTL) Specification 1.0, 08 jul. 2002, JSR 52: A Standard Tag Library for<br />
JavaServer Pages.</p>
<p>Frameworks Web MVC para Java</p>
<p>* JavaServer Faces (JSF) &#8211; Versões e Downloads. Por Sun Microsystems.        * Projeto GlassFish Mojarra, implementação de referência JSF, em java.net.        * JSF and JSP: What&#8217;s New in Java EE 5. Uma conversa com Ed Burns (Sun Microsystems, líder da especificação JSF) e Jan<br />
Luehe, por Frank Sommers, 2006-05-17.        * JSF &#8211; Java Server Faces Tutorials em RoseIndia, incluindo Installação de JSF em Tomcat.        * Referências sobre Tecnologias Web em Java EE, por Márcio d&#8217;Ávila.</p>
<p>Organização de fontes de projeto Java</p>
<p>* Guidelines, Patterns, and Code for End-to-End Java Applications. Java Blueprints Guidelines: Project Conventions for<br />
Enterprise Applications. Sun Java Enterprise BluePrints.        * Source Organization &#8211; Apache Tomcat 6.0 Application Developer&#8217;s Guide.        * Maven &#8211; Introduction to the Standard Directory Layout, Documentação do Projeto Apache Maven. Maven encoraja o uso de uma<br />
estrutura de diretórios comum para projetos. Veja também An introduction to Maven 2, artigo pro John Ferguson Smart, dezembro<br />
2005, Java World.</p>
<p>Informação sobre Java</p>
<p>* Java.Sun.com &#8211; A fonte para desenvolvedores Java. Sun Developer Network (SDN).        * java.net &#8211; Portal de colaboração da comunidade sobre Tecnologia Java. Projetos open-source, fóruns, weblogs, artigos,<br />
notícias, wiki, Javapedia, grupos de usuários Java (JUGs).        * Referências sobre Programação Java: links, grupos de usuários, ferramentas, APIs, livros, certificação.</p>
<p>Firefox &#8211; A web de volta Creative Commons License</p>
<p>© 2003-2009, Márcio d&#8217;Ávila, mhavila.com.br, direitos reservados. O texto e código-fonte apresentados podem ser referenciados, distribuídos e utilizados, desde que expressamente citada esta fonte e o crédito do(s) autor(es). A informação aqui apresentada, apesar de todo o esforço para garantir sua precisão e correção, é oferecida &#8220;como está&#8221;, sem quaisquer garantias explícitas ou implícitas decorrentes de sua utilização ou suas conseqüências diretas e indiretas.</p>
<p><!--  NewPP limit report Preprocessor node count: 19/1000000 Post-expand include size: 0/2097152 bytes Template argument size: 0/2097152 bytes Expensive parser function count: 0/100 --> <!-- Saved in parser cache with key deserv-wiki_:pcache:idhash:80-0!1!0!!pt-br!2 and timestamp 20100118005754 --></p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">
<h2><span class="mw-headline">Introdução </span></h2>
<p>Para esta tarefa, estarei utilizando dois HDs idênticos, cada um com 160GB de espaço em disco. Em relação ao espaço em disco, os HDs podem ser de tamanhos diferentes ou tipos diferentes, mas para o RAID1 é necessário que as partições nos dois discos sejam iguais. Em outras palavras, você pode ter um disco de 160GB e outro de 250GB, mas tenha em mente que só vai dar para fazer RAID1 com os 160GB do segundo HD, pois o espaço não pode exceder o do primeiro HD. O resto destes 250GB você pode criar outra partição e fazer o que quiser.</p>
<p>Este tutorial leva em conta que você já tem alguma experiência com esses assuntos. Apesar de estar tudo explicado e mastigado, muita coisa aqui mexe com particionamento e migração de dados, e qualquer erro pode gerar perda de dados. Então tome cuidado e saiba sempre o que você vai fazer antes de fazer de verdade. Neste exemplo eu utilizei um sistema Debian, mas o método aqui serve para todas as distribuições com bem poucas diferenças, o que já foi comprovado por mim que funciona (Fedora, CentOS e RHEL).</p>
<p>Nesta instalação, dividimos o HD em 3 partições, que já estão no primeiro disco. Supondo que este primeiro disco seja o /dev/sda e o segundo seja o /dev/sdb, as três partições existentes atualmente são:</p>
<pre>   * /dev/sda1 (swap)
   * /dev/sda2 (/boot)
   * /dev/sda3 (/)</pre>
<p>O que faremos agora será criar um dispositivo de RAID1 no sistema. Este dispositivo inicialmente estará “incompleto”, pois apenas o disco 2 estará funcionando (o 1 estará ocupado com os dados atuais). Depois copiaremos todos os dados atuais para este segundo disco (já no RAID), reiniciaremos o sistema, deixando-o funcionando só a partir do disco 2 e depois colocaremos o disco 1, agora sem uso, também no RAID1, finalizando o processo.</p>
<p><a id="Verifica.C3.A7.C3.B5es" name="Verifica.C3.A7.C3.B5es"></a></p>
<h2><span class="editsection">[<a title="Editar seção: Verificações" href="http://www.deserv.com.br/wiki/index.php?title=Implementando_RAID1_em_um_sistema_sem_perder_dados&amp;action=edit&amp;section=2">editar</a>]</span> <span class="mw-headline"> Verificações </span></h2>
<p>2.1. LABELs nas partições</p>
<p>Verifique os arquivos: /etc/fstab e /boot/grub/menu.lst (ou /etc/grub.conf) e veja se não há nenhuma referência às partições via LABEL, ao invés do arquivo-dispositivo (p.ex.: /dev/sda3). Por exemplo, se no /etc/fstab tiver uma linha do tipo:</p>
<pre>LABEL=/                 /                       ext3    defaults        1 1</pre>
<p>Use o comando:</p>
<pre># findfs LABEL=/</pre>
<p>O comando irá mostrar qual partição tem o label /, que no nosso caso é /dev/sda3. Então vamos remover este label, com o comando:</p>
<pre># e2label /dev/sda2 ""</pre>
<p>Não esqueça de fazer isso para todo e qualquer LABEL que esteja configurado nesses arquivos. Isto é necessário para que em boots futuros, o sistema não se confunda na hora de montar as partições (caso, por exemplo, se coloque o mesmo LABEL em partições do disco 1 e 2).</p>
<p>2.2. Tamanho em disco</p>
<p>Verifique se os dois discos tem exatamente o mesmo tamanho, utilize os comandos como no exemplo a seguir:</p>
<pre># cat /sys/block/sda/size
312581808
# cat /sys/block/sdb/size
312581808</pre>
<p>Lembrando que se você tem HDs diferentes, este passo pode ser pulado, mas tenha em mente que na hora de criar as partições, você deverá tomar cuidado para criá-las com tamanhos exatamente iguais.</p>
<p>2.3. Pacotes necessários</p>
<p>O pacote do programa mdadm deve estar devidamente instalado, assim como o device-mapper suportado no kernel. Nas distribuições atuais, os dois geralmente vêm como padrão, então provavelmente você não vai ter problemas com isto. Em todo caso, em sistemas baseados no Red Hat, os pacotes vão se chamar algo como “mdadm” e “device-mapper”, enquanto que em sistemas baseados em Debian, os pacotes vão se chamar “mdadm” e “dmsetup”. Utilize o rpm (Red Hat) ou dpkg (Debian) para fazer essa verificação.</p>
<p><a id="Particionamento" name="Particionamento"></a></p>
<h2><span class="editsection">[<a title="Editar seção: Particionamento" href="http://www.deserv.com.br/wiki/index.php?title=Implementando_RAID1_em_um_sistema_sem_perder_dados&amp;action=edit&amp;section=3">editar</a>]</span> <span class="mw-headline"> Particionamento </span></h2>
<p>Uma vez verificados os tamanhos exatos nos HDs, mude os tipos das partições do primeiro disco para “Linux raid autodetect”. Este tipo será utilizado para montarmos o dispositivo RAID1 posteriormente. Para mudar o tipo, utilize a ferramenta fdisk:</p>
<pre># fdisk /dev/sda</pre>
<p>Depois mude o tipo das três partições para o tipo fd. O comando dentro do fdisk para fazer isto é o t seguida pelo número da partição. Mudado os três tipos, o comando p dentro do fdisk irá mostrar algo parecido com isto:</p>
<pre>Disk /dev/sda: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1         122      979933+  fd  Linux raid autodetect
/dev/sda2   *         123         134       96390   fd  Linux raid autodetect
/dev/sda3             135       19457   155211997+  fd  Linux raid autodetect</pre>
<p>Salve com o comando w do fdisk. Depois reinicie a máquina.</p>
<p>Depois de reiniciada, copie a tabela de partições do HD primário (sda) para o HD secundário (sdb), assim os dois vão ficar com as partições exatamente na mesma ordem e do mesmo tamanho também. Para esta tarefa, use o comando “sfdisk” como no exemplo abaixo:</p>
<pre># sfdisk -d /dev/sda &gt; /tmp/partitions.txt
# sfdisk /dev/sdb &lt; /tmp/partitions.txt</pre>
<p>O primeiro comando acima escreve no arquivo /tmp/partitions.txt a tabela exata das partições do primeiro disco. O segundo comando particiona o segundo disco exatamente de acordo com o conteúdo do arquivo /tmp/partitions.txt.</p>
<p>Lembre-se: O segundo comando destrói toda a tabela de partições no disco /dev/sdb. Certifique-se de que o dispositivo seja este mesmo antes de executar o comando para não perder dados.</p>
<pre>Nota: Caso você não possua HDs idênticos, você terá que fazer o processo de particionamento manualmente. Ao invés de utilizar o comando sfdisk para copiar a tabela de partições de um HD para o outro, crie manualmente via fdisk as partições na mesma ordem e tamanho do primeiro HD.</pre>
<p>4. Dispositivo RAID</p>
<p>Agora é hora de criar o dispositivo RAID, que por enquanto só terá como membro o disco 2, pois o primeiro está sendo utilizado pelo sistema. Como temos 3 partições que queremos incluir no RAID1, criaremos três dispositivos RAID1:</p>
<pre># mdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/sdb3
# mdadm --create /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb1
# mdadm --create /dev/md2 --level=1 --raid-devices=2 missing /dev/sdb2</pre>
<p>Os comandos acima criam três dispositivos: /dev/md0, /dev/md1 e /dev/md2. Todos eles são do tipo RAID1 (–level=1), contendo duas partições: uma faltando (”missing”, o primeiro disco) e a partição do segundo disco em si.</p>
<p>Para fácil memorização, aqui estão os dispositivos e a equivalência de sua função no sistema:</p>
<pre>   * /dev/md0 – / (raiz)
   * /dev/md1 – Memória SWAP
   * /dev/md2 – /boot</pre>
<p>Para verificar se os dispositivos foram criados e reconhecidos, tem que haver semelhança com a saída do comando a seguir:</p>
<pre># cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdb1[0]
      979840 blocks [2/1] [U_]

md2 : active raid1 sdb2[0]
      96320 blocks [2/1] [U_]

md0 : active raid1 sdb3[0]
      155211904 blocks [2/1] [U_]

unused devices: &lt;none&gt;</pre>
<p>Caso não esteja de acordo, reinicie a máquina para o kernel reconhecer as novas configurações.</p>
<p><a id="Sistemas_de_Arquivos" name="Sistemas_de_Arquivos"></a></p>
<h2><span class="editsection">[<a title="Editar seção: Sistemas de Arquivos" href="http://www.deserv.com.br/wiki/index.php?title=Implementando_RAID1_em_um_sistema_sem_perder_dados&amp;action=edit&amp;section=4">editar</a>]</span> <span class="mw-headline"> Sistemas de Arquivos </span></h2>
<p>Primeiro crie o sistema de swap na partição /dev/md1:</p>
<pre># mkswap /dev/md1</pre>
<p>Depois crie o sistema de arquivos ext3 na partição /dev/md0 (raiz):</p>
<pre># mke2fs -j /dev/md0</pre>
<p>Em seguida crie o sistema de arquivos ext3 na partição /dev/md2 (/boot):</p>
<pre># mke2fs -j /dev/md2</pre>
<p><a id="O_sistema_no_segundo_disco" name="O_sistema_no_segundo_disco"></a></p>
<h2><span class="editsection">[<a title="Editar seção: O sistema no segundo disco" href="http://www.deserv.com.br/wiki/index.php?title=Implementando_RAID1_em_um_sistema_sem_perder_dados&amp;action=edit&amp;section=5">editar</a>]</span> <span class="mw-headline"> O sistema no segundo disco </span></h2>
<p>Agora que o segundo disco já está pronto com os dispositivos RAID1 funcionais, é hora de copiar todo o conteúdo do primeiro HD para o segundo HD.</p>
<p>Antes de começar toda a cópia, modifique a configuração do GRUB para ele carregar o sistema no dispositivo RAID ao invés de diretamente do primeiro HD. Para fazer isso, edite o arquivo /boot/grub/menu.lst, deixando a entrada do sistema operacional como no exemplo a seguir:</p>
<pre>title           Debian GNU/Linux, kernel 2.6.24-1-686
root            (hd1,1)
kernel          /vmlinuz-2.6.24-1-686 root=/dev/md0 ro
initrd          /initrd.img-2.6.24-1-686
savedefault</pre>
<p>Ou seja, anteriormente a linha do kernel tinha como root uma partição como a /dev/sda3. Como queremos usar agora o RAID, mudamos para /dev/md0 (equivalente à raiz no raid).</p>
<p>Em seguida, é hora de fazer toda a cópia. Monte o esqueleto do segundo HD no diretório /mnt e copie via comando “cp -a” os diretórios da raiz do primeiro HD para o esqueleto.</p>
<p>Use o exemplo a seguir como um guia:</p>
<pre># cd /mnt
# mkdir novo-boot nova-raiz
# mount -t ext3 /dev/md2 novo-boot
# mount -t ext3 /dev/md0 nova-raiz

# cp -a /boot/* novo-boot

# cd nova-raiz
# mkdir boot initrd mnt proc sys
# cp -a /bin /cdrom /dev /etc /home /initrd.img /lib /media ./
# cp -a /opt /root /sbin /srv /tmp /usr /var /vmlinuz ./</pre>
<p>Depois de copiado todos os arquivos (pode demorar um pouco), edite o arquivo /mnt/nova-raiz/etc/fstab, que fica no dispositivo RAID, para refletir as configurações da nova localização do sistema. Mude os dispositivos das partições para seus equivalentes como dispositivos RAID. Veja o exemplo a seguir:</p>
<pre>proc            /proc           proc    defaults        0       0
/dev/md0        /               ext3    defaults,errors=remount-ro 0       1
/dev/md2        /boot           ext3    defaults        0       2
/dev/md1        none            swap    sw              0       0
/dev/hda        /media/cdrom0   udf,iso9660 user,noauto     0       0</pre>
<p>Feito isso, reinicie o sistema. O GRUB deverá carregar o sistema no segundo HD, deixando o primeiro livre. Para verificar se isto foi realmente feito, utilize o comando mount e compare com o exemplo a seguir:</p>
<pre># mount
/dev/md/0 on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
procbususb on /proc/bus/usb type usbfs (rw)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/md/2 on /boot type ext3 (rw)</pre>
<p><a id="Adicionando_o_primeiro_disco_no_RAID1" name="Adicionando_o_primeiro_disco_no_RAID1"></a></p>
<h2><span class="editsection">[<a title="Editar seção: Adicionando o primeiro disco no RAID1" href="http://www.deserv.com.br/wiki/index.php?title=Implementando_RAID1_em_um_sistema_sem_perder_dados&amp;action=edit&amp;section=6">editar</a>]</span> <span class="mw-headline"> Adicionando o primeiro disco no RAID1 </span></h2>
<p>Agora que o sistema está funcionando exclusivamente no dispositivo RAID, o primeiro HD está livre e podemos adicioná-lo ao dispositivo também. Lembrando que esta operação irá destruir todos os dados do primeiro HD. Então certifique-se que seu sistema está funcionando corretamente, agora no disco 2, e com todos os seus dados!</p>
<p>Para adicionar as três partições do primeiro disco no RAID, utilize os comandos:</p>
<pre># mdadm /dev/md0 -a /dev/sda3
# mdadm /dev/md1 -a /dev/sda1
# mdadm /dev/md2 -a /dev/sda2</pre>
<p>O processo de adição do primeiro disco no RAID pode demorar bastante. Uma vez adicionada as partições, o Linux irá sincronizar todos os dados, copiando todas as informações do segundo disco no primeiro e criando os recursos de redundância (espelhamento). Para aumentar a velocidade deste processo, certifique-se que o sistema não esteja sendo muito usado e execute o comando:</p>
<pre># echo -n 500000 &gt; /proc/sys/dev/raid/speed_limit_max</pre>
<p>Isso irá aumentar a velocidade padrão de atividades de sincronismo do RAID. Se você quiser acompanhar o processo detalhadamente, abra um novo terminal e utilize o seguinte comando:</p>
<pre># watch --interval 1 'cat /proc/mdstat'</pre>
<p>Este comando lhe passará o conteúdo do arquivo /proc/mdstat (que contém o status atual dos dispositivos RAID do sistema) em um intervalo de 1 segundo. Ao final do processo, o conteúdo do arquivo /proc/mdstat deverá estar semelhante ao seguinte:</p>
<p>Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]</p>
<pre>md1 : active raid1 sda1[0] sdb1[1]
      979840 blocks [2/2] [UU]

md2 : active raid1 sda2[0] sdb2[1]
      96320 blocks [2/2] [UU]

md0 : active raid1 sda3[0] sdb3[1]
      155211904 blocks [2/2] [UU]

unused devices: &lt;none&gt;</pre>
<p>Pronto, agora o espelhamento entre HDs já está funcionando.</p>
<p><a id="Instalando_o_GRUB_nos_dois_discos" name="Instalando_o_GRUB_nos_dois_discos"></a></p>
<h2><span class="editsection">[<a title="Editar seção: Instalando o GRUB nos dois discos" href="http://www.deserv.com.br/wiki/index.php?title=Implementando_RAID1_em_um_sistema_sem_perder_dados&amp;action=edit&amp;section=7">editar</a>]</span> <span class="mw-headline"> Instalando o GRUB nos dois discos </span></h2>
<p>Apesar do espelhamento estar funcionando, o antigo GRUB foi destruído e precisamos agora instalá-lo nos dois discos para uma redundância verdadeira. Para fazer isso execute o comando “grub”, que irá lhe colocar em uma linha de comando do próprio grub. Os três comandos a seguir irão instalar o GRUB no primeiro HD:</p>
<pre>grub&gt; device (hd0) /dev/sda
grub&gt; root (hd0,0)
 Filesystem type is ext2fs, partition type 0xfd
grub&gt; setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  15 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.</pre>
<p>Agora faça o mesmo para o segundo disco:</p>
<pre>grub&gt; device (hd0) /dev/sdb
grub&gt; root (hd0,0)
 Filesystem type is ext2fs, partition type 0xfd
grub&gt; setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  15 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.</pre>
<p>Por último, edite o arquivo de configuração do GRUB para deixar a entrada do sistema da seguinte forma:</p>
<pre>title           Debian GNU/Linux, kernel 2.6.24-1-686
root            (hd0,1)
kernel          /vmlinuz-2.6.24-1-686 root=/dev/md0 ro
initrd          /initrd.img-2.6.24-1-686
savedefault</pre>
<p>Com este último passo, todas as configurações do espelhamento estarão feitas e o sistema inteiro (inclusive a memória swap) estará funcionando nos dois discos ao mesmo tempo. Você pode reiniciar a máquina para verificar se tudo está funcionando devidamente, lembrando que pode-se verificar o status dos dispositivos RAID no conteúdo do arquivo /proc/mdstat.</p>
</div>
<div class="shr-publisher-266"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/01/22/tutorial-tomcat-instalacao-e-configuracao-basica/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Criando uma conta no OpenDNS</title>
		<link>http://blog.deserv.info/2010/01/19/criando-uma-conta-no-opendns/</link>
		<comments>http://blog.deserv.info/2010/01/19/criando-uma-conta-no-opendns/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 12:02:49 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[DNS]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[OpenDNS]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=247</guid>
		<description><![CDATA[Com a configuração feita anteriormente, seu computador passará a utilizar o OpenDNS como serviço de resolução de DNS. Entretanto, como dito na introdução do tutorial, ainda resta muito a explorar dos serviços oferecidos, como a filtragem e o bloqueio de domínios. Mas, para isso, temos que ainda executar alguns passos, e o primeiro deles é a criação de uma conta gratuita no site da OpenDNS. Para isso, acesse o site:]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.deserv.info%252F2010%252F01%252F19%252Fcriando-uma-conta-no-opendns%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Criando%20uma%20conta%20no%20OpenDNS%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div>
<p>Com a configuração feita anteriormente, seu computador passará a utilizar o OpenDNS como serviço de resolução de DNS. Entretanto, como dito na introdução do tutorial, ainda resta muito a explorar dos serviços oferecidos, como a filtragem e o bloqueio de domínios. Mas, para isso, temos que ainda executar alguns passos, e o primeiro deles é a criação de uma conta gratuita no site da OpenDNS. Para isso, acesse o site: <span id="more-247"></span></p>
<p><img src="http://www.guiadohardware.net/imagens/img-a30cd248.jpeg" alt="01" width="750" height="563" /></p>
<p>E clique no link <em>&#8220;Create account&#8221;</em>, no canto superior direito. Depois disto, basta preencher os dados e avançar:</p>
<p><img src="http://www.guiadohardware.net/imagens/img-c0b01ecc.jpeg" alt="02" width="750" height="563" /></p>
<p>Na próxima tela, clique em <em>&#8220;Computer&#8221;</em>:</p>
<p><img src="http://www.guiadohardware.net/imagens/img-5c34200d.jpeg" alt="03" width="750" height="563" /></p>
<p>Ignore as instruções dadas pelo site, e avance novamente. A seguinte tela lhe será mostrada, no final:</p>
<p><img src="http://www.guiadohardware.net/imagens/img-15170360.jpeg" alt="04" width="750" height="563" /></p>
<p>Clique em <em>&#8220;Open DNS Dashboard&#8221;</em> para acessar o painel de configurações.</p>
<p>Dependendo da situação, você já tem uma conta e quer apenas fazer o login. Para isso, vá em <em>&#8220;Sign in&#8221;</em> na tela inicial do site, e insira seus dados na próxima tela:</p>
<p><img src="http://www.guiadohardware.net/imagens/img-0c8b3edf.png" alt="05" width="592" height="317" /></p>
<p>A tela inicial do painel de configurações será carregada:</p>
<p><img src="http://www.guiadohardware.net/imagens/img-6f16df58.jpeg" alt="06" width="750" height="563" /></p>
<p>A seguir, clique na aba <em>&#8220;Settings&#8221;</em>, para criarmos as configurações iniciais de sua rede:</p>
<p><img src="http://www.guiadohardware.net/imagens/img-f3e8a01c.jpeg" alt="10" width="750" height="563" /></p>
<p>Veja que, no meu caso, a rede <em>&#8220;Casa&#8221;</em> já está criada; mas na sua conta certamente não há nenhuma rede adicionada. Vamos adicionar: digite seu IP (disponível no canto superior direito da tela, ou deixe o preenchimento automático) no campo <em>&#8220;Add a netword&#8221;</em>, e se você preencheu todos os dados da conta, poderá escolher a faixa de IPs da rede. No meu caso, selecione o padrão se você tem um IP somente, o <em>/32</em>:</p>
<p><img src="http://www.guiadohardware.net/imagens/img-5992990d.png" alt="07" width="628" height="141" /></p>
<p>Clicando no botão <em>&#8220;Add this network&#8221;</em>, aparecerá a seguinte tela:</p>
<p><img src="http://www.guiadohardware.net/imagens/img-5d174d58.png" alt="08" width="598" height="472" /></p>
<p>Insira um nome para a rede, e se seu IP for dinâmico (Speedy, NET, e grande maioria dos serviços de Internet a cabo e DSL no Brasil), assinale a opção <em>&#8220;Yes, its dynamic&#8221;</em>. Clique em <em>&#8220;Done&#8221;</em>, e feito:</p>
<p><img src="http://www.guiadohardware.net/imagens/img-b3d2798c.png" alt="09" width="629" height="481" /></p>
<p>Não esqueça de verificar seu email e confirmar a adição da rede. Se seu IP for dinâmico, vá para a próxima página do tutorial. Senão, pule duas páginas.</p>
<p>Fonte: http://www.guiadohardware.net</p>
</div>
<div class="shr-publisher-247"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/01/19/criando-uma-conta-no-opendns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenDNS: Configurando o uso dos servidores no seu computador: Linux</title>
		<link>http://blog.deserv.info/2010/01/18/opendns-configurando-o-uso-dos-servidores-no-seu-computador-linux/</link>
		<comments>http://blog.deserv.info/2010/01/18/opendns-configurando-o-uso-dos-servidores-no-seu-computador-linux/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 12:01:05 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[DNS]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[OpenDNS]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Reverso]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=245</guid>
		<description><![CDATA[O Linux possui vários utilitários gráficos para a configuração de rede, incluindo de servidores DNS, e dentre estes incluem o elaborado Network Manager, presente na distribuição Ubuntu. Mas como não confio muito na eficiência de certos utilitários gráficos, e devido ao grande remelexo de diferentes de utilitários, para diferentes distribuições e seus respectivos ambientes gráficos, vou escrever aqui um meio único para praticamente todas as distribuições: o velho terminal e a edição de arquivos.]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.deserv.info%252F2010%252F01%252F18%252Fopendns-configurando-o-uso-dos-servidores-no-seu-computador-linux%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F5iT3aB%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22OpenDNS%3A%20Configurando%20o%20uso%20dos%20servidores%20no%20seu%20computador%3A%20Linux%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div>
<p>O <strong>Linux</strong> possui vários utilitários gráficos para a configuração de rede, incluindo de servidores DNS, e dentre estes incluem o elaborado Network Manager, presente na distribuição Ubuntu. Mas como não confio muito na eficiência de certos utilitários gráficos, e devido ao grande remelexo de diferentes de utilitários, para diferentes distribuições e seus respectivos ambientes gráficos, vou escrever aqui um meio único para praticamente todas as distribuições: o velho terminal e a edição de arquivos. <span id="more-245"></span></p>
<p>Vamos lá. Use aqui o editor de sua preferência; se você não sabe qual é, aqui vai uma dica: no Gnome, o padrão é o gedit; no KDE, o kedit; já no XFCE, o mousepad. Abra seu terminal favorito, e vamos abrir o arquivo <em>&#8220;/etc/resolv.conf&#8221;</em>:</p>
<div>$ sudo kedit /etc/resolv.conf</div>
<p>Apague tudo o que está neste arquivo, e coloque as seguintes linhas:</p>
<div>nameserver 208.67.222.222<br />
nameserver 208.67.220.220</div>
<p>Isso fará com que o seu sistema operacional passe a usar os servidores do OpenDNS, ao invés de seu provedor.</p>
<p>Entretanto, isso não basta. Hoje, a grande maioria das distribuições usa o DHCP para a configuração da rede. Em suma, cada vez que o DHCP funcionar, vai deixar o <em>resolv.conf</em> igual era originalmente.</p>
<p>Para você não ter que ficar modificando o arquivo toda vez que ligar o computador ou reiniciar a rede, vamos abrir o arquivo de configuração do DHCP, o <em>&#8220;/etc/dhcp3/dhclient.conf&#8221;</em>, em:</p>
<div>$ sudo kedit /etc/dhcp3/dhclient.conf</div>
<p>E, no início do arquivo, abaixo das linhas comentadas (com # na frente), adicione a seguinte linha:</p>
<div>prepend domain-name-servers 208.67.222.222,208.67.220.220;</div>
<p>Salve o arquivo, e saia. Agora, reinicie sua rede com um:</p>
<div>$ sudo ifconfig eth0 down ;  sudo ifconfig eth0 up</div>
<p>Pronto. Não precisa fazer mais nada, seu computador já está utilizando o OpenDNS, e nenhuma configuração adicional para este fim será requerida.</p>
<p>Julio Cesar Bessa Monqueiro<br />
21/12/2009<br />
Fonte: http://www.guiadohardware.net</p>
<p><script type="text/javascript">// <![CDATA[
google_ad_client = "pub-8257810009605396";
google_alternate_ad_url = "http://www.guiadohardware.net/google_adsense_script.html";
google_ad_width = 384;
google_ad_height = 280;
google_ad_format = "336x280_as";
google_color_border = "fafafa";
google_color_bg = "fafafa";
google_color_link = "003399";
google_color_url = "4682B4";
google_color_text = "000000";
google_ad_type = 'text_image_flash_html';
google_safe = 'medium';
// ]]&gt;</script></p>
</div>
<div class="shr-publisher-245"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/01/18/opendns-configurando-o-uso-dos-servidores-no-seu-computador-linux/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

