


<?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; Softwares Adicionais</title>
	<atom:link href="http://blog.deserv.info/category/geral/softwares-adicionais/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, 25 Jan 2012 17:47:08 +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>Ataques DDoS: Prevenção e Mitigação</title>
		<link>http://blog.deserv.info/2011/09/06/ataques-ddos-prevencao-e-mitigacao/</link>
		<comments>http://blog.deserv.info/2011/09/06/ataques-ddos-prevencao-e-mitigacao/#comments</comments>
		<pubDate>Tue, 06 Sep 2011 20:29:15 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Softwares Adicionais]]></category>
		<category><![CDATA[Ataques]]></category>
		<category><![CDATA[Ataques DDoS]]></category>
		<category><![CDATA[DDos]]></category>
		<category><![CDATA[DoS]]></category>
		<category><![CDATA[Mitigação]]></category>
		<category><![CDATA[Prevenção]]></category>
		<category><![CDATA[Proteção]]></category>
		<category><![CDATA[segurança]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=581</guid>
		<description><![CDATA[O conceito de Distributed Denial of Service (DDoS) entrou na consciência pública após principais websites enorme como Change.org , WordPress , e vários governos e notíciassites de diferentes países foram recentemente vítimas de uma série de ataques. Apelidado de instrumento moderno de cyber-guerra, uma maneira rápida e simples para descrever DDoS é que, sob 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%252F2011%252F09%252F06%252Fataques-ddos-prevencao-e-mitigacao%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FoKrIUB%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ataques%20DDoS%3A%20Preven%C3%A7%C3%A3o%20e%20Mitiga%C3%A7%C3%A3o%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>O conceito de Distributed Denial of Service (DDoS) entrou na consciência pública após principais websites enorme como Change.org , WordPress , e vários governos e notíciassites de diferentes países foram recentemente vítimas de uma série de ataques.<span id="more-581"></span></p>
<p>Apelidado de instrumento moderno de cyber-guerra, uma maneira rápida e simples para descrever DDoS é que, sob a tática, códigos maliciosos infectam computadores para desencadear ataques em massa contra sites segmentados, fazendo-a ser inacessíveis ao tráfego legítimo. Ataques DDoS, apesar de sofisticados, são difíceis de defender e nesta parte, você vai descobrir o porquê.</p>
<p>Provavelmente, o maior equívoco sobre os ataques DDoS é que quando você tem um único software de proteção instalado e estão sendo executados em uma plataforma de Internet bem conhecidos ou hospedar, você já está seguro &#8211; recentes ataques a grandes sites que têm refutado. Temos muita sorte de ter caras da <a href="http://translate.googleusercontent.com/translate_c?hl=pt-BR&amp;langpair=en%7Cpt&amp;rurl=translate.google.com.br&amp;twu=1&amp;u=http://www.radware.com/&amp;usg=ALkJrhjIW-x0I63SYm9zq_IF7ipp1dEv6Q" target="_blank">Radware</a> , um sistema integrado de entrega de aplicativos empresa de soluções, especializada em DDoS prevenção e mitigação, para nos levar para um olhar mais atento sobre os ataques DDoS.</p>
<h3>Como os principais sites, incluindo WordPress, foram violados com sucesso com os ataques DDoS</h3>
<p>Radware nos disse que as metas ainda muito maiores têm sido privados de conectividade com a Internet básica no passado, incluindo infra-estruturas de Internet de países inteiros &#8211; cujos cidadãos não foram capazes de usar a Internet durante os ataques DDoS em curso.</p>
<p>Muitos destes ataques teve sucesso porque muitas empresas e redes ainda estão mal equipados, quando se trata de enfrentar os ataques DoS &#8211; enquanto os gerentes de segurança estão muito bem versados ​​na escolha das tecnologias mais adequado para combater as ameaças, como invasões, worms e explorações aplicação web &#8211; Há um equívoco comum entre a comunidade de segurança que estas mesmas tecnologias podem também ser invocado para proteção DoS.</p>
<p>Um exemplo seria o <a href="http://en.wikipedia.org/wiki/Intrusion_prevention_system" target="_blank">Intrusion Prevention System</a> , que na maior parte se concentra em tecnologia baseada em assinaturas. A solução IPS contém regras pré-definidas ou assinaturas para a identificação de tráfego malicioso conhecido. Ela geralmente usa hardware especializado para a detecção de tráfego, tais com taxas de alto rendimento, bem como a análise do complexo da camada de protocolos e 7 a normalização do tráfego para evitar técnicas de evasão diferentes. Além disso, tradicionalmente fornece básica &#8220;Anti-DoS&#8221; características tais como taxa de limites.</p>
<p>Radware explica:</p>
<p>Proteger contra ataques DoS, distribuídos ou não, normalmente não exigem a funcionalidade acima (por exemplo, detecção baseada em assinaturas normalização do tráfego) &#8211; cada pedido, enviado como parte de um ataque DoS, pode ver completamente legítimo em si renderização assinatura de detecção de inútil e taxa-limite de características tipicamente limitar o tráfego legítimo da mesma forma que o tráfego ilegítimo &#8211; trazendo a condição de DoS à IPS ao invés da entidade sob ataque como o IPS inicia bloqueando o tráfego legítimo.</p>
<p>Soluções mais tradicionais IPS são, portanto, incapaz de proteger contra os ataques DDoS.</p>
<h3>O caminho, manual ineficaz</h3>
<p>Uma vez afetado, enquanto despreparados, embora exija conhecimentos técnicos, pode-se tentar manualmente analisar o tráfego, distinguir as características de ataque da norma &#8211; então tentar bloquear o ataque, usando as características de ataque com base em métodos, dependendo do tipo de ataque. Radware explica:</p>
<p>Se o dilúvio é stateful (exigindo a realização de um handshake TCP completa, garantindo os endereços IP de origem não são falsificados), por exemplo uma inundação HTTP &#8211; e é fácil de pegar que o atacante é pelo cruzamento de transação HTTP layer-7 estatísticas por endereço IP, os endereços de IP pode ser seguramente na lista negra no ACL router.</p>
<p>A questão é que fazer o acima manualmente pode ser muito demorado e muitas vezes não vai produzir nenhum resultado se o ataque é muito intenso para hardware commodity de manusear.</p>
<h3>O melhor esforço para prevenir ataques DDoS</h3>
<p>Uma solução Anti-DoS deve ser composto de tecnologia Anti-DDoS e Anti-DDoS serviços de resposta de emergência a fim de ser eficaz, e chegar a 100% de prevenção DDoS:</p>
<p>I. Anti-DDoS tecnologia</p>
<ul>
<li>Desempenho de mitigação &#8211; DDoS alta taxa deve ser mitigado por hardware especializado para suportar a carga de ataque, permitindo o tráfego legítimo para passar &#8211; por exemplo, Anti-DDoS soluções usando ASIC baseada em motores de Mitigação de DDoS</li>
<li>Reduzindo o tempo de reação &#8211; Análise Comportamental de Rede Tecnologia (NBA) deve ser utilizado para automaticamente e com precisão distinguir o tráfego ataque de tráfego legítimo &#8211; em todas as camadas, incluindo camada 7 (por exemplo, HTTP)</li>
<li>Bloqueio de múltiplos vetores de ataque &#8211; usando NBA, IPS e DoS tecnologias dentro de uma solução anti-DDoS único garante nenhum ataque é negligenciado durante uma campanha de ataque multi-vector</li>
</ul>
<p>II. Anti-DDoS serviços</p>
<ul>
<li>Resposta de emergência &#8211; usando a tecnologia anti-DDoS avançadas deve ser complementado por engenheiros de segurança comprovada, experiente e conhecedor que são bem versados ​​na mitigação DDoS ataque e o funcionamento da solução escolhida Anti-DDoS. A 24 × 7 centralizado serviço desse tipo (por exemplo, fornecido por um vendedor de Anti-DDoS) pode garantir o fator humano necessário para mitigar os ataques DDoS forma mais eficiente possível</li>
</ul>
<h3>Você deve se preocupar?</h3>
<p>Quando afetados, o impacto direto é simplesmente um &#8220;Denial of Service&#8221; &#8211; o serviço sob o ataque irá parar de responder &#8211; às vezes, toda a rede do serviço sob o ataque pode parar de responder, se o ataque é forte o suficiente para afetar equipamentos de rede no perímetro do alvo (por exemplo, firewalls).</p>
<p>O elemento chave compartilhada por todos os alvos de ataques DDoS tem sido a incapacidade de lidar com uma <a href="http://translate.googleusercontent.com/translate_c?hl=pt-BR&amp;langpair=en%7Cpt&amp;rurl=translate.google.com.br&amp;twu=1&amp;u=http://thenextweb.com/media/2010/12/19/how-ddos-attacks-became-the-frontline-tool-of-cyber-war/&amp;usg=ALkJrhgleE00vSdBOOZ8ouM0Txrdd9YFNA">década de idade</a> ameaça. No entanto, isso não tem a ver com a falta de preparação, mas mais de vítimas de queda de um dedicado, ataques coordenados por hacktivistas, como podemos chamá-los.</p>
<p>Embora não seja um impacto direto de DoS &#8211; ataques podem ser lançados não só para derrubar um serviço, mas também para servir como uma distração, enquanto se infiltrar em outros servidores na organização e de devastar &#8211; comprometer informações confidenciais, o plantio de código malicioso e muito mais.</p>
<p>A menos que você está um blog ou site grandes que são especificamente orientadas por hackers, você não tem muito que se preocupar. No entanto, se você for, seria melhor ter uma equipe dedicada ao monitoramento e mitigação de tais ataques, ou apenas pegar um especialista de terceiros no fornecimento de soluções para fazê-lo.</p>
<p>Fonte: <strong><a href="http://thenextweb.com/" target="_blank">http://thenextweb.com/</a></strong></p>
<div class="shr-publisher-581"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2011/09/06/ataques-ddos-prevencao-e-mitigacao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nginx + Apache + PHP5 + APC + Linux + Memcached = PERFORMANCE!! (parte 2)</title>
		<link>http://blog.deserv.info/2011/08/16/nginx-apache-php5-apc-linux-memcached-performance-parte-2/</link>
		<comments>http://blog.deserv.info/2011/08/16/nginx-apache-php5-apc-linux-memcached-performance-parte-2/#comments</comments>
		<pubDate>Tue, 16 Aug 2011 19:24:19 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Instalação e Compilação de SW]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Proxy]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[Softwares Adicionais]]></category>
		<category><![CDATA[APC]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[otimização]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=564</guid>
		<description><![CDATA[Depois de apresentar a configuração do Apache, PHP, APC e Memcached na primeira parte, agora é hora do Nginx. Basicamente, vamos utilizar o Nginx para servir apenas conteúdo estático (imagens, css, javascript, etc), pois ele possui recursos que garantem uma boa performance para este fim, como por exemplo usar o Memcached como cache. Quando ele [...]]]></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%252F08%252F16%252Fnginx-apache-php5-apc-linux-memcached-performance-parte-2%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FofLwXW%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Nginx%20%2B%20Apache%20%2B%20PHP5%20%2B%20APC%20%2B%20Linux%20%2B%20Memcached%20%3D%20PERFORMANCE%21%21%20%28parte%202%29%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Depois de apresentar a configuração do <a href="http://httpd.apache.org/" target="_blank">Apache</a>, <a href="http://www.php.net/" target="_blank">PHP</a>, <a href="http://pecl.php.net/package/APC" target="_blank">APC</a> e <a href="http://memcached.org/" target="_blank">Memcached</a> na <a href="http://www.bragil.net/linux-unix/nginx-apache-php5-apc-memcached-linux-performance-1/" target="_self">primeira parte</a>, agora é hora do <a href="http://wiki.nginx.org/Main" target="_blank">Nginx</a>. Basicamente, vamos utilizar o <a href="http://wiki.nginx.org/Main" target="_blank">Nginx</a> para servir apenas conteúdo estático (imagens, css, javascript, etc), pois ele possui recursos que garantem uma boa performance para este fim, como por exemplo usar o <a href="http://memcached.org/" target="_blank">Memcached</a> como cache. Quando ele recebe uma requisição para processar um arquivo <a href="http://www.php.net/" target="_blank">PHP</a>, ele “passa a bola” para o <a href="http://httpd.apache.org/" target="_blank">Apache</a>, servindo também como um proxy. Fica mais fácil de entender olhando o fluxo abaixo: <span id="more-564"></span></p>
<blockquote>
<pre>                                PHP
requisição --&gt; [Nginx] ------------&gt; [Apache] ---&gt; (PHP + APC)
                  |
                  |
                  |
                  | conteúdo estático
                  | (imagens, js, css, etc)
                  |
            (Memcached)</pre>
<p>Após o famoso comando <strong>apt-get install nginx</strong>, devemos editar os arquivos de configuração e acertar os detalhes para que tudo isso aí em cima funcione corretamente. Vamos começar pelo arquivo <strong>/etc/nginx/nginx.conf</strong>, onde estão as configurações globais:</p></blockquote>
<div>
<div>
<blockquote>
<pre>user www-data;
worker_processes  2;
 
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
 
events {
    worker_connections  1024;
}
 
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
 
    access_log  /var/log/nginx/access.log;
    client_body_temp_path /var/lib/nginx/body 1 2;
    sendfile        on;
 
    keepalive_timeout  65;
    tcp_nodelay        on;
 
    # Habilitar a compressão gzip
    gzip  on;
    gzip_buffers 32 8k;
    gzip_comp_level   6;
    gzip_http_version 1.0;
    gzip_min_length   0;
    gzip_types        text/html text/css image/x-icon
        application/x-javascript application/javascript text/javascript application/atom+xml application/xml ;
 
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}</pre>
</blockquote>
</div>
</div>
<p>Não há muito segredo, principalmente se você já mexeu com os arquivos de configuração de outros web servers, como o <a href="http://httpd.apache.org/" target="_blank">Apache</a>. O próximo passo agora é a configuração do virtual server, onde ficam os detalhes mais importantes. O arquivo para configuração do virtual server default é o <strong>/etc/nginx/sites-enabled/default</strong>:</p>
<div>
<div>
<blockquote>
<pre># O alias "wordpressapache" aponta para o servidor Apache,
# onde serão redirecionados os scripts PHP para processamento.
upstream wordpressapache {
        server dominio.com:8080 weight=1 fail_timeout=120s;
}
 
server {
        listen   80;
        server_name www.dominio.com;
        access_log  /var/log/nginx/wordpressapache.access.log;
 
        location / {
                # Diretório raiz do site
                root /home/site;
                # As linhas abaixo servem para configurar o redirecionamento
                # para o servidor Apache, quando necessário.
                proxy_pass      http://wordpressapache;
                proxy_redirect off;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                client_max_body_size 10m;
                client_body_buffer_size 128k;
                proxy_connect_timeout 90;
                proxy_send_timeout 90;
                proxy_read_timeout 90;
                proxy_buffer_size 4k;
                proxy_buffers 4 32k;
                proxy_busy_buffers_size 64k;
                proxy_temp_file_write_size 64k;
 
                # Aqui vão as configurações para que o Nginx use o Memcached
                # como cache, para aumentar a performance.
                set $memcached_key $uri;
                memcached_pass 127.0.0.1:11211;
                error_page 404 = @fallback;
        }
 
        # Caso a página não seja encontrada no memcached, passa para o Apache.
        location @fallback {
                proxy_pass      http://wordpressapache;
        }
 
        # Quando forem requisitados scripts PHP, redireciona para o Apache.
        location ~* wp\-.*\.php|wp\-admin {
                proxy_pass      http://wordpressapache;
        }
 
        # Todo o conteúdo estático será processado pelo Nginx.
        location ~* \.(htm|html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
                root /home/site;
                expires max;
                break;
        }
 
        if (-f $request_filename) {
                break;
        }
 
        # Nega o acesso aos arquivos .htaccess
        location ~ /\.ht {
                deny all;
        }
 
}</pre>
</blockquote>
</div>
</div>
<p>Após acertar as configurações, reinicie o daemon do <a href="http://wiki.nginx.org/Main" target="_blank">Nginx</a> com o comando <strong>/etc/init.d/nginx restart</strong>. Podemos conferir o benchmark usando o Apache Benchmark:</p>
<div>
<div>
<blockquote>
<pre> ab -n 1000 -c 5 http://www.dominio.com:80/
This is ApacheBench, Version 2.3 &amp;lt;$Revision: 655654 $&amp;gt;
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
 
Benchmarking www.dominio.com (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
 
Server Software:        nginx/0.6.32
Server Hostname:        www.dominio.com
Server Port:            80
 
Document Path:          /
Document Length:        91427 bytes
 
Concurrency Level:      5
Time taken for tests:   1.230 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      91715000 bytes
HTML transferred:       91427000 bytes
Requests per second:    812.80 [#/sec] (mean)
Time per request:       6.152 [ms] (mean)
Time per request:       1.230 [ms] (mean, across all concurrent requests)
Transfer rate:          72798.78 [Kbytes/sec] received
 
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       1
Processing:     2    6   1.8      6      12
Waiting:        1    5   1.4      5      10
Total:          2    6   1.8      6      12
 
Percentage of the requests served within a certain time (ms)
  50%      6
  66%      7
  75%      7
  80%      7
  90%      8
  95%      9
  98%     10
  99%     10
 100%     12 (longest request)</pre>
</blockquote>
<p>&nbsp;</p>
</div>
<p>&nbsp;</p>
</div>
<p>Fonte: http://www.bragil.net/</p>
<div class="shr-publisher-564"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2011/08/16/nginx-apache-php5-apc-linux-memcached-performance-parte-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nginx + Apache + PHP5 + APC + Linux + Memcached = PERFORMANCE!! (parte 1)</title>
		<link>http://blog.deserv.info/2011/08/16/nginx-apache-php5-apc-linux-memcached-performance-parte-1/</link>
		<comments>http://blog.deserv.info/2011/08/16/nginx-apache-php5-apc-linux-memcached-performance-parte-1/#comments</comments>
		<pubDate>Tue, 16 Aug 2011 19:20:22 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Instalação e Compilação de SW]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Proxy]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[Softwares Adicionais]]></category>
		<category><![CDATA[APC]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[otimização]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=562</guid>
		<description><![CDATA[A seguir vou detalhar o passo-a-passo resumido da configuração usada, que eu apelidei carinhosamente de NAPALM (sigla para Nginx + Apache + PHP + APC + Linux + Memcached). Nginx é um servidor web que tem ganhado fama por ser extremamente rápido e também por ser uma excelente escolha para servir conteúdo estático, sendo usado [...]]]></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%252F08%252F16%252Fnginx-apache-php5-apc-linux-memcached-performance-parte-1%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FmZL7DL%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Nginx%20%2B%20Apache%20%2B%20PHP5%20%2B%20APC%20%2B%20Linux%20%2B%20Memcached%20%3D%20PERFORMANCE%21%21%20%28parte%201%29%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>A seguir vou detalhar o passo-a-passo resumido da configuração usada, que eu apelidei carinhosamente de <strong>NAPALM</strong> (sigla para <a href="http://wiki.nginx.org/Main">Nginx</a> + <a href="http://httpd.apache.org/" target="_blank">Apache</a> + <a href="http://www.php.net/" target="_blank">PHP</a> + <a href="http://pecl.php.net/package/APC" target="_blank">APC</a> + Linux + <a href="http://memcached.org/" target="_blank">Memcached</a>).</p>
<p><a href="http://wiki.nginx.org/Main">Nginx</a> é um servidor web que tem ganhado fama por ser extremamente rápido e também por ser uma excelente escolha para servir conteúdo estático, sendo usado como proxy para servidores de aplicação.</p>
<p>O <a href="http://httpd.apache.org/" target="_blank">Apache </a>dispensa apresentações, assim como o <a href="http://www.php.net/" target="_blank">PHP</a>. <span id="more-562"></span></p>
<p>O <a href="http://pecl.php.net/package/APC" target="_blank">APC</a> é uma extensão para o <a href="http://www.php.net/" target="_blank">PHP</a> que otimiza o código intermediário e mantém um cache dos dados e do código compilado na memória compartilhada. Isto faz aumentar sensivelmente a performance de aplicações <a href="http://www.php.net/" target="_blank">PHP</a>.</p>
<p>O <a href="http://memcached.org/" target="_blank">Memcached</a> é um sistema de cache em memória de alta performance, bastante usado por grandes nomes da Internet, como <a href="http://twitter.com/" target="_blank">Twitter</a>, <a href="http://www.flickr.com/" target="_blank">Flickr</a>, <a href="http://www.wikipedia.org/" target="_blank">Wikipedia</a>, <a href="http://www.youtube.com/" target="_blank">Youtube</a>, dentre outros.</p>
<p>Quer performance para sua aplicação <a href="http://www.php.net/" target="_blank">PHP</a>? Basta misturar isso tudo!! E o melhor, a configuração é tranquila.</p>
<p>Para começar, instale o <a href="http://httpd.apache.org/" target="_blank">Apache</a> 2 e o <a href="http://www.php.net/" target="_blank">PHP</a> 5. Não vou abordar a instalação e configuração do servidor <a href="http://httpd.apache.org/" target="_blank">Apache</a> 2 + <a href="http://www.php.net/" target="_blank">PHP</a> 5, pois basta ir no Google, você encontrará bastante coisa.</p>
<p><strong>Configuração do Apache</strong></p>
<p>Depois do <a href="http://httpd.apache.org/" target="_blank">Apache</a> + <a href="http://www.php.net/" target="_blank">PHP</a> instalados e configurados, altere a porta onde o <a href="http://httpd.apache.org/" target="_blank">Apache</a> receberá as conexões para 8080. No Debian, edite as seguintes linhas do arquivo /etc/apache2/ports.conf para o seguinte:</p>
<div>
<div>
<blockquote>
<pre>NameVirtualHost dominio.com:8080
Listen 8080</pre>
</blockquote>
</div>
</div>
<p>E altere também a porta na configuração do virtual host:</p>
<div>
<div>
<blockquote>
<pre>VirtualHost dominio.com:8088</pre>
</blockquote>
</div>
</div>
<p>Isto significa que o <a href="http://httpd.apache.org/" target="_blank">Apache</a> deixará de atender as requisições na porta 80 (padrão). Ou seja, usaremos o <a href="http://httpd.apache.org/" target="_blank">Apache</a> apenas para processar os arquivos <a href="http://www.php.net/" target="_blank">PHP</a>, deixando todo o conteúdo estático (imagens, javascript, css, etc) para o <a href="http://wiki.nginx.org/Main">Nginx</a>.</p>
<p>Reinicie o servidor <a href="http://httpd.apache.org/" target="_blank">Apache</a>. No Debian, o comando é <strong>/etc/init.d/apache2 restart</strong>.</p>
<p><strong>Instalação e Configuração do APC</strong></p>
<p>Agora é a instalação do <a href="http://pecl.php.net/package/APC" target="_blank">APC</a>. No Debian 5, isso é extremamente simples:</p>
<div>
<div>
<blockquote>
<pre>apt-get install php-apc</pre>
</blockquote>
</div>
</div>
<p>Após instalar, edite o arquivo /etc/php5/conf.d/apc.ini, adicionando as seguintes linhas:</p>
<div>
<div>
<blockquote>
<pre>extension=apc.so
apc.enabled=1</pre>
</blockquote>
</div>
</div>
<p>É possível configurar vários parâmetros, consulte a documentação do <a href="http://pecl.php.net/package/APC" target="_blank">APC</a>.</p>
<p>Para a nova configuração surtir efeito, reinicie o <a href="http://httpd.apache.org/" target="_blank">Apache</a>:</p>
<div>
<div>
<blockquote>
<pre>/etc/init.d/apache2 restart</pre>
</blockquote>
</div>
</div>
<p><strong>Instalação e Configuração do Memcached</strong></p>
<div>
<div>
<blockquote>
<pre>apt-get install memcached</pre>
</blockquote>
</div>
</div>
<p>Após a instalação, edite o arquivo <strong>/etc/memcached.conf</strong>. Geralmente não é necessário mudar muita coisa, a não ser o tamanho máximo da memória para o <a href="http://memcached.org/" target="_blank">Memcached</a> (o default é 64 MB). O <a href="http://memcached.org/" target="_blank">Memcached</a> usa a porta 11211 por padrão, mas também é possível mudar. O arquivo de configuração vem todo comentado, não há segredo.</p>
<p>Para alterar o tamanho do espaço de memória, altere a linha <strong>-m 64</strong> para o quanto for necessário (128, 256, 512, 1024,…). Lembrando que o <a href="http://memcached.org/" target="_blank">Memcached</a> só ocupa o espaço de memória que estiver em uso pelo cache, ele não reserva todo o espaço inicialmente. Feita a configuração, reinicie o daemon do <a href="http://memcached.org/" target="_blank">Memcached</a> com o comando:</p>
<div>
<div>
<pre>/etc/init.d/memcached restart</pre>
</div>
</div>
<p>Agora só falta o <a href="http://wiki.nginx.org/Main">Nginx</a>.</p>
<p><strong>Instalação do Nginx</strong></p>
<p>Adivinhem?</p>
<div>
<div>
<blockquote>
<pre>apt-get install nginx</pre>
</blockquote>
</div>
</div>
<p>Vamos abordar a configuração em um outro artigo. Até lá, que tal dar uma olhada nos arquivos de configuração do Nginx, em <strong>/etc/nginx </strong>? Bons estudos!</p>
<p>Fonte: http://www.bragil.net/</p>
<div class="shr-publisher-562"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2011/08/16/nginx-apache-php5-apc-linux-memcached-performance-parte-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gerando relatórios do PosgreSQL usando o PgFouine</title>
		<link>http://blog.deserv.info/2011/01/04/gerando-relatorios-do-posgresql-usando-o-pgfouine/</link>
		<comments>http://blog.deserv.info/2011/01/04/gerando-relatorios-do-posgresql-usando-o-pgfouine/#comments</comments>
		<pubDate>Tue, 04 Jan 2011 12:57:21 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[PGSQL]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[SGBD]]></category>
		<category><![CDATA[pgfouine]]></category>
		<category><![CDATA[postgres]]></category>
		<category><![CDATA[tunning]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=521</guid>
		<description><![CDATA[O PgFouine é um gerador de relatório para os logs do banco PostgreSQL, criado pela pgFoundry. Ele segue a licença para distribuição GNU. Esse tutorial foi confeccionado baseado na plataforma BSD. Sendo assim, haverão algumas diferenças nas localidades dos arquivos de configurações do Apache e PostgreSQL, que pode variar conforme a distribuição. Instalação Afim de [...]]]></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%252F01%252F04%252Fgerando-relatorios-do-posgresql-usando-o-pgfouine%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Gerando%20relat%C3%B3rios%20do%20PosgreSQL%20usando%20o%20PgFouine%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>O <em>PgFouine</em> é um gerador de relatório para os logs do banco <em>PostgreSQL</em>, criado pela pgFoundry. Ele segue a licença para distribuição GNU.</p>
<p>Esse tutorial foi confeccionado baseado na plataforma BSD. Sendo assim,  haverão algumas diferenças nas localidades dos arquivos de configurações  do Apache e PostgreSQL, que pode variar conforme a distribuição. <span id="more-521"></span></p>
<h1>Instalação</h1>
<p>Afim de instalar a última versão, pegaremos o arquivo direto do site do PgFouine.</p>
<p>Download:</p>
<p>Faça o wget para um local que você tenha permissão de escrita e descompacte o arquivo.</p>
<p><strong># wget</strong> <a href="http://pgfoundry.org/frs/download.php/2178/pgfouine-1.1.tar.gz">http://pgfoundry.org/frs/download.php/2178/pgfouine-1.1.tar.gz</a><br />
<strong># tar -zxvf pgfouine-1.1.tar.gz</strong></p>
<p>Obs.: Verifique se existe uma versão mais atual no site do PgFouine antes de baixar.</p>
<h1>Configuração</h1>
<p>Mova a pasta/diretório gerada(o) para /usr/local/.</p>
<p><strong># mv pgfouine-1.1 /usr/local/pgfouine</strong></p>
<p>Crie um link simbólico para você poder executá-lo em seu PATH:</p>
<p><strong># ln -s /usr/local/pgfouine/pgfouine.php /usr/local/bin/</strong></p>
<p>Referência:</p>
<ul>
<li> <a href="http://pgfouine.projects.postgresql.org/tutorial.html">http://pgfouine.projects.postgresql.org/tutorial.html</a></li>
</ul>
<h1>Preparação do ambiente</h1>
<p>Antes de executar o comando para a geração dos relatórios faremos algumas customizações necessárias.</p>
<h1>Logs do PostgreSQL</h1>
<p>O PgFouine requer um padrão nos logs dos PostgreSQL.</p>
<p>Edite o arquivo <em>postgresql.conf</em>:</p>
<p><strong># vi /usr/local/pgsql/data/postgresql.conf</strong></p>
<p>Adicione o seguinte conteúdo no Grupo ERROR REPORTING AND LOGGING:</p>
<div>log_destination = &#8216;stderr&#8217;<br />
redirect_stderr = on # (log do banco em um arquivo separado)<br />
log_directory = &#8216;/var/log/pgsql&#8217; # (diretório dos logs)<br />
log_filename = &#8216;%Y-%m-%d_%H%M%S.log&#8217; # (nome do log)<br />
log_rotation_age = 1440 # tempo de rotação dos Logs &#8211; 1d para o caso do 8.3<br />
log_min_messages = info<br />
log_min_error_statement = notice<br />
log_error_verbosity = verbose<br />
log_min_duration_statement = 100<br />
log_duration = on<br />
log_line_prefix = &#8216;%t [%p]: [%l-1] &#8216;<br />
log_statement = &#8216;all&#8217;</div>
<p>Reinicie o PostgreSQL:</p>
<p><strong># /usr/local/etc/rc.d/postgresql restart</strong></p>
<p>Disponibilização dos logs:</p>
<p>Para a disponibilização web usaremos o Apache e um alias para que você possa permitir somente para o IP que necessite.</p>
<p>Edite o arquivo <em>httpd.conf</em> (estou deduzindo que você tem a última versão do Apache):</p>
<p><strong># vi /usr/local/etc/apache22/httpd.conf</strong></p>
<p>Adicione o seguinte conteúdo:</p>
<div>Alias /analizer/ &#8220;/usr/local/www/analizer/&#8221;</p>
<p>Directory &#8220;/usr/local/www/analizer/&#8221;&gt;<br />
Options FollowSymlinks MultiViews<br />
AllowOverride All<br />
Order allow,deny<br />
Allow from all<br />
/Directory&gt;</p></div>
<p>Crie a pasta dentro do diretório do Apache:</p>
<p><strong># mkdir /usr/local/www/analizer/</strong></p>
<p>Obs.: Pode-se utilizar qualquer pasta contanto que você altere PATH no alias do httpd.conf do Apache.</p>
<p>Reinicie o Apache:</p>
<p><strong># apachectl restart</strong></p>
<p>Gerando os relatórios:</p>
<p>Agora é só executar o pgfouine para a geração dos relatórios:</p>
<p><strong># pgfouine.php -file /var/log/pgsql/postgresql-(Data) &gt; /usr/local/www/analizer/relatorio.html -debug -logtype stderr&#8217;</strong></p>
<p>Fonte: http://www.vivaolinux.com.br</p>
<div class="shr-publisher-521"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2011/01/04/gerando-relatorios-do-posgresql-usando-o-pgfouine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tunning Postgres: Técnicas para otimização do banco</title>
		<link>http://blog.deserv.info/2011/01/04/tunning-postgres-tecnicas-para-otimizacao-do-banco/</link>
		<comments>http://blog.deserv.info/2011/01/04/tunning-postgres-tecnicas-para-otimizacao-do-banco/#comments</comments>
		<pubDate>Tue, 04 Jan 2011 12:54:26 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[PGSQL]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[SGBD]]></category>
		<category><![CDATA[postgres]]></category>
		<category><![CDATA[Tunning Postgres]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=519</guid>
		<description><![CDATA[I. Editando as configurações do banco Edite o arquivo postgresql.conf: # vi /usr/local/pgsql/data/postgresql.conf. Altere as sentenças nos seguintes grupos para: # CONNECTIONS AND AUTHENTICATION (refere-se a parte de conexões e autenticação do banco) listen_addresses = &#8216;*&#8217; #ip que ele está escutando port = 5432 #porta postgres max_connections = 40 #número de conexões ao banco, depende [...]]]></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%252F01%252F04%252Ftunning-postgres-tecnicas-para-otimizacao-do-banco%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Tunning%20Postgres%3A%20T%C3%A9cnicas%20para%20otimiza%C3%A7%C3%A3o%20do%20banco%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>I. Editando as configurações do banco</p>
<p>Edite o arquivo postgresql.conf:</p>
<p><strong># vi /usr/local/pgsql/data/postgresql.conf</strong>.<span id="more-519"></span></p>
<p>Altere as sentenças nos seguintes grupos para:</p>
<div>
<p><span style="color: #004080;"># CONNECTIONS AND AUTHENTICATION  (refere-se a parte de conexões e autenticação do banco)</span></p>
<p>listen_addresses = &#8216;*&#8217;    <span style="color: #004080;">#ip que ele está escutando</span><br />
port = 5432	           <span style="color: #004080;">#porta postgres</span><br />
max_connections = 40    <span style="color: #004080;">#número de conexões ao banco, depende da quantidade de memória deste</span></p>
<p><span style="color: #004080;"># RESOURCE USAGE  (esse grupo se refere ao uso de recursos utilizados pelo banco)</span></p>
<p><span style="color: #004080;"># Memory</span><br />
shared_buffers = 8192                    <span style="color: #004080;">#min 16MB ou 2x o max_connections</span><br />
temp_buffers = 8192                       <span style="color: #004080;">#min 100, 8KB each</span><br />
work_mem = 65536                        <span style="color: #004080;">#min 64, size in KB</span><br />
maintenance_work_mem = 524288   <span style="color: #004080;">#min 1024, size in KB</span><br />
max_stack_depth = 8192                 <span style="color: #004080;">#min 100, size in KB</span></p>
<p><span style="color: #004080;"># Free Space Map</span><br />
max_fsm_pages = 120000           <span style="color: #004080;">#min max_fsm_relations*16, 6 bytes each</span></p>
<p><span style="color: #004080;"># WRITE AHEAD LOG (refere-se a escrita dos logs na base do banco)</span></p>
<p><span style="color: #004080;"># Settings</span><br />
wal_buffers = 512                <span style="color: #004080;">#min 4, 8KB each </span></p>
<p><span style="color: #004080;"># QUERY TUNING (refere-se à otimização das querys  do banco, lembrando que habilitar alguma tag nesse grupo não significa  que você melhorá-lo)</span></p>
<p><span style="color: #004080;"># Planner Cost Constants</span><br />
effective_cache_size = 8192000   <span style="color: #004080;">#typically 8KB each</span><br />
random_page_cost = 2.0           <span style="color: #004080;">#units are one sequential page fetch</span></p>
<p><span style="color: #004080;"># ERROR REPORTING AND LOGGING (refere-se a coleta e ao armazenamento dos logs de erros do banco)</span></p>
<p>log_destination = &#8216;stderr&#8217;<br />
redirect_stderr = on                                    <span style="color: #004080;">#log do banco em um arquivo separado</span><br />
log_directory = &#8216;/var/log/pgsql&#8217;                     <span style="color: #004080;">#diretório dos logs</span><br />
log_filename = &#8216;%Y-%m-%d_%H%M%S.log&#8217;  <span style="color: #004080;">#nome do log</span><br />
log_rotation_size = 10240                             <span style="color: #004080;">#rotação automatica dos logs</span><br />
silent_mode = off                                         <span style="color: #004080;">#habilita os logs no terminal</span></p>
<p><span style="color: #004080;">#Query/Index Statistics Collector</span><br />
stats_start_collector = on<br />
stats_row_level = on</p>
<p><span style="color: #004080;"># AUTOVACUUM PARAMETERS  (refere-se ao vaccuum do  banco, rotina que serve para otimizar e limpar o lixo deixado na base do  banco)</span></p>
<p>autovacuum = on                                <span style="color: #004080;">#habilitar o autovaccum</span><br />
autovacuum_naptime = 600                 <span style="color: #004080;">#Tempo entre rodar os autovaccums em segundos</span><br />
autovacuum_vacuum_threshold = 1000 <span style="color: #004080;">#min de updates depois do vaccum</span><br />
autovacuum_analyze_threshold = 500   <span style="color: #004080;">#min de updates depois da analize</span></p>
</div>
<p>Crie uma pasta para armazenar os logs e após altere suas permissões:</p>
<p><strong># mkdir /var/log/pgsql<br />
# chmod -R 775 /var/log/pgsql<br />
# chown -R pgsql:pgsql /var/log/pgsql</strong></p>
<p>II. Adicionando Segurança</p>
<p>Edite o arquivo pg_hba.conf para liberação de acesso externo ao banco:</p>
<p><strong> # vi /usr/local/pgsql/data/pg_hba.conf</strong></p>
<p>Caso outro servidor ou rede precise, acesse esse banco, adicione os IPs  dos mesmos no grupo IPv4 local connections (Não retirar a permissão do  127.0.0.1).</p>
<p>Segue o formato:</p>
<p>a) liberação para de uma rede especifica:</p>
<div>host  all  all  192.168.0.0/24  trust</div>
<p>b) liberação para um determinado IP:</p>
<div>host  all  all  192.168.0.1/32  trust</div>
<p>III.  Crie um usuário no banco para acessar ao banco</p>
<p>Para aumentar a segurança usaremos um usuário próprio no banco de dados:</p>
<p><strong># createuser -U pgsql (nome do usuário que você quer criar) -W</strong></p>
<p><strong>Fonte: </strong>http://www.vivaolinux.com.br</p>
<div class="shr-publisher-519"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2011/01/04/tunning-postgres-tecnicas-para-otimizacao-do-banco/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>PostgreSQL Prático/Apêndices/Dicas sobre Desempenho e Otimizações do PostgreSQL</title>
		<link>http://blog.deserv.info/2010/12/23/postgresql-praticoapendicesdicas-sobre-desempenho-e-otimizacoes-do-postgresql/</link>
		<comments>http://blog.deserv.info/2010/12/23/postgresql-praticoapendicesdicas-sobre-desempenho-e-otimizacoes-do-postgresql/#comments</comments>
		<pubDate>Thu, 23 Dec 2010 14:55:01 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Arquivos de Configuração]]></category>
		<category><![CDATA[PGSQL]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[SGBD]]></category>
		<category><![CDATA[Banco de Dados Postgres]]></category>
		<category><![CDATA[Desempenho e Otimização no Postgres]]></category>
		<category><![CDATA[postgres]]></category>
		<category><![CDATA[Tunning de Banco Postgres]]></category>
		<category><![CDATA[Tunning Postgres]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=476</guid>
		<description><![CDATA[Dicas sobre Desempenho e Otimizações do PostgreSQL Existem duas principais formas de melhorar o desempenho de SGBDs: uma é melhorando o hardware, com CPUs, RAM, Discos mais novos, rápidos e confiáveis. A outra é otimizando as consultas realizadas nos bancos (usando VACUUM, VACUUM ANALYZE, EXPLAIN, criando CLUSTERS, entre outros). Uma das medidas básicas adotada 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%252F12%252F23%252Fpostgresql-praticoapendicesdicas-sobre-desempenho-e-otimizacoes-do-postgresql%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22PostgreSQL%20Pr%C3%A1tico%2FAp%C3%AAndices%2FDicas%20sobre%20Desempenho%20e%20Otimiza%C3%A7%C3%B5es%20do%20PostgreSQL%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><h2>Dicas sobre Desempenho e Otimizações do PostgreSQL</h2>
<p>Existem duas principais formas de melhorar o desempenho de SGBDs: uma  é melhorando o hardware, com CPUs, RAM, Discos mais novos, rápidos e  confiáveis. A outra é otimizando as consultas realizadas nos bancos  (usando VACUUM, VACUUM ANALYZE, EXPLAIN, criando CLUSTERS, entre  outros).<span id="more-476"></span><br />
Uma das medidas básicas adotada para melhorar o desempenho de tabelas  com grandes quantidades de registros e especialmente com muitos acessos,  é a inclusão de índices estratégicos. Além da chave primária é  importante inserir índices em campos que compõem a cláusula WHERE, que  fazem parte de cláusulas ORDER BY, GROUP BY entre outras. Em consultas  com WHERE de vários campos usando OR, não adianta inserir índice, pois  não será utilizado pelo PostgreSQL, somente usando AND.</p>
<p>Na criação do banco de dados e especialmente na criação das consultas é  muito importante atentar para um bom planejamento, normalização,  consultas otimizadas tendo em vista o planejador de consultas do  PostgreSQL através do uso dos comandos EXPLAIN e ANALYZE.</p>
<p>A administração do PostgreSQL também é muito importante para tornar o  SGBD mais eficiente e rápido. Desde a instalação e configuração temos  cuidados que ajudam a otimizar o PostgreSQL.</p>
<p>Adaptação do Artigo sobre otimização do PostgreSQL do Diogo Biazus e do original do Bruce Momjian (<a rel="nofollow" href="http://www.ca.postgresql.org/docs/momjian/hw_performance">http://www.ca.postgresql.org/docs/momjian/hw_performance</a>).<br />
<strong></strong></p>
<p><strong>Hardware</strong></p>
<p>No computador as informações são manipuladas pelos registradores da  CPU, pelo cache da CPU, pela memória RAM e pelos discos rígidos.</p>
<p>Na prática as informações utilizadas com mais freqüência são colocadas  próximas à CPU. Quem determina que informações devem ficar nos  registradores são os compiladores. Cache da CPU guarda ar informações  utilizadas recentemente. O Sistema Operacional controla o que está  armazenado na RAM e o que mandar para o disco rígido.<br />
Cache e Registradores da CPU não podem ser otimizados diretamente pelo  administrador do SGBD. Efetivamente otimização em bancos de dados  envolvem aumento da quantidade de informações úteis na RAM, prevenindo  acesso a disco sempre que possível.</p>
<p>Não é tarefa simples de ser colocada em prática, pois a memória RAM  guarda muitas outras informações: programas em execução, pilhas e dados  de programas, memória cache compartilhada do PostgreSQL, cache do buffer  de disco do kernel e kernel.</p>
<p>Otimização correta de bancos de dados procura manter a maior quantidade  possível de informações do banco na memória RAM ao mesmo tempo que não  afeta as demais áreas do sistema operacional.</p>
<p>Existem dois tipos de configuração de memória no PostgreSQL, a  compartilhada e a individual. A compartilhada tem um tamanho fixo, ela é  alocada sempre que o PostgreSQL inicializa e então é compartilhada por  todos os clientes. Já a memória individual é tem um tamanho variável e é  alocada separadamente para cada conexão feita ao SGBD.<br />
<strong></strong></p>
<p><strong>Memória Cache Compartilhada do PostgreSQL</strong></p>
<p>O PostgreSQL não altera as informações diretamente no disco. Ao invés  disso ele solicita que os dados sejam lidos da memória cache  compartilhada do PostgreSQL. O cliente PostgreSQL então lê e escreve os  blocos e finalmente escreve no disco.</p>
<p>Clientes que precisam acessar tabelas primeiro procuram pelos blocos  necessários no cache. Caso estejam aí então continuam processando  normalmente. Caso contrário é feita uma solicitação ao sistema  operacional para carregar os blocos. Os blocos são carregados do cache  de buffer de disco do kernel ou diretamente do disco. Estas operações  podem ser onerosas (lentas).</p>
<p>Na configuração default do PostgreSQL 8.1.3 ele aloca 1000 shared  buffers. Cada buffer usa 8KB, o que soma 8MB.</p>
<p>Aumentando o número de  buffers fará com que os clientes encontrem as informações que procuram  em cache e evita requisições onerosas ao sistema operacional. Mas  cuidado, pois se aumentar muito a memória compartilhada (shared buffers)  pode acarretar uso da memória virtual (swap). As alterações podem ser  feitas através do comando postmaster na linha de comando ou através da  configuração do valor do shared_buffers no postgresql.conf.<br />
<strong></strong></p>
<p><strong>Que Porção da RAM Reservar para o PostgreSQL?</strong></p>
<p>A maior porção útil que não atrapalhe os outros programas. Nos sistemas  UNIX as informações saem da RAM (quando insuficiente) para o swap. Ruim é  quando as informações voltam do swap para a RAM, pois então os  programas são suspensos até que as mesmas sejam carregadas.<br />
<strong></strong></p>
<p><strong>Tamanho da Cache</strong></p>
<p>Imaginemos que o PostgreSQL shared buffer cache seja suficiente para  manipular uma tabela inteira. Repetidas buscas seqüenciais da tabela não  devem necessitar de acesso ao disco já que todos os dados já estão em  cache. Agora vamos imaginar que o cache é menor que a tabela, então  neste caso as informações irão para o disco (swap) e terão um desempenho  bem inferior. Tamanho Adequado da Shared Buffer Cache</p>
<p>Idealmente a PostgreSQL shared buffer cache (Memória Cache Compartilhada do PostgreSQL) deve ser:</p>
<p>Grande o suficiente para conseguir manipular as tabelas mais comumente  acessadas. Pequena o bastante para evitar atividades de swap pagein.</p>
<p>Exemplo:</p>
<p>Por exemplo queremos x MB para memória compartilhada ( x / 8 ) * 1024 = Resultado a ser configurado em shared_buffer</p>
<p>Se x = 768 MB</p>
<p>(768 / <img src='http://blog.deserv.info/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> * 1024</p>
<p>Resultado a ser configurado em shared_buffer = 98304</p>
<p>Para informações sobre uma configuração do kernel para que vários sistemas operacionais trabalharem com o</p>
<p>PostgreSQL:</p>
<p><a rel="nofollow" href="http://developer.postgresql.org/docs/postgres/kernel-resources.html">http://developer.postgresql.org/docs/postgres/kernel-resources.html</a><br />
<strong></strong></p>
<p><strong>Memória Individual (Sort Memory)</strong></p>
<p>Principalmente utilizada em ordenações de registros das tabelas, em  operações de criação de índices, ordenação (order by), merge join, etc.</p>
<p>Esta memória pode ser configurada através do parâmetro sort_mem do postgresql.conf.</p>
<p>Para a configuração leve em conta sua memória disponível (incluindo a  memória já alocada para o shared buffers), também o número médio de  conexões e o uso da memória virtual (swap).</p>
<p>Exemplo:</p>
<p>Considerando um servidor dedicado (rodando somente o servidor  PostgreSQL), com memória RAM de 1,5GB e com até 10 conexões simultâneas  com o SGBD:</p>
<p>shared_buffers = 80000	# 80.000 blocos de 8KB = 625 MB</p>
<p>sort_mem	 = 64000	# tamanho em KB = 62,5 MB, para cada usuário com</p>
<p># 10 usuários = 526 MB</p>
<p>vacuum_mem = 2000</p>
<p>Por exemplo: queremos x KB para memória individual sort_men</p>
<p>( x * 1024 ) = resultado para memória individual<br />
x = 16<br />
(16 * 1024) = sort_mem = 16384</p>
<p>Seria bom mudar também memória para vaccum</p>
<p>vacuum_mem = 131072 (mesmo cálculo do sort_mem)</p>
<p><strong>Uso de Vários Discos</strong></p>
<p>Em sistemas com mais de um disco podemos melhorar a performance do mesmo distribuindo algumas tarefas entre discos diferentes.</p>
<p>Supondo que temos dois HDs, hda e hdb:</p>
<p>Movendo os logs de transação para outro disco:</p>
<p>- Parar o PostgreSQL</p>
<p>- Montar hdb em /mnt/hdb</p>
<p>- Mover a pasta /usr/local/pgsql/data/pg_xlog para o /mnt/hdb</p>
<p>- Criar um link simbólico para o diretório original:</p>
<pre>     ln -s /mnt/hdb/pg_xlog /usr/local/pgsql/data/pg_xlog
</pre>
<p>- Banco &#8211; /usr/local/pgsql/data		(no hda)</p>
<p>- Logs &#8211; /usr/local/pgsql/data/pg_xlog	(link simbólico para /mnt/hdb/pg_xlog).</p>
<p>Os logs de transação são os únicos registros que não podem ter o seu  salvamento em disco adiado sem comprometer a segurança do sistema.</p>
<p>Mover os índices para um HD diferente de onde estão as tabelas:</p>
<p>- Parar PostgreSQL</p>
<p>- Mover os índices para o hdb</p>
<p>- Criar link simbólico para o local original<br />
<strong></strong></p>
<p><strong>Para recriar os índices em outro Tablespace:</strong></p>
<p>ALTER TABLE nometabela DROP CONSTRAINT nomeconstraint;<br />
CREATE INDEX nome_idx ON nometabela (nomecampo) TABLESPACE nometablespace;</p>
<p>ALTER TABLE nometabela ADD CONSTRAINT nome_pk PRIMARY KEY (nomecampo);<br />
ALTER INDEX nome_idx SET TABLESPACE nometablespace;</p>
<p>Ainda podemos separar astabelas mais utilizadas para o hdb, utilizando o  comando tablespace no PostgreSQL 8.1.3 podemos fazer isso:</p>
<p>- Criar diretório /mnt/hdb/hotcluster e tornar postgres seu dono</p>
<p>CREATE TABLESPACE hotcluster OWNER postgres LOCATION &#8216;/mnt/hdb/hotcluster&#8217;;<br />
<strong></strong></p>
<p><strong>Criando um banco no novo cluster:</strong></p>
<p>CREATE DATABASE hotbanco TABLESPACE = hotcluster;</p>
<p>Exportar as tabelas para este banco.</p>
<p>Uso de Mais de Um Processador</p>
<p>Atualmente o PostgreSQL está otimizado para uso de vários processadores,  reforçando que cada conexão é gerenciada por um processo diferente.<br />
<strong></strong></p>
<p><strong>Sistemas de Arquivos</strong></p>
<p>Para sistemas BSD usa-se o tradicional UFS, que é robusto, rápido e  tem a vantagem em relação ao PostgreSQL, de possuir os blocos de disco  com um tamanho padrão de 8KB.</p>
<p>Para quem utiliza Linux as sugestões vão para EXT3 e ReiserFS.<br />
<strong></strong></p>
<p><strong>Checkpoints</strong></p>
<p>O wal_files é o parâmetro do postgresq.lconf que determina o número de  arquivos usados pelo PostgreSQL para armazenar os logs de transação.  Estes arquivos focam em pg_xlog, na pasta de dados.</p>
<p>Para que apareçam as datas e horas nos arquivos de logs usa-se no postgresql.conf:</p>
<p>log_timestamp = true</p>
<p>Para reduzir a freqüência dos checkpoints devemos aumentar o parâmetro do postgresql.conf:</p>
<p>checkpoint_segments = 3 (valor default)</p>
<p>O PostgreSQL não precisa de muito ajuste. Boa parte dos parâmetros é  automaticamente ajustada para uma performance ótima. O cache size e sort  size são dois parâmetros que o administrador pode controlar para ter um  melhor uso da memória.</p>
<p>Tradução do Tutorial “Tuning PostgreSQL for Performance”</p>
<p>De Shridhar Daithankar e John Berkus<br />
<strong></strong></p>
<p><strong>Shared Buffers</strong></p>
<p>Definem um bloco de memória que o PostgreSQL usará para lidar com  requisições que estão aguardando atenção no buffer do kernel e na CPU.</p>
<p>Deve ser manipulada com cuidado, pois simplesmente ampliada pode  prejudicar a performance. Esta é a área que o</p>
<p>PostgreSQL usa atualmente  para trabalhar. Ela deve ser suficiente para controlar a carga do  servidor do SGBD, do contrário o PostgreSQL irá iniciar empurrando dados  para arquivos e isto irá prejudicar a performance geral. Esta é a  principal configuração em termos de performance.</p>
<p>Seu valor deve ser configurado tendo em vista o tamanho do conjunto de  bancos que se supões que no máximo o servidor irá carregar e da memória  RAM (ter em mente que a memória RAM utilizada pelos demais aplicativos  do servidor não estarão disponíveis).</p>
<p><strong>Recomendações:</strong></p>
<p>- Iniciar com 4MB (512) Workstation</p>
<p>- Médio tamanho do conjunto de bancos de dados e 256 a 512MB disponível de RAM: 	16-32MB (2948 a 4096)</p>
<p>- Grande conjunto de bancos de dados e muita memória RAM disponível (1 a 4GB): 	64 -256MB (8192 a 32768)</p>
<p>Obs.: Até para um conjunto de bancos de dados (dataset) que exceda  20GB, uma configuração de 128MB deve ser muito, caso você tenha apenas  1GB de RAM e um agressivo sistema de cache em Sistema Linux.<br />
<strong></strong></p>
<p><strong>Sort Memory (Memória para Ordenação)</strong></p>
<p>Limite máximo de memória que uma conexão pode usar para executar sort  (ordenação). Caso suas consultas usem as cláusulas ORDER BY ou GROUP BY  que ordenem grandes conjuntos de dados, incrementar este parâmetro  deverá ajudar.</p>
<p><strong>Uma Recomendação:</strong></p>
<p>Ajustar o parâmetro por conexão como e quando precisar: pouca para  consultas mais simples e muita para consultas complexas e para dumps de  dados.</p>
<p>Effective Cache Size (Tamanho do Cache Efetivo)</p>
<p>Permite ao PostgreSQL fazer melhor uso da RAM disponível no servidor.</p>
<p>Exemplo:</p>
<p>Caso exista 1,5GB de RAM na máquina, shared buffers deve ser ajustado para 32MB e effective cache size para 800MB.<br />
<strong>Fsync and the WAL files (Fsync e arquivos de WAL)</strong></p>
<p>Caso não reste nenhuma opção, poderá usar a proteção do WAL e melhor  performance. Simplesmente mova seus arquivos de WAL, montando outro  dispositivo ou criando um link simbólico para o diretório pg_xlog, para  um disco separado ou para o conjunto dos arquivos do seu cluster  principal de arquivos de dados.</p>
<p><strong>random_page_cost (custo de página aleatória)</strong></p>
<p>Configura o custo para trazer um registro aleatório de um banco de  dados, que influencia a escolha do planejador em usar index ou table  scan.</p>
<p>Caso tenha um disco razoavelmente rápido como SCSI ou RAID, pode baixar o custo para 2.</p>
<p><strong>Vacuum_mem</strong></p>
<p>Configura a memória alocada para Vacuum. Deve acelerar permitindo que PostgreSQL copie grandes quantidades para a memória.</p>
<p>Entre 16-32MB é uma boa quantidade para muitos sistemas.</p>
<p><strong>max_fsm_pages</strong></p>
<p>PostgreSQL grava espaço livre em cada uma de suas páginas de dados.</p>
<p>Caso tenha um banco que usa muitos updates e deletes, que irá gerar  registros mortos, devido ao sistema MVCC do PostgreSQL, então expanda o  FSM para cobrir todos estes registros deads (mortos) e nunca mais  precisará rodar vacuum full a não ser em feriados.</p>
<p>O mínimo FSM é max_fsm_relations * 16.</p>
<p>max_fsm_relations</p>
<p>Diz quantas tabelas devem ser localizadas no mapa de espaço livre.</p>
<p><strong>wal_buffers</strong></p>
<p>Esta configuração decide a quantidade de buffers WAL (Write Ahead Log) que pode ter.</p>
<p>Para chegar a uma quantidade ótima experimente e decida.</p>
<p>Um bom início está em torno de 32 a 64 correspondendo a 256-516 KB de memória.<br />
<strong></strong></p>
<p><strong>Ativar o subprocesso do auto Vacuum</strong></p>
<p>Vem desabilitado por defualt (autovacuum = off no 8.1.3). Para ativar  edite o arquivo de configuração postgresq.conf e altere para autovacuum  = on. Irá executar o vacuum quando necessário.</p>
<p>Melhor é executar o comando vacuum juntamente com o comando analyze:</p>
<p>vacuumdb -U postgres -a, caso seja executado na linha de comando.</p>
<p>Para adquirir informações sobre os índices (tornando a performance ainda melhor):</p>
<p>vacuumdb -U postgres -a -z<br />
<strong></strong></p>
<p><strong>EXPLAIN</strong></p>
<ol>
<li>!/usr/bin/perl</li>
</ol>
<p>$count = 1;</p>
<p>$arquivosaida = &#8220;populate.sql&#8221;;</p>
<p>@chars = (&#8220;A&#8221; .. &#8220;Z&#8221;, &#8220;a&#8221; .. &#8220;z&#8221;, 0 .. 9);</p>
<p>@numbers = (1 .. 9);</p>
<p>@single_chars = (&#8220;a&#8221; .. &#8220;e&#8221;);</p>
<p>$totalrecords = 5000; # 5 milhões</p>
<p>open(OUTPUT, &#8220;&gt; $arquivosaida&#8221;);</p>
<p>print OUTPUT &#8220;DROP TABLE index_teste;\n&#8221;;</p>
<p>print OUTPUT &#8220;CREATE TABLE index_teste (&#8220;;</p>
<p>print OUTPUT &#8220;codigo INT, nome VARCHAR(10), numero INT, letra CHAR(1)&#8221;;</p>
<p>print OUTPUT &#8220;);\n&#8221;;</p>
<p>print OUTPUT &#8220;COPY index_teste (codigo, nome, numero, letra) FROM stdin;\n&#8221;;</p>
<p>while ($count &lt;= $totalrecords){</p>
<pre>   $randstring = join("", @chars [map{rand @chars} ( 1 .. 8 ) ]);
</pre>
<pre>   $randnum = join("", @numbers [map{rand @numbers} ( 1 .. 8 ) ]);
</pre>
<pre>   $randletter = join("", @single_chars [map{rand @single_chars} (1)]);
</pre>
<pre>   print OUTPUT
</pre>
<pre>   #print OUTPUT "INSERT INTO index_teste VALUES($count,'$randstring',$randnum,'$randletter');\n";
</pre>
<pre>   $count."\t".$randstring."\t".$randnum."\t".$randletter."\n";
</pre>
<pre>   $count++;
</pre>
<p>};</p>
<ol>
<li>print OUTPUT &#8220;\n&#8221;;</li>
</ol>
<ol>
<li>print OUTPUT &#8220;\nCREATE INDEX indexteste_codigo_index ON index_teste(codigo);\n&#8221;;</li>
</ol>
<ol>
<li>print OUTPUT &#8220;CREATE INDEX indexteste_numero_index ON index_teste(numero);\n&#8221;;</li>
</ol>
<ol>
<li>print OUTPUT &#8220;VACUUM ANALYZE index_teste;\n&#8221;;</li>
</ol>
<p>close OUTPUT;</p>
<p>Um bom artigo sobre performance no PostgreSQL &#8220;PostgreSQL 8.0  Checklist de Performance&#8221; encontra-se na revista eletrônica DBFree  Magazine, número 02.</p>
<p>Fonte: http://pt.wikibooks.org/</p>
<div class="shr-publisher-476"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/12/23/postgresql-praticoapendicesdicas-sobre-desempenho-e-otimizacoes-do-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PostgreSQL Prático/Metadados</title>
		<link>http://blog.deserv.info/2010/12/21/postgresql-praticometadados/</link>
		<comments>http://blog.deserv.info/2010/12/21/postgresql-praticometadados/#comments</comments>
		<pubDate>Wed, 22 Dec 2010 01:56:56 +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[Banco de Dados]]></category>
		<category><![CDATA[comandos postgres]]></category>
		<category><![CDATA[postgres]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=472</guid>
		<description><![CDATA[Metadados (Catálogo) Metadados são dados sobre dados. Uma consulta normal retorna informações existentes em tabelas, já uma consulta sobre os metadados retorna informações sobre os bancos, os objetos dos bancos, os campos de tabelas, seus tipos de dados, seus atributos, suas constraints, etc. Retornar Todas as Tabelas do banco e esquema atual SELECT schemaname AS [...]]]></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%252F21%252Fpostgresql-praticometadados%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22PostgreSQL%20Pr%C3%A1tico%2FMetadados%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><h2>Metadados (Catálogo)</h2>
<p>Metadados são dados sobre dados.</p>
<p>Uma consulta normal retorna informações existentes em tabelas, já uma  consulta sobre os metadados retorna informações sobre os bancos, os  objetos dos bancos, os campos de tabelas, seus tipos de dados, seus  atributos, suas constraints, etc.</p>
<p><span id="more-472"></span><br />
<strong>Retornar Todas as Tabelas do banco e esquema atual</strong></p>
<pre>SELECT schemaname AS esquema, tablename AS tabela, tableowner AS dono
 FROM pg_catalog.pg_tables
 WHERE schemaname NOT IN ('pg_catalog', 'information_schema', 'pg_toast')
 ORDER BY schemaname, tablename
</pre>
<p><strong>Informações de Todos os Tablespaces</strong></p>
<pre>SELECT spcname, pg_catalog.pg_get_userbyid(spcowner) AS spcowner, spclocation
 FROM pg_catalog.pg_tablespace
</pre>
<p><strong>Retornar banco, dono, codificação, comentários e tablespace</strong></p>
<pre>SELECT pdb.datname AS banco,
 pu.usename AS dono,
 pg_encoding_to_char(encoding) AS codificacao,
 (SELECT description FROM pg_description pd WHERE pdb.oid=pd.objoid) AS comentario,
 (SELECT spcname FROM pg_catalog.pg_tablespace pt WHERE pt.oid=pdb.dattablespace) AS tablespace
 FROM pg_database pdb, pg_user pu WHERE pdb.datdba = pu.usesysid ORDER BY pdb.datname
</pre>
<p><strong>Tabelas, donos, comentários, registros e tablespaces de um schema</strong></p>
<pre>SELECT c.relname as tabela,
 pg_catalog.pg_get_userbyid(c.relowner) AS dono,
 pg_catalog.obj_description(c.oid, 'pg_class') AS comentario, reltuples::integer as registros,
 (SELECT spcname FROM pg_catalog.pg_tablespace pt WHERE pt.oid=c.reltablespace) AS tablespace
 FROM pg_catalog.pg_class c
 LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
 WHERE c.relkind = 'r' AND nspname='public'
 ORDER BY c.relname
</pre>
<p><strong>Mostrar Sequences de um Esquema</strong></p>
<pre>SELECT c.relname AS seqname, u.usename AS seqowner, pg_catalog.obj_description(c.oid, 'pg_class') AS seqcomment,
    (SELECT spcname FROM pg_catalog.pg_tablespace pt WHERE pt.oid=c.reltablespace) AS tablespace
     FROM pg_catalog.pg_class c, pg_catalog.pg_user u, pg_catalog.pg_namespace n
     WHERE c.relowner=u.usesysid AND c.relnamespace=n.oid
     AND c.relkind = 'S' AND n.nspname='public' ORDER BY seqname
</pre>
<p><strong>Mostrar Tablespaces</strong></p>
<pre>SELECT spcname, pg_catalog.pg_get_userbyid(spcowner) AS spcowner, spclocation
 FROM pg_catalog.pg_tablespace
</pre>
<p><strong>Mostrar detalhes de uma function</strong></p>
<pre>SELECT
 pc.oid AS prooid,
 proname,
 lanname as prolanguage,
 pg_catalog.format_type(prorettype, NULL) as proresult,
 prosrc,
 probin,
 proretset,
 proisstrict,
 provolatile,
 prosecdef,
 pg_catalog.oidvectortypes(pc.proargtypes) AS proarguments,
 proargnames AS proargnames,
 pg_catalog.obj_description(pc.oid, 'pg_proc') AS procomment
FROM pg_catalog.pg_proc pc, pg_catalog.pg_language pl
WHERE pc.oid = 'oid_da_function'::oid
AND pc.prolang = pl.oid
</pre>
<p><strong>Este exemplo mostra uma consulta que lista os nomes dos esquemas, tabelas,</strong> colunas e chaves das chaves estrangeiras, e os nomes dos esquemas,  tabelas e colunas referenciadas. Exemplo tirado da lista de discussão  pgsql-sql</p>
<pre>CREATE TEMPORARY TABLE t1 (id SERIAL PRIMARY KEY, nome TEXT);
CREATE TEMPORARY TABLE t2 (id INT REFERENCES t1, nome TEXT);
SELECT
   n.nspname AS esquema,
   cl.relname AS tabela,
   a.attname AS coluna,
   ct.conname AS chave,
   nf.nspname AS esquema_ref,
   clf.relname AS tabela_ref,
   af.attname AS coluna_ref,
   pg_get_constraintdef(ct.oid) AS criar_sql
FROM pg_catalog.pg_attribute a
   JOIN pg_catalog.pg_class cl ON (a.attrelid = cl.oid AND cl.relkind = 'r')
   JOIN pg_catalog.pg_namespace n ON (n.oid = cl.relnamespace)
   JOIN pg_catalog.pg_constraint ct ON (a.attrelid = ct.conrelid AND
        ct.confrelid != 0 AND ct.conkey[1] = a.attnum)
   JOIN pg_catalog.pg_class clf ON (ct.confrelid = clf.oid AND clf.relkind = 'r')
   JOIN pg_catalog.pg_namespace nf ON (nf.oid = clf.relnamespace)
   JOIN pg_catalog.pg_attribute af ON (af.attrelid = ct.confrelid AND
        af.attnum = ct.confkey[1]);
</pre>
<p><strong>Mostrar Esquemas e Tabelas</strong></p>
<pre>SELECT n.nspname as esquema, c.relname as tabela, a.attname as campo, format_type(t.oid, null) as tipo_de_dado
 FROM pg_namespace n, pg_class c,
      pg_attribute a, pg_type t
 WHERE n.oid = c.relnamespace
   and c.relkind = 'r'     -- no indices
   and n.nspname not like 'pg\\_%' -- no catalogs
   and n.nspname != 'information_schema' -- no information_schema
   and a.attnum &gt; 0        -- no system att's
   and not a.attisdropped   -- no dropped columns
   and a.attrelid = c.oid
   and a.atttypid = t.oid
 ORDER BY nspname, relname, attname;
</pre>
<p><strong>Mostrar Esquemas e respectivas tabelas do Banco atual:</strong></p>
<pre>SELECT n.nspname as esquema, c.relname as tabela  FROM pg_namespace n, pg_class c
 WHERE n.oid = c.relnamespace
   and c.relkind = 'r'     -- no indices
   and n.nspname not like 'pg\\_%' -- no catalogs
   and n.nspname != 'information_schema' -- no information_schema
 ORDER BY nspname, relname
</pre>
<p><strong>Contar Todos os Registros de todas as tabelas de todos os bancos:</strong></p>
<pre>&lt;?php
$conexao=pg_connect("host=127.0.0.1 user=postgres password=postabir");
$sql="SELECT datname AS banco FROM pg_database ORDER BY datname";
$consulta=pg_query($conexao,$sql);
$banco = array();
$c=0;
while ($data = @pg_fetch_object($consulta,$c)) {
   $cons=$data-&gt;banco;
   $banco[] .= $cons;
   $c++;
}
$sql2="SELECT n.nspname as esquema,c.relname as tabela  FROM pg_namespace n, pg_class c
WHERE n.oid = c.relnamespace
   and c.relkind = 'r'     -- no indices
   and n.nspname not like 'pg\\_%' -- no catalogs
   and n.nspname != 'information_schema' -- no information_schema
ORDER BY nspname, relname";
for ($x=0; $x &lt; count($banco);$x++){
   if ($banco[$x] !="template0" &amp;&amp; $banco[$x] != "template1" &amp;&amp; $banco[$x] !="postgres"){
       $conexao2=pg_connect("host=127.0.0.1 dbname=$banco[$x] user=postgres password=postabir");
       $consulta2=pg_query( $conexao2, $sql2 );
           while ($data = pg_fetch_object($consulta2)) {
               $esquematab=$data-&gt;esquema.'.'.$data-&gt;tabela;
               $sql3="SELECT count(*) FROM $esquematab";
               $consulta3=pg_query($conexao2,$sql3);
               $res=@pg_fetch_array($consulta3);
               print 'Banco.Esquema.Tabela -&gt;
               '.$banco[$x].'.'.$data-&gt;esquema.'.'.$data-&gt;tabela.' - Registro(s) -  '.$res[0].'
';
               $total += $res[0];
           }
   }
}
print "Total de Registro de todas as tabelas de todos os bancos ". $total;
?&gt;
</pre>
<p><strong>Dado o banco de dados, qual o seu diretório:</strong></p>
<pre>select datname, oid from pg_database;
</pre>
<p><strong>Dado a tabela, qual o seu arquivo:</strong></p>
<pre>select relname, relfilenode from pg_class;
</pre>
<p><strong>Mostrar chaves primárias das tabelas do esquema public</strong></p>
<pre>select indexrelname as indice, relname as tabela from pg_catalog.pg_statio_user_indexes as A
INNER JOIN pg_catalog.pg_index as B  ON A.indexrelid=B.indexrelid WHERE A.schemaname='public' AND B.indisprimary = true;
</pre>
<p><strong>Para visualizar como as consultas são feitas internamente via psql usamos o comando assim:</strong></p>
<pre>psql -U user banco -E
</pre>
<p><strong>Vamos usar o banco municipios, criado com os municípios do Brasil. A tabela opt_cidades.</strong></p>
<p>Veja Um Exemplo Que Retorna a Chave Primária da Tabela opt_cidades</p>
<p>SELECT 			ic.relname AS index_name, 			bc.relname AS tab_name, 			 ta.attname AS column_name, 			i.indisunique AS unique_key, 			 i.indisprimary AS primary_key</p>
<p>FROM 			pg_class bc, 			pg_class ic, 			pg_index i, 			pg_attribute  ta, 			pg_attribute ia 		WHERE 			bc.oid = i.indrelid 			AND ic.oid =  i.indexrelid 			AND ia.attrelid = i.indexrelid 			AND ta.attrelid =  bc.oid 			AND bc.relname = &#8216;opt_cidades&#8217; 			AND ta.attrelid = i.indrelid  			AND ta.attnum = i.indkey[ia.attnum-1] 		ORDER BY 			index_name,  tab_name, column_name;<br />
Retornará:</p>
<p>index_name | tab_name | column_name | unique_key | primary_key</p>
<pre>opt_cidades_pkey | opt_cidades | id          | t          | t
</pre>
<p>Retornando o Nome do Esquema</p>
<pre>            SELECT  n.nspname AS "Esquema"
            FROM  pg_catalog.pg_namespace AS n,
                   pg_catalog.pg_class AS c
             WHERE c.relnamespace = n.oid AND c.relname='opt_cidades';
</pre>
<p>Retorno: Esquema<br />
Retornar nomes de bancos:<br />
SELECT datname AS banco FROM pg_database WHERE datname != &#8216;template0&#8242;  and datname != &#8216;template1&#8242; and datname != &#8216;postgres&#8217; ORDER BY datname<br />
<strong>Retornar nomes e OIDs dos bancos:</strong></p>
<p>SELECT oid, datname FROM pg_database;<br />
<strong>Dado a tabela, qual o seu arquivo:</strong> select relname, relfilenode from pg_class;<br />
<strong>No Windows</strong></p>
<p>Podemos passar parâmetros para as macros, por exemplo:<br />
doskey /exename=psql.exe dbinfo=SELECT datname,pg_encoding_to_char(encoding) FROM pg_database WHERE datname=&#8217;$1&#8242;;<br />
E então apenas passar o parâmetro na linha de comando:</p>
<p>postgres=# dbinfo postgres<br />
<strong>Listar tabelas, e dono do esquema atual:</strong></p>
<p>SELECT n.nspname as &#8220;Schema&#8221;,</p>
<p>c.relname as &#8220;Tabela&#8221;,</p>
<p>CASE c.relkind WHEN &#8216;r&#8217; THEN &#8216;table&#8217; WHEN &#8216;v&#8217; THEN &#8216;view&#8217; WHEN &#8216;i&#8217; THEN</p>
<p>&#8216;index&#8217; WHEN &#8216;S&#8217; THEN &#8216;sequence&#8217; WHEN &#8216;s&#8217; THEN &#8216;special&#8217; END as &#8220;Tipo&#8221;,</p>
<p>u.usename as &#8220;Dono&#8221;</p>
<p>FROM pg_catalog.pg_class c</p>
<p>LEFT JOIN pg_catalog.pg_user u ON u.usesysid = c.relowner</p>
<p>LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace</p>
<p>WHERE c.relkind IN (&#8216;r&#8217;,<em>)</em></p>
<p>AND n.nspname NOT IN (&#8216;pg_catalog&#8217;, &#8216;pg_toast&#8217;)</p>
<p>AND pg_catalog.pg_table_is_visible(c.oid)</p>
<p>ORDER BY 1,2;<br />
<strong>Listar Tabelas</strong></p>
<p>select c.relname FROM pg_catalog.pg_class c</p>
<p>LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace</p>
<p>WHERE c.relkind IN (&#8216;r&#8217;,<em>) AND n.nspname NOT IN (&#8216;pg_catalog&#8217;, &#8216;pg_toast&#8217;)</em></p>
<p>AND pg_catalog.pg_table_is_visible(c.oid);<br />
SELECT tablename FROM pg_tables WHERE tablename NOT LIKE &#8216;pg%&#8217; AND tablename NOT LIKE &#8216;sql\_%&#8217;<br />
<strong>Listar todas as tabelas, índices, tamanho em KB e OIDs:</strong></p>
<p>VACUUM; &#8211;Executar antes este comando</p>
<p>SELECT c1.relname AS tabela, c2.relname AS indice,</p>
<p>c2.relpages * 8 AS tamanho_kb, c2.relfilenode AS arquivo</p>
<p>FROM pg_class c1, pg_class c2, pg_index i</p>
<p>WHERE c1.oid = i.indrelid AND i.indexrelid = c2.oid</p>
<p>UNION</p>
<p>SELECT relname, NULL, relpages * 8, relfilenode</p>
<p>FROM pg_class</p>
<p>WHERE relkind = &#8216;r&#8217;</p>
<p>ORDER BY tabela, indice DESC, tamanho_kb;<br />
<strong>Tabelas e Soma</strong></p>
<p>SELECT tablename, SUM( size_kb )</p>
<p>FROM</p>
<p>( SELECT c1.relname AS &#8220;tablename&#8221;,</p>
<p>c2.relpages * 8 AS &#8220;size_kb&#8221;</p>
<p>FROM pg_class c1, pg_class c2, pg_index i</p>
<p>WHERE c1.oid = i.indrelid</p>
<p>AND i.indexrelid = c2.oid</p>
<p>UNION</p>
<p>SELECT relname, relpages * 8</p>
<p>FROM pg_class</p>
<p>WHERE relkind = &#8216;r&#8217; ) AS relations</p>
<p>GROUP BY tablename;</p>
<p>&#8211;	r = ordinary table, i = index, S = sequence, v = view, c = composite type, &#8211;	s = special, t = TOAST table<br />
<strong>Tamanho em bytes de um banco:</strong></p>
<p>select pg_database_size(&#8216;banco&#8217;);<br />
<strong>Tamanho em bytes de uma tabela:</strong></p>
<p>pg_total_relation_size(&#8216;tabela&#8217;)<br />
<strong>Tamanho em bytes de tabela ou índice:</strong></p>
<p>pg_relation_size(&#8216;tabelaouindice&#8217;)<br />
<strong>Lista donos e bancos:</strong></p>
<p>SELECT rolname as dono, datname as banco</p>
<p>FROM pg_roles, pg_database</p>
<p>WHERE pg_roles.oid = datdba</p>
<p>ORDER BY rolname, datname;<br />
<strong>Nomes de bancos:</strong></p>
<p>select datname from pg_database where datname not in (&#8216;template0&#8242;,&#8217;template1&#8242;) order by 1<br />
<strong>Nomes e colunas:</strong></p>
<p>select tablename,&#8217;T&#8217; from pg_tables where tablename not like &#8216;pg\_%&#8217;  and tablename not in (&#8216;sql_features&#8217;, &#8216;sql_implementation_info&#8217;,  &#8216;sql_languages&#8217;, &#8216;sql_packages&#8217;, &#8216;sql_sizing&#8217;, &#8216;sql_sizing_profiles&#8217;)</p>
<p>union</p>
<p>select viewname,&#8217;V&#8217; from pg_views where viewname not like &#8216;pg\_%&#8217;<br />
<strong>Tamanho de esquema e índice:</strong></p>
<p>SELECT nspname,</p>
<p>sum(relpages * cast( 8192 AS bigint )) as &#8220;table size&#8221;,</p>
<p>sum( ( select sum(relpages)</p>
<pre>     from pg_class i, pg_index idx
</pre>
<pre>     where i.oid = idx.indexrelid
</pre>
<pre>     and t.oid=idx.indrelid ) ) * cast( 8192 AS bigint ) as "index size",
</pre>
<p>sum ( relpages * cast( 8192 AS bigint ) + ( select sum(relpages)</p>
<pre>     from pg_class i, pg_index idx
</pre>
<pre>     where i.oid = idx.indexrelid
</pre>
<pre>     and t.oid=idx.indrelid ) * cast( 8192 AS bigint ) ) as "size"
</pre>
<p>FROM pg_class t, pg_namespace</p>
<p>WHERE relnamespace = pg_namespace.oid</p>
<p>and pg_namespace.nspname not like &#8216;pg_%&#8217;</p>
<p>and pg_namespace.nspname != &#8216;information_schema&#8217;</p>
<p>and relkind = &#8216;r&#8217; group by nspname;<br />
<strong>Retornando Tabelas e Seus Donos de um Esquema</strong><br />
SELECT n.nspname as &#8220;public&#8221;,</p>
<pre> c.relname as "opt_cidades",
</pre>
<pre> CASE c.relkind WHEN 'r' THEN 'tabela' WHEN 'v' THEN 'view' WHEN 'i' THEN 'índice' WHEN 'S' THEN
</pre>
<p>&#8216;sequencia&#8217; WHEN &#8216;s&#8217; THEN &#8216;especial&#8217; END as &#8220;Tipo&#8221;, u.usename as &#8220;Dono&#8221;</p>
<p>FROM pg_catalog.pg_class c</p>
<pre>    LEFT JOIN pg_catalog.pg_user u ON u.usesysid = c.relowner
</pre>
<pre>    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
</pre>
<p>WHERE c.relkind IN (&#8216;r&#8217;,<em>)</em></p>
<pre>     AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
</pre>
<pre>     AND pg_catalog.pg_table_is_visible(c.oid)
</pre>
<p>ORDER BY 1,2;<br />
Retorno:</p>
<pre>public |   opt_cidades    |  Tipo  |   Dono
</pre>
<hr />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;-</p>
<pre>public | opt_cidades      | tabela | postgres
</pre>
<pre>public | opt_estado       | tabela | postgres
</pre>
<p><strong>Retornando o OID e o Esquema de uma Tabela</strong></p>
<p>SELECT c.oid AS &#8220;OID&#8221;,</p>
<pre> n.nspname AS "Esquema",
</pre>
<pre> c.relname AS "Tabela"
</pre>
<p>FROM pg_catalog.pg_class c</p>
<pre>    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
</pre>
<p>WHERE pg_catalog.pg_table_is_visible(c.oid)</p>
<pre>     AND c.relname ~ '^opt_cidades$'
</pre>
<p>ORDER BY 2, 3;<br />
Retorno:</p>
<pre> OID  | Esquema |   Tabela
</pre>
<p><strong>Este exemplo mostra uma consulta que lista os esquemas, nomes das  tabelas e nomes das colunas das chaves primárias de um banco de dados.  Exemplo tirado da lista de discussão pgsql-sql .</strong></p>
<p>CREATE TEMP TABLE teste1 (id INT, texto TEXT, PRIMARY KEY (id));</p>
<p>CREATE TEMP TABLE teste2 (id1 INT, id2 INT, texto TEXT, PRIMARY KEY (id1,id2));</p>
<p>\dt</p>
<p>SELECT</p>
<pre>   pg_namespace.nspname AS esquema,
</pre>
<pre>   pg_class.relname AS tabela,
</pre>
<pre>   pg_attribute.attname  AS coluna_pk
</pre>
<pre>FROM pg_class
</pre>
<pre>   JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace AND
</pre>
<pre>        pg_namespace.nspname NOT LIKE 'pg_%'
</pre>
<pre>   JOIN pg_attribute ON pg_attribute.attrelid=pg_class.oid AND
</pre>
<pre>        pg_attribute.attisdropped='f'
</pre>
<pre>   JOIN pg_index ON pg_index.indrelid=pg_class.oid AND
</pre>
<pre>        pg_index.indisprimary='t' AND
</pre>
<pre>        (
</pre>
<pre>        pg_index.indkey[0]=pg_attribute.attnum OR
</pre>
<pre>        pg_index.indkey[1]=pg_attribute.attnum OR
</pre>
<pre>        pg_index.indkey[2]=pg_attribute.attnum OR
</pre>
<pre>        pg_index.indkey[3]=pg_attribute.attnum OR
</pre>
<pre>        pg_index.indkey[4]=pg_attribute.attnum OR
</pre>
<pre>        pg_index.indkey[5]=pg_attribute.attnum OR
</pre>
<pre>        pg_index.indkey[6]=pg_attribute.attnum OR
</pre>
<pre>        pg_index.indkey[7]=pg_attribute.attnum OR
</pre>
<pre>        pg_index.indkey[8]=pg_attribute.attnum OR
</pre>
<pre>        pg_index.indkey[9]=pg_attribute.attnum
</pre>
<pre>        )
</pre>
<pre>ORDER BY pg_namespace.nspname, pg_class.relname,pg_attribute.attname;
</pre>
<p><strong>Este exemplo mostra uma consulta que lista os nomes dos esquemas,  tabelas, colunas e chaves das chaves estrangeiras, e os nomes dos  esquemas, tabelas e colunas referenciadas. Exemplo tirado da lista de  discussão pgsql-sql</strong></p>
<pre>CREATE TEMPORARY TABLE t1 (id SERIAL PRIMARY KEY, nome TEXT);
</pre>
<pre>CREATE TEMPORARY TABLE t2 (id INT REFERENCES t1, nome TEXT);
</pre>
<pre>SELECT
</pre>
<pre>   n.nspname AS esquema,
</pre>
<pre>   cl.relname AS tabela,
</pre>
<pre>   a.attname AS coluna,
</pre>
<pre>   ct.conname AS chave,
</pre>
<pre>   nf.nspname AS esquema_ref,
</pre>
<pre>   clf.relname AS tabela_ref,
</pre>
<pre>   af.attname AS coluna_ref,
</pre>
<pre>   pg_get_constraintdef(ct.oid) AS criar_sql
</pre>
<pre>FROM pg_catalog.pg_attribute a
</pre>
<pre>   JOIN pg_catalog.pg_class cl ON (a.attrelid = cl.oid AND cl.relkind = 'r')
</pre>
<pre>   JOIN pg_catalog.pg_namespace n ON (n.oid = cl.relnamespace)
</pre>
<pre>   JOIN pg_catalog.pg_constraint ct ON (a.attrelid = ct.conrelid AND
</pre>
<pre>        ct.confrelid != 0 AND ct.conkey[1] = a.attnum)
</pre>
<pre>   JOIN pg_catalog.pg_class clf ON (ct.confrelid = clf.oid AND clf.relkind = 'r')
</pre>
<pre>   JOIN pg_catalog.pg_namespace nf ON (nf.oid = clf.relnamespace)
</pre>
<pre>   JOIN pg_catalog.pg_attribute af ON (af.attrelid = ct.confrelid AND
</pre>
<pre>        af.attnum = ct.confkey[1]);
</pre>
<p>Retorno:</p>
<pre> esquema  | tabela | coluna |   chave    | esquema_ref | tabela_ref | coluna_ref |
</pre>
<p>criar_sql</p>
<pre>pg_temp_1 | t2     | id     | t2_id_fkey | pg_temp_1   | t1         | id | FOREIGN KEY (id)
</pre>
<p>REFERENCES t1(id)<br />
SELECT a.attnum, a.attname AS field, t.typname as type, a.attlen AS length, a.atttypmod-4 as lengthvar, a.attnotnull as notnull</p>
<pre>        FROM pg_class c, pg_attribute a, pg_type t
</pre>
<pre>        WHERE c.relname = 'apagar' AND a.attnum &gt; 0 AND a.attrelid = c.oid AND a.atttypid = t.oid
</pre>
<pre>        ORDER BY a.attnum;
</pre>
<p>Saída:</p>
<p>ID do campo, nomecampo, tipo, tamanho, nulo/nãonulo<br />
Outros</p>
<p>SELECT ic.relname AS index_name, bc.relname AS tab_name, ta.attname  AS column_name, i.indisunique AS unique_key, i.indisprimary AS  primary_key</p>
<pre>         FROM pg_class bc, pg_class ic, pg_index i, pg_attribute ta, pg_attribute ia
</pre>
<pre>         WHERE (bc.oid = i.indrelid)
</pre>
<pre>             AND (ic.oid = i.indexrelid)
</pre>
<pre>             AND (ia.attrelid = i.indexrelid)
</pre>
<pre>             AND (ta.attrelid = bc.oid)
</pre>
<pre>             AND (bc.relname = 'apagar')
</pre>
<pre>             AND (ta.attrelid = i.indrelid)
</pre>
<pre>             AND (ta.attnum = i.indkey[ia.attnum-1])
</pre>
<pre>             ORDER BY index_name, tab_name, column_name
</pre>
<p>Saída:</p>
<p>nomeindex/chave, nometabela, nomecampo, unique(t/f), nomepk (t/f)<br />
SELECT rcname as index_name, rcsrc</p>
<pre>         FROM pg_relcheck, pg_class bc
</pre>
<pre>         WHERE rcrelid = bc.oid
</pre>
<pre>             AND bc.relname = 'apagar'
</pre>
<pre>              AND NOT EXISTS (
</pre>
<pre>                  SELECT *
</pre>
<pre>                      FROM pg_relcheck as c, pg_inherits as i
</pre>
<pre>                      WHERE i.inhrelid = pg_relcheck.rcrelid
</pre>
<pre>                          AND c.rcname = pg_relcheck.rcname
</pre>
<pre>                          AND c.rcsrc = pg_relcheck.rcsrc
</pre>
<pre>                          AND c.rcrelid = i.inhparent
</pre>
<pre>              )
</pre>
<p>Saída: retorna as constraints check.</p>
<pre>SELECT pg_class.relname, pg_attribute.attname, pg_type.typname, pg_attribute.atttypmod-4
  FROM pg_class, pg_attribute, pg_type
  WHERE pg_attribute.attrelid = pg_class.oid
  AND pg_attribute.atttypid = pg_type.oid
  AND pg_class.relname = 'apagar'
  AND pg_attribute.attname = 'descricao'
</pre>
<p>Saída: tabela, campo, tipo, tamanho (varchar)<br />
Outros Exemplos</p>
<p>create table tabela_exemplo (</p>
<p>campo_1 integer default 5, campo_2 text default &#8216;exemplo&#8217;, campo_3 float(10),</p>
<p>campo_4 serial, campo_5 double precision, campo_6 int8, campo_7 Point,</p>
<p>campo_8 char(3), campo_9 varchar(17) );</p>
<p>Depois de criada a tabela vamos criar a consulta que nos retornará as informações da tabela:</p>
<p>SELECT</p>
<p>rel.nspname AS Esquema, rel.relname AS Tabela, attrs.attname AS Campo, &#8220;Type&#8221;, &#8220;Default&#8221;, attrs.attnotnull AS &#8220;NOT NULL&#8221;</p>
<p>FROM (</p>
<p>SELECT c.oid, n.nspname, c.relname</p>
<p>FROM pg_catalog.pg_class c</p>
<p>LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace</p>
<p>WHERE pg_catalog.pg_table_is_visible(c.oid) ) rel</p>
<p>JOIN (</p>
<p>SELECT a.attname, a.attrelid, pg_catalog.format_type(a.atttypid, a.atttypmod) as &#8220;Type&#8221;,</p>
<p>(SELECT substring(d.adsrc for 128) FROM pg_catalog.pg_attrdef d</p>
<p>WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef) as &#8220;Default&#8221;, a.attnotnull, a.attnum</p>
<p>FROM pg_catalog.pg_attribute a WHERE a.attnum &gt; 0 AND NOT  a.attisdropped ) attrs 	ON (attrs.attrelid = rel.oid ) 	WHERE relname =  &#8216;tabela_exemplo&#8217; ORDER BY attrs.attnum;</p>
<p>Retorno: testes-# WHERE relname = &#8216;tabela_exemplo&#8217; ORDER BY attrs.attnum;</p>
<pre>esquema |     tabela     |  campo  |         Type          |                     Default                     | NOT NULL
</pre>
<p>Antes de tudo devemos criar um novo tipo de dado relacionado ao retorno que obteremos da função:</p>
<p>CREATE TYPE tabela_estrutura AS (Esquema text, Tabela text, Campo text, Tipo text, Valor text, AutoIncremento bool);<br />
<strong>A função abaixo é definida em PL/PgSQL, linguagem procedural muito  semelhante ao PL/SQL do Oracle. A função foi criada nesta linguagem  devido a certas limitações que as funções em SQL possuem.</strong></p>
<pre>CREATE OR REPLACE FUNCTION Dados_Tabela(varchar(30))
 RETURNS SETOF tabela_estrutura AS '
DECLARE
 r tabela_estrutura%ROWTYPE;
 rec RECORD;
 vTabela alias for $1;
 eSql TEXT;
BEGIN
 eSql := <em>SELECT</em>
 CAST(rel.nspname as TEXT), CAST(rel.relname AS TEXT) , CAST(attrs.attname AS TEXT),
 CAST("Type" AS TEXT), CAST("Default" AS TEXT), attrs.attnotnull
      FROM
              (SELECT c.oid, n.nspname, c.relname
              FROM pg_catalog.pg_class c
              LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
              WHERE pg_catalog.pg_table_is_visible(c.oid) ) rel
       JOIN
              (SELECT a.attname, a.attrelid,
              pg_catalog.format_type(a.atttypid, a.atttypmod) as "Type",
                     (SELECT substring(d.adsrc for 128) FROM pg_catalog.pg_attrdef d
                     WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef)
              as "Default", a.attnotnull, a.attnum
              FROM pg_catalog.pg_attribute a
              WHERE a.attnum &gt; 0 AND NOT a.attisdropped ) attrs
       ON (attrs.attrelid = rel.oid )
       WHERE relname LIKE '<strong>%<em> || vTabela || </em>%'</strong>
       ORDER BY attrs.attnum<em>;</em>
 FOR r IN EXECUTE eSql
LOOP
RETURN NEXT r;
END LOOP;
IF NOT FOUND THEN
       RAISE EXCEPTION <em>Tabela % não encontrada</em>, vTabela;
END IF;
RETURN;
END
'
LANGUAGE 'plpgsql';
</pre>
<p>Para utilizar esta função, utilize o seguinte comando:</p>
<pre>SELECT * FROM Dados_Tabela('tabela');
</pre>
<p>Retorno:</p>
<p>esquema | tabela | campo | tipo | valor | autoincremento</p>
<p>Exemplos contidos no arquivo:</p>
<p>/usr/local/src/postgresql-8.1.3/src/tutorial/syscat.sql</p>
<pre>SELECT rolname as "Donos", datname as Bancos
 FROM pg_roles, pg_database
 WHERE pg_roles.oid = datdba
 ORDER BY rolname, datname;
</pre>
<p>Retorno: Donos e Bancos</p>
<pre>SELECT n.nspname as esquema, c.relname as tabela
 FROM pg_class c, pg_namespace n
 WHERE c.relnamespace=n.oid
   and c.relkind = 'r'                   -- not indices, views, etc
   and n.nspname not like 'pg\\_%'       -- not catalogs
   and n.nspname != 'information_schema' -- not information_schema
 ORDER BY nspname, relname;
</pre>
<p>Retorno: Esquemas e Tabelas</p>
<pre>SELECT n.nspname as esquema, c.relname as tabela, a.attname as campo, format_type(t.oid, null) as tipo_de_dado
 FROM pg_namespace n, pg_class c,
      pg_attribute a, pg_type t
 WHERE n.oid = c.relnamespace
   and c.relkind = 'r'     -- no indices
   and n.nspname not like 'pg\\_%' -- no catalogs
   and n.nspname != 'information_schema' -- no information_schema
   and a.attnum &gt; 0        -- no system att's
   and not a.attisdropped   -- no dropped columns
   and a.attrelid = c.oid
   and a.atttypid = t.oid
 ORDER BY nspname, relname, attname;
</pre>
<p>Retorno: esquemas, tabelas, campos, tipos de dados</p>
<pre>SELECT n.nspname, o.oprname AS binary_op,
      format_type(left_type.oid, null) AS left_opr,
      format_type(right_type.oid, null) AS right_opr,
      format_type(result.oid, null) AS return_type
 FROM pg_namespace n, pg_operator o, pg_type left_type,
      pg_type right_type, pg_type result
 WHERE o.oprnamespace = n.oid
   and o.oprkind = 'b'         -- binary
   and o.oprleft = left_type.oid
   and o.oprright = right_type.oid
   and o.oprresult = result.oid
 ORDER BY nspname, left_opr, right_opr;
</pre>
<p>Retorno: operadores binários<br />
Baypassar os de sistema:</p>
<p>and n.nspname not like &#8216;pg\\_%&#8217; &#8212; no catalogs</p>
<pre>SELECT n.nspname, p.proname, format_type(t.oid, null) as typname
 FROM pg_namespace n, pg_aggregate a,
      pg_proc p, pg_type t
 WHERE p.pronamespace = n.oid
   and a.aggfnoid = p.oid
   and p.proargtypes[0] = t.oid
 ORDER BY nspname, proname, typname;
</pre>
<p>Retorno: lista todas as funções agregadas e os tipos que podem ser aplicados<br />
Dado o banco de dados, qual o seu diretório:</p>
<pre>select datname, oid from pg_database;
</pre>
<p>Dado a tabela, qual o seu arquivo:</p>
<pre>select relname, relfilenode from pg_class;
</pre>
<p><strong>Exemplo que retorna índice, campo, tipo, comprimento, null, default:</strong></p>
<pre> SELECT pg_attribute.attnum AS index,
   attname AS field,
   typname AS type,
   atttypmod-4 as length,
   NOT attnotnull AS "null",
   adsrc AS default
 FROM pg_attribute,
   pg_class,
   pg_type,
   pg_attrdef
 WHERE pg_class.oid=attrelid
   AND pg_type.oid=atttypid
   AND attnum &gt;0
   AND pg_class.oid=adrelid
   AND adnum=attnum
   AND atthasdef='t'
   AND lower(relname)='datas'
 UNION
 SELECT pg_attribute.attnum AS index,
   attname AS field,
   typname AS type,
   atttypmod-4 as length,
   NOT attnotnull AS "null",
   <em> AS default </em>
 FROM pg_attribute,
   pg_class,
   pg_type
 WHERE pg_class.oid=attrelid
   AND pg_type.oid=atttypid
   AND attnum&gt;0
   AND atthasdef='f'
   AND lower(relname)='datas';

Fonte: http://pt.wikibooks.org/wiki/</pre>
<div class="shr-publisher-472"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/12/21/postgresql-praticometadados/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalar Apache+PHP+MySQL no Windows 7/Vista/XP</title>
		<link>http://blog.deserv.info/2010/11/29/instalar-apachephpmysql-no-windows-7vistaxp/</link>
		<comments>http://blog.deserv.info/2010/11/29/instalar-apachephpmysql-no-windows-7vistaxp/#comments</comments>
		<pubDate>Mon, 29 Nov 2010 16:48:00 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Arquivos de Configuração]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[Softwares Adicionais]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Apache HTTP Server (2.2.14)]]></category>
		<category><![CDATA[Download Apache]]></category>
		<category><![CDATA[Download MySQL 5]]></category>
		<category><![CDATA[Download PHP 5]]></category>
		<category><![CDATA[Download phpMyAdmin]]></category>
		<category><![CDATA[Instalar Apache+Php+MySQL no Windows]]></category>
		<category><![CDATA[MySQL 5.1.43]]></category>
		<category><![CDATA[PHP 5.3.1]]></category>
		<category><![CDATA[phpMyAdmin 3.2.5]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=461</guid>
		<description><![CDATA[O Apache é o servidor mais popular da web, foi criado em Abril de 1996 com o intuito de ser um servidor HTTP gratuito para sistemas UNIX e Windows. O objetivo do projeto é de fornecer um servidor seguro, eficiente e extensível que forneça serviços de HTTP em sincronia com os padrões HTTP. O intuito [...]]]></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%252F29%252Finstalar-apachephpmysql-no-windows-7vistaxp%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FgewMKs%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Instalar%20Apache%2BPHP%2BMySQL%20no%20Windows%207%2FVista%2FXP%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div style="text-align: center;"><img title="Instalação do Apache+PHP+MySQL no Windows" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/intro.jpg" alt="Instalação do Apache+PHP+MySQL no Windows" /></div>
<p>O <a title="Apache" rel="external" href="http://www.apache.org/">Apache</a> é o servidor mais popular da web, foi criado em Abril de 1996 com o  intuito de ser um servidor HTTP gratuito para sistemas UNIX e Windows. O  objetivo do projeto é de fornecer um servidor seguro, eficiente e  extensível que forneça serviços de HTTP em sincronia com os padrões  HTTP.</p>
<p><span id="more-461"></span></p>
<p>O intuito desse post é de tonar você capacitado a instalar o <a title="Apache" rel="external" href="http://www.apache.org/">Apache</a>, o <a title="PHP" rel="external" href="http://www.php.net/">PHP</a>, o <a title="MySQL" rel="external" href="http://www.mysql.com/">MySQL</a>, e o <a title="phpMyAdmin" rel="external" href="http://www.phpmyadmin.net/">phpMyAdmin</a> no Windows 7, Vista ou XP sem a utilização desses sistemas prontos, como o <a title="WampServer" rel="external" href="http://www.wampserver.com/">WampServer</a>, <a title="XAMPP" rel="external" href="http://www.apachefriends.org/en/xampp-windows.html">XAMPP</a>, <a title="PHP Triad" rel="external" href="http://sourceforge.net/projects/phptriad/">PHP Triad</a>.  A vantagem de instalar tudo separado é que você não fica sujeito as  configurações que os programas já impõem, ou muitas vezes podem até não  funcionar corretamente como deveriam.</p>
<h3>Índice</h3>
<ul>
<li>Passo 1: <a title="Instalação e configuração do Apache" rel="alternate" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#install-apache">Instalação e configuração do Apache</a></li>
<li>Passo 2: <a title="Instalação e configuração do PHP" rel="alternate" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#install-php">Instalação e configuração do PHP</a></li>
<li>Passo 3: <a title="Instalação e configuração do MySQL" rel="alternate" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#install-mysql">Instalação e configuração do MySQL</a></li>
<li>Passo 4: <a title="Instalação e configuração do PhpMyAdmin" rel="alternate" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#install-phpmyadmin">Instalação e configuração do PhpMyAdmin</a></li>
</ul>
<h3>Pré-requisitos</h3>
<ul>
<li>Apache HTTP Server (2.2.14) – Download <a title="Download Apache" rel="external enclosure" href="http://httpd.apache.org/download.cgi">Apache</a></li>
<li> PHP 5.3.1 – Download <a title="Download PHP 5" href="http://www.php.net/downloads.php">PHP 5</a></li>
<li>MySQL 5.1.43 Download <a title="Download MySQL 5" rel="external" href="http://dev.mysql.com/downloads/mysql/">MySQL 5</a></li>
<li>phpMyAdmin 3.2.5 Download <a title="Download phpMyAdmin" rel="external" href="http://sourceforge.net/projects/phpmyadmin/files/">phpMyAdmin</a></li>
</ul>
<h3 id="install-apache">Passo 1: Instalação do Apache 2.2</h3>
<p>Eu resolvi instalar o Apache em uma pasta chamada Webserver, mas você  pode instalá-lo onde quiser, se quiser seguir a minha lógica basta  criar uma pasta chamada Webserver na raiz do seu HD, ficando da seguinte  forma: <strong>C:\Webserver</strong>. Após incie o instalador do Apache, a primeira tela de instalação é semelhante a essa:</p>
<div><img title="Instalação do Apache no Windows" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/1.jpg" alt="Instalação do Apache no Windows" /></div>
<p>Basta seguir os passos, e você irá chegar a seguinte tela de  configuração. Aqui é onde iremos efetuar algumas configurações do  servidor, basta preencher o primeiro campo com o valor <strong>localdomain</strong>, o segundo campo com <strong>localhost</strong> e o terceiro um e-mail que desejar. É recomendável que você deixe o  Apache rodando na porta 80, não que isso seja obrigatório, você pode  alterar caso queira. Basta após clicar em Next:</p>
<div><img title="Instalação do Apache no Windows" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/4.jpg" alt="Instalação do Apache no Windows" /></div>
<p>Chegamos no passo onde iremos escolher o tipo de instalação, eu selecionei <strong>Custom</strong> pois quero personalizar a pasta de instalação do Apache:</p>
<div><img title="Instalação do Apache no Windows" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/5.jpg" alt="Instalação do Apache no Windows" /></div>
<p>Por padrão, o Apache será instalado na pasta Arquivos de Programas  &gt; Apache Software Foundation &gt; Apache 2.2, mas vou instalá-lo  dentro da minha pasta Webserver, ficando da seguinte forma:</p>
<div><img title="Instalação do Apache no Windows" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/6_2.jpg" alt="Instalação do Apache no Windows" /></div>
<p>Basta agora clicar em Install e a instalação será iniciada:</p>
<div><img title="Instalação do Apache no Windows" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/7.jpg" alt="Instalação do Apache no Windows" /></div>
<p>Após o término da instalação, você verá que apareceu na sua System  Tray (aqueles ícones que ficam ao lado do relógio do Windows) um novo  ícone, o Apache Monitor:</p>
<div><img title="Apache Monitor" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/9.jpg" alt="Apache Monitor" /></div>
<p>Através dele temos acesso ao status do Apache, onde podemos obter  informações se ele está rodando, podemos também parar o sevidor,  reiniciá-lo e iniciá-lo. Basta clicar com o botão direito no ícone e  escolher Open Apache Monitor:</p>
<div><img title="Apache Monitor" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/10.jpg" alt="Apache Monitor" /></div>
<p>Já que o Apache está rodando corretamente, vamos testá-lo na prática,  abra o seu browser e digite o seguinte na barra de endereços: <a title="Testando o Apache" rel="nofollow" href="http://localhost/">http://localhost/</a>. Você verá uma mensagem semelhante a abaixo:</p>
<div><img title="Apache rodando corretamente" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/11.jpg" alt="Apache rodando corretamente" /></div>
<p>As versões mais antigas do Apache exibiam outras informações, mas a  2.2.XX mostra só isso. As páginas ficam por padrão dentro da pasta  “htdocs”, no diretório onde o Apache foi instalado. No meu caso ela fica  na seguinte pasta: <strong>C:\Webserver\Apache2.2\htdocs</strong>. Caso  você queira agora pode substituir o arquivo “index.html” pelo arquivo  do seu site e também pode adicionar alí pastas e subpastas representando  outros diretórios de seu site. Por exemplo, se existir uma pasta  chamada wordpress dentro do diretório htdocs: <strong>C:\Webserver\Apache2.2\htdocs\wordpress</strong>, ela deve ser acessada dessa forma: <a title="Exemplos de acesso a pastas no Apache" rel="nofollow" href="http://localhost/wordpress/">http://localhost/wordpress/</a>.</p>
<p>Se você ao acessar localhost em seu browser e ele ficar buscando o  servidor, abrir uma página de busca, ou até mesmo retornar Servidor não  encontrado, atente-se se o Apache está rodando corretamente e o mesmo  foi iniciado. Se você efetuou esses passos e mesmo assim ele não está  funcionando, instale-o novamente seguindo os passos acima que o problema  pode ser resolvido.</p>
<p>Até agora nosso servidor lê somente HTML puro. Porém, é diferente a forma de acesso do endereço <strong>“http://localhost/index.html”</strong> de <strong>“C:\Webserver\Apache2.2\htdocs\index.html”</strong>.  No primeiro caso, o navegador solicita a página ao servidor “localhost”  (que é o seu computador), recebe a página do servidor, armazena a mesma  no cache, e só depois então a exibe. Ele trata como se fosse um site  que estivesse realmente hospedado em algum servidor da Internet. Como o  servidor do site está no seu próprio PC, trata-se então de uma <strong>Intranet</strong>.  No segundo caso, você está acessando o arquivo diretamente do seu HD. O  navegador pode até armazenar algum dado no cache, mas não há nenhuma  comunicação com qualquer servidor. Ele lê o arquivo como qualquer  programa leria qualquer arquivo.</p>
<h3>Configurações extras para o Apache</h3>
<p>Após a instalação do Apache, vamos efetuar algumas configurações adicionais simples, para isso, vamos alterar o arquivo <strong>httpd.conf</strong> que está localizado dentro da pasta conf no diretório de instalação do  Apache. Cuidado ao editar esse arquivo, pois qualquer erro e seu  servidor pode parar de funcionar. Para habilitar o uso de URL’s  amigáveis no servidor, você deve habilitar o módulo de mod_rewrite,  bastando localizar a linha:</p>
<div id="highlighter_879583">
<div>
<div><a title="view source" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#viewSource">view source</a><a title="print" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#printSource">print</a><a title="?" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#about">?</a></div>
</div>
<div>
<div><code>1.</code><code>#LoadModule rewrite_module modules/mod_rewrite.so</code></div>
</div>
</div>
<p>E substituir a mesma por:</p>
<div id="highlighter_182909">
<div>
<div><a title="view source" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#viewSource">view source</a><a title="print" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#printSource">print</a><a title="?" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#about">?</a></div>
</div>
<div>
<div><code>1.</code><code>LoadModule rewrite_module modules/mod_rewrite.so</code></div>
</div>
</div>
<p>Vamos definir agora também quais arquivos o Apache irá servir quando um diretório for requisitado. Procure a seguinte linha:</p>
<div id="highlighter_937247">
<div>
<div><a title="view source" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#viewSource">view source</a><a title="print" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#printSource">print</a><a title="?" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#about">?</a></div>
</div>
<div>
<div><code>1.</code><code>DirectoryIndex index.html</code></div>
</div>
</div>
<p>E substituir a mesma por:</p>
<div id="highlighter_898145">
<div>
<div><a title="view source" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#viewSource">view source</a><a title="print" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#printSource">print</a><a title="?" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#about">?</a></div>
</div>
<div>
<div><code>1.</code><code>DirectoryIndex index.html index.php</code></div>
</div>
</div>
<h3 id="install-php">Passo 2: Instalação e Configuração do PHP 5.3.1</h3>
<p>A partir de agora vamos proporcionar mais interatividade ao nosso  servidor com a instalação do PHP, a versão que vamos utilizar aqui é a  5.3.1. O PHP é um módulo para o Apache. Ao processar uma página PHP, o  Apache envia a página ao módulo PHP, que a processa e devolve o  resultado ao Apache, que por sua vez, envia ao browser que fez a  solicitação. Para isso, a instalação do PHP consiste basicamente em  colocar os arquivos numa pasta, e configurar o Apache para que  “enxergue” os módulos PHP e chame-os sempre que encontrar um arquivo  .php.</p>
<p>As telas de instalação poderão ser diferentes em outras versões, mas as idéias serão basicamente as mesmas:</p>
<div><img title="Instalação do PHP" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/12.jpg" alt="Instalação do PHP" /></div>
<p>Basta agora você ir seguindo os passos até chegar a tela onde você  escolherá a pasta de instalação do PHP. Como já fiz anteriormente com o  Apache, também vou personalizar a pasta do instalação do PHP, que será a  seguinte: <strong>C:\Webserver\PHP5</strong>:</p>
<div><img title="Instalação do PHP" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/15.jpg" alt="Instalação do PHP" /></div>
<p>Nesse passo, ele irá pedir o tipo de servidor você está utilizando, basta escolher o Apache 2.2.XX:</p>
<div><img title="Instalação do PHP" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/16.jpg" alt="Instalação do PHP" /></div>
<p>Nesse próximo passo, ele irá solicitar o local dos arquivos de  configuração do Apache. Localize a pasta “conf”, dentro da pasta onde  foi instalado o Apache, senão a configuração não será automatizada e  você terá que efetuar a mesma manualmente:</p>
<div><img title="Instalação do PHP" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/17.jpg" alt="Instalação do PHP" /></div>
<p>O próximo passo é onde você escolhe quais extensões quer instalar  junto com o PHP, escolha as que julgar necessário ou simplesmente deixe  como está:</p>
<div><img title="Instalação do PHP" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/18_1.jpg" alt="Instalação do PHP" /></div>
<p>Ao final do processo, caso esteja tudo OK, basta agora clicar no botão install:</p>
<div><img title="Instalação do PHP" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/19.jpg" alt="Instalação do PHP" /></div>
<p>Se tudo ocorreu bem até aí, nenhuma mensagem de erro será exibida.  Basta agora você reiniciar o Apache e as páginas .php serão processadas e  entregues corretamente ao browser. Ainda não foi configurado um  servidor de banco de dados, então apenas os recursos diretos do PHP  funcionarão (e os dos outros módulos pré-instalados do Apache). Um ótimo  meio de testar o PHP e ver diversas informações do servidor é criar uma  página PHP, com o seguinte conteúdo:</p>
<div id="highlighter_653441">
<div>
<div><a title="view source" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#viewSource">view source</a><a title="print" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#printSource">print</a><a title="?" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#about">?</a></div>
</div>
<div>
<div><code>1.</code><code>&lt; ?php phpinfo(); ?&gt;</code></div>
</div>
</div>
<div><img title="Testando o servidor Apache com PHP" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/23.jpg" alt="Testando o servidor Apache com PHP" /></div>
<p>Salve a mesma dentro da pasta htdocs com o nome info.php e então acesse a página pela seguinte URL: <a title="Página com Informações de Instalação do PHP" rel="nofollow" href="http://localhost/info.php">http://localhost/info.php</a>.</p>
<p>Você terá acesso agora a uma página com todas as informações do PHP e os componentes instalados:</p>
<div><img title="Página com Informações de Instalação do PHP" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/24.jpg" alt="Página com Informações de Instalação do PHP" /></div>
<h4>Configuração do PHP</h4>
<p>A configuração do PHP envolve a edição do arquivo php.ini, na pasta  onde o PHP for instalado, portanto, mãos a obra. Uma configuração útil é  a ativar o uso de delimitadores &lt; ? &#8230; ?&gt;, muito usados por  serem mais simples. No arquivo php.ini, localize a linha que começa com <strong>short_open_tag</strong> e troque seu valor Off para On (Fique atento as letras maiúsculas e minúsculas). Ela deve ficar dessa forma:</p>
<div id="highlighter_791481">
<div>
<div><a title="view source" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#viewSource">view source</a><a title="print" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#printSource">print</a><a title="?" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#about">?</a></div>
</div>
<div>
<div><code>1.</code><code>short_open_tag = On</code></div>
</div>
</div>
<p>Caso você deixe Off, scripts PHP que iniciem com &lt;? não serão  identificados, somente os scripts que inciem com &lt;?php funcionarão.</p>
<h5>Permitir estilo ASP</h5>
<div id="highlighter_392297">
<div>
<div><a title="view source" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#viewSource">view source</a><a title="print" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#printSource">print</a><a title="?" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#about">?</a></div>
</div>
<div>
<div><code>1.</code><code>asp_tags = On</code></div>
</div>
</div>
<p>Ative este item apenas se você gostar de usar as tags no estilo ASP,  como em &lt;% … %&gt;, caso contrário, pode deixar desativado.</p>
<h5>Habilitar a exibição de erros</h5>
<div id="highlighter_266460">
<div>
<div><a title="view source" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#viewSource">view source</a><a title="print" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#printSource">print</a><a title="?" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#about">?</a></div>
</div>
<div>
<div><code>1.</code><code>display_errors = On</code></div>
</div>
</div>
<p>Por questões de segurança esse item vem com valor Off. Sua função é a  de imprimir erros de sintaxe ou funcionamento do PHP na página. Por  questões de segurança, é bom deixá-lo em Off, pois entre as mensagens de  erros muitas vezes vêm nomes de arquivos, caminhos locais, e até a  senha do banco de dados, se tiver algum erro de sintaxe justamente na  declaração da mesma. Mas em contrapartida, para aprender PHP, é  recomedável deixá-lo em On.</p>
<h3 id="install-mysql">Passo 3: Instalação e Configuração do MySQL 5.1</h3>
<p>O MySQL é um famoso gerenciador de Banco de Dados. Nesse tutorial  iremos utilizar a versão 5.1.43 essential. Existe um outro pacote maior  que vem com algumas coisas a mais, como documentação, mas para nosso  tutorial resolvi optar pela versão mais leve.</p>
<p>A interface de instalação é semelhante a do Apache e a do PHP, não  existe muito segredo, basta ir seguindo os passos que serão mostrados  abaixo. Ao executar o instalador, você terá acesso a uma tela semelhante  a essa:</p>
<div><img title="Instalação do MySQL" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/25.jpg" alt="Instalação do MySQL" /></div>
<p>O próximo passo é onde iremos selecionar o tipo de instalação:  Típica, Completa ou Customizada. Eu optei pela instalação customizada  pois quero personalizar a pasta de instalação do MySQL:</p>
<div><img title="Instalação do MySQL" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/26.jpg" alt="Instalação do MySQL" /></div>
<p>Localização da pasta de instalação do MySQL:</p>
<div><img title="Instalação do MySQL" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/27.jpg" alt="Instalação do MySQL" /></div>
<p>Estando tudo Ok, basta clicar em Install:</p>
<div><img title="Instalação do MySQL" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/28.jpg" alt="Instalação do MySQL" /></div>
<p>Após o final da instalação, vamos efetuar as configurações do MySQL, basta seguir os passos que serão mostrados aqui:</p>
<div><img title="Instalação do MySQL" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/29.jpg" alt="Instalação do MySQL" /></div>
<p>A seguir escolha configuração detalhada:</p>
<div><img title="Instalação do MySQL" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/31.jpg" alt="Instalação do MySQL" /></div>
<p>Escolha Developer Machine:</p>
<div><img title="Instalação do MySQL" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/32.jpg" alt="Instalação do MySQL" /></div>
<p>Escolha Multifunctional Database:</p>
<div><img title="Instalação do MySQL" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/33.jpg" alt="Instalação do MySQL" /></div>
<p>No passo ao que se refere a instalação do InnoDB, deixe como o caminho <strong>Installation Patch</strong>:</p>
<div><img title="Instalação do MySQL" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/34.jpg" alt="Instalação do MySQL" /></div>
<p>Deixe selecionado Decision Support (DSS)/OLAP:</p>
<div><img title="Instalação do MySQL" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/35.jpg" alt="Instalação do MySQL" /></div>
<p>Nesse passo, não se esqueça de deixar selecionado a caixa “Adicionar excessão ao Firewall”:</p>
<div><img title="Instalação do MySQL" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/36.jpg" alt="Instalação do MySQL" /></div>
<p>Selecione Best Support for Multilingualism:</p>
<div><img title="Instalação do MySQL" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/37.jpg" alt="Instalação do MySQL" /></div>
<p>A próxima opção é de incluir o caminho do MySQL na variável de  ambiente “Path” do Windows. Deixe-a selecionada pois assim você pode  chamar os executáveis do MySQL a partir de qualquer prompt, em qualquer  pasta:</p>
<div><img title="Instalação do MySQL" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/38.jpg" alt="Instalação do MySQL" /></div>
<p>No próximo passo deve-se definir a senha de root, ele é o  administrador do MySQL. Caso você já programe em PHP já sabe que para  acessar um banco de dados é necessário fornecer um nome de usuário e  senha válidos para aquele banco. Você poderá usar o “root” e a senha  definida aqui, ou outra conta. Mas tenha em mente que para criar outras  contas você precisará do root, e para alterar as configurações ou criar  novos bancos de dados, também. Por isso é importante ter essa senha  guardada em um local seguro:</p>
<div><img title="Instalação do MySQL" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/39.jpg" alt="Instalação do MySQL" /></div>
<p>No próximo passo basta você clicar em execute para que o MySQL dê início ao processo de configuração:</p>
<div><img title="Instalação do MySQL" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/40.jpg" alt="Instalação do MySQL" /></div>
<p>Caso tudo tenha corrido OK, você verá uma tela como essa, caso tenha algum problema, efetue as configurações novamente:</p>
<div><img title="Instalação do MySQL" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/41.jpg" alt="Instalação do MySQL" /></div>
<p>Caso queira checar se o serviço do MySQL está rodando corretamente no  Windows, basta fazer o seguinte. Abra um prompt de comando, e digite: <strong>mysql -u root – p</strong>, ele irá pedir a senha de root que você havia configurado anteriormente, basta então digitar a mesma:</p>
<div><img title="Checagem do MySQL" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/42.jpg" alt="Checagem do MySQL" /></div>
<p>Após digite <strong>status</strong> e pronto, você terá informações sobre o MySQL:</p>
<div><img title="Checagem do MySQL" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/43.jpg" alt="Checagem do MySQL" /></div>
<h4>Problemas de conexão dos scripts PHP com o MySQL</h4>
<p>Alguns usuários de Windows 7, inclusive eu, andaram passando por  problemas de conexão dos scripts PHP com o banco de dados. Se por um  acaso você verificar que o serviço de MySQL está rodando corretamente,  seu script PHP também está OK e mesmo assim ele não consegue conectar no  banco de dados, aqui vai a solução. Verifique o arquivo <strong>hosts</strong> do Windows, ele fica localizado em: <strong>C:\Windows\System32\drivers\etc</strong>, abra o aquivo hosts e descomente a linha que contém o seguinte conteúdo:</p>
<div id="highlighter_783693">
<div>
<div><a title="view source" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#viewSource">view source</a><a title="print" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#printSource">print</a><a title="?" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#about">?</a></div>
</div>
<div>
<div><code>1.</code><code>127.0.0.1       localhost</code></div>
</div>
</div>
<p>Bastando somente você remover o sinal de #. Observe na screenshot abaixo como ele deve ficar:</p>
<div><img title="Edição da tabela hosts do Windows" src="http://www.pinceladasdaweb.com.br/blog/uploads/apache-php-mysql/44.jpg" alt="Edição da tabela hosts do Windows" /></div>
<p>Esse problema ocorre devido ao conector nativo do PHP. A partir da  versão php5.3 é utilizado o cliente mysql nativo mysqlnd, não se usa  mais o libmysql.dll. Esse novo conector não reconhece named pipe, por  isso, deve-se especificar no arquivo hosts do Windows.</p>
<h3 id="install-phpmyadmin">Passo 4: Instalação do PhpMyAdmin</h3>
<p>Após efetuar o download do PhpMyAdmin, descompacte o mesmo e renomeie a pasta para <strong>phpmyadmin</strong>.  Após, coloque a pasta dentro do diretório htdocs da pasta de instalação  do Apache. Para acessar agora o PhpMyAdmin basta você digitar o  seguinte: http://localhost/phpmyadmin/, entre com o usuário root e senha  que você configurou para o mesmo na instalação do MySQL e pronto, você  já tem acesso ao PhpMyAdmin.</p>
<p>Se você quiser pular esse passo de toda vez ao acessar o PhpMyAdmin  ter de se logar, basta fazer o seguinte. Na pasta do mesmo abra o  arquivo <strong>config.sample.inc.php</strong> e o renomeie para config.inc.php. Agora basta substituir a linha $cfg['Servers'][$i]['auth_type'] = ‘cookie’; por:</p>
<div id="highlighter_575229">
<div>
<div><a title="view source" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#viewSource">view source</a><a title="print" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#printSource">print</a><a title="?" href="http://www.pinceladasdaweb.com.br/blog/2010/02/22/instalar-apache-php-mysql-no-windows-7-vista-xp/#about">?</a></div>
</div>
<div>
<div><code>1.</code><code>$cfg</code><code>[</code><code>'Servers'</code><code>][</code><code>$i</code><code>][</code><code>'user'</code><code>]          = </code><code>'root'</code><code>;</code></div>
<div><code>2.</code><code>$cfg</code><code>[</code><code>'Servers'</code><code>][</code><code>$i</code><code>][</code><code>'password'</code><code>]      = </code><code>' '</code><code>; </code><code>// Digite aqui a senha de root</code></div>
<div><code>3.</code><code>$cfg</code><code>[</code><code>'Servers'</code><code>][</code><code>$i</code><code>][</code><code>'auth_type'</code><code>]     = </code><code>'config'</code><code>;</code></div>
</div>
</div>
<p>Pronto, agora toda vez ao acessar o PhpMyAdmin ele irá pular a tela  de autenticação pois o usuário e senha já estão cadastrados no arquivo  de configuração.</p>
<p>Fonte: http://www.pinceladasdaweb.com.br</p>
<div class="shr-publisher-461"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/11/29/instalar-apachephpmysql-no-windows-7vistaxp/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>PostgreSQL &#8211; createuser</title>
		<link>http://blog.deserv.info/2010/11/18/postgresql-createuser/</link>
		<comments>http://blog.deserv.info/2010/11/18/postgresql-createuser/#comments</comments>
		<pubDate>Thu, 18 Nov 2010 18:14:01 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[PGSQL]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[SGBD]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[comandos pgsql]]></category>
		<category><![CDATA[comandos postgres]]></category>
		<category><![CDATA[createuser]]></category>
		<category><![CDATA[criando banco de dados no postgres]]></category>
		<category><![CDATA[postgres]]></category>
		<category><![CDATA[SGDB]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=438</guid>
		<description><![CDATA[Nome createuser &#8211; cria uma conta de usuário do PostgreSQL Sinopse createuser [opção...] [nome_do_usuário] Descrição O utilitário createuser cria um novo usuário do PostgreSQL (ou mais precisamente, um papel). Somente os superusuários e os usuários com o privilégio CREATEROLE podem criar novos usuários e, portanto, o utilitário createuser deve ser executado por alguém que possa se conectar [...]]]></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%252F18%252Fpostgresql-createuser%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FcyYcES%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22PostgreSQL%20-%20createuser%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><h2>Nome</h2>
<p>createuser &#8211; cria uma conta de usuário do PostgreSQL  <a name="AEN58206"></a></p>
<div>
<p><a name="AEN58208"></a><span id="more-438"></span></p>
<h2>Sinopse</h2>
<p>createuser [opção...] [nome_do_usuário]</p>
</div>
<div>
<p><a name="AEN58215"></a></p>
<h2>Descrição</h2>
<p>O utilitário createuser cria um novo usuário do PostgreSQL (ou mais precisamente, um papel). Somente os superusuários e os usuários com o privilégio CREATEROLE podem criar novos usuários e, portanto, o utilitário createuser deve ser executado por alguém que possa se conectar como superusuário ou um usuário com o privilégio CREATEROLE.</p>
<p>Se for desejado criar um novo superusuário a conexão deverá ser feita  por um superusuário, e não simplesmente por usuário comum com o  privilégio CREATEROLE. Ser um superusuário  implica em não estar sujeito às verificações de permissão de acesso do  banco de dados e, portanto, a condição de superusuário deve ser  concedida criteriosamente.</p>
<p>O createuser é um invólucro em torno do comando <a href="http://pgdocptbr.sourceforge.net/pg82/sql-createrole.html"><em>CREATE ROLE</em></a> do <acronym>SQL</acronym>.  Não existe diferença efetiva entre criar usuários através deste  utilitário, ou através de outros métodos para acessar o servidor.</p>
</div>
<div>
<p><a name="AEN58229"></a></p>
<h2>Opções</h2>
<p>O createuser aceita os seguintes argumentos de linha de comando:</p>
<div>
<dl>
<dt>nome_do_usuário</dt>
<dd>Especifica o nome do usuário do PostgreSQL a ser criado. O nome deve ser diferente de todos os papéis existentes nesta instalação do PostgreSQL.</p>
</dd>
<dt>-s<br />
&#8211;superuser</dt>
<dd>O novo usuário é um superusuário.</p>
</dd>
<dt>-S<br />
&#8211;no-superuser</dt>
<dd>O novo usuário não é um superusuário. Este é o padrão.</p>
</dd>
<dt>-d<br />
&#8211;createdb</dt>
<dd>O novo usuário tem permissão para criar bancos de dados.</p>
</dd>
<dt>-D<br />
&#8211;no-createdb</dt>
<dd>O novo usuário não tem permissão para criar bancos de dados. Este é o padrão.</p>
</dd>
<dt>-r<br />
&#8211;createrole</dt>
<dd>O novo usuário tem permissão para criar novos papéis (ou seja, este usuário possui o privilégio CREATEROLE).</p>
</dd>
<dt>-R<br />
&#8211;no-createrole</dt>
<dd>O novo usuário não tem permissão para criar novos papéis. Este é o padrão.</p>
</dd>
<dt>-l<br />
&#8211;login</dt>
<dd>O novo usuário tem permissão para conectar (ou seja, este nome de  usuário pode ser utilizado como identificador do usuário inicial da  sessão). Este é o padrão.</p>
</dd>
<dt>-L<br />
&#8211;no-login</dt>
<dd>O novo usuário não tem permissão para conectar (um papel sem o privilégio LOGIN ainda é útil como forma de gerenciar permissões do banco de dados).</p>
</dd>
<dt>-i<br />
&#8211;inherit</dt>
<dd>O novo papel herda, automaticamente, os privilégios dos papéis dos quais é membro. Este é o padrão.</p>
</dd>
<dt>-I<br />
&#8211;no-inherit</dt>
<dd>O novo papel não herda automaticamente os privilégios dos papéis dos quais é membro.</p>
</dd>
<dt>-c número<br />
&#8211;connection-limit número</dt>
<dd>Define o número máximo de conexões para o novo usuário. O padrão é definir como sem limite.</p>
</dd>
<dt>-P<br />
&#8211;pwprompt</dt>
<dd>Se for especificado, o createuser solicitará a senha do novo usuário. Não é necessário caso não se planeje usar autenticação por senha.</p>
</dd>
<dt>-E<br />
&#8211;encrypted</dt>
<dd>Criptografa a senha do usuário armazenada no banco de dados. Se não  for especificado, será utilizado o comportamento padrão para senhas.</p>
</dd>
<dt>-N<br />
&#8211;unencrypted</dt>
<dd>Não criptografa a senha do usuário armazenada no banco de dados. Se  não for especificado, será utilizado o comportamento padrão para senhas.</p>
</dd>
<dt>-e<br />
&#8211;echo</dt>
<dd>Mostra os comandos que o createuser gera e envia para o servidor.</p>
</dd>
<dt>-q<br />
&#8211;quiet</dt>
<dd>Não exibe resposta.</p>
</dd>
</dl>
</div>
<p>Será solicitado o nome e outras informações que estejam faltando, se não forem especificadas na linha de comando.</p>
<p>O createuser também aceita os seguintes argumentos de linha de comando para os parâmetros de conexão:</p>
<div>
<dl>
<dt>-h hospedeiro<br />
&#8211;host hospedeiro</dt>
<dd>Especifica o nome de hospedeiro da máquina onde o servidor está  executando. Se o nome iniciar por barra (/), será utilizado como o  diretório do soquete do domínio Unix.</p>
</dd>
<dt>-p porta<br />
&#8211;port porta</dt>
<dd>Especifica a porta <acronym>TCP</acronym>, ou a extensão do arquivo de soquete do domínio Unix local, onde o servidor está atendendo as conexões.</p>
</dd>
<dt>-U nome_do_usuário<br />
&#8211;username nome_do_usuário</dt>
<dd>Nome do usuário para conectar (e não o nome do usuário a ser criado).</p>
</dd>
<dt>-W<br />
&#8211;password</dt>
<dd>Força a solicitação da senha (para conectar ao servidor, e não a senha do novo usuário).</p>
</dd>
</dl>
</div>
</div>
<div>
<p><a name="AEN58400"></a></p>
<h2>Ambiente</h2>
<div>
<dl>
<dt>PGHOST<br />
PGPORT<br />
PGUSER</dt>
<dd>Parâmetros de conexão padrão.</p>
</dd>
</dl>
</div>
</div>
<div>
<p><a name="AEN58412"></a></p>
<h2>Diagnósticos</h2>
<p>Havendo dificuldade, veja no comando <a href="http://pgdocptbr.sourceforge.net/pg82/sql-createrole.html"><em>CREATE ROLE</em></a> e no <a href="http://pgdocptbr.sourceforge.net/pg82/app-psql.html">psql</a> a discussão dos problemas possíveis e as mensagens de erro. O servidor  de banco de dados deve estar executando no hospedeiro de destino. Também  se aplicam todas as definições de conexão padrão e as variáveis de  ambiente utilizadas pela biblioteca cliente libpq.</p>
</div>
<div>
<p><a name="AEN58418"></a></p>
<h2>Exemplos</h2>
<p>Para criar o usuário joel no servidor de banco de dados padrão:</p>
<pre><samp>$</samp> <kbd>createuser joel</kbd>
<samp>O novo papel será um superusuário? (s/n)</samp> <kbd>n</kbd>
<samp>O novo papel poderá criar bancos de dados? (s/n)</samp> <kbd>n</kbd>
<samp>O novo papel poderá criar novos papéis? (s/n)</samp> <kbd>n</kbd>
<samp>CREATE USER</samp>
</pre>
<p>Criar o mesmo usuário joel usando o servidor no hospedeiro eden, porta 5000, evitando solicitação de informação e vendo o comando subjacente:</p>
<pre><samp>$</samp> <kbd>createuser -h eden -p 5000 -S -D -R -e joel</kbd>
<samp>CREATE ROLE joel NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN;</samp>
<samp>CREATE ROLE</samp>
</pre>
<p>Criar o usuário joel como um superusuário e atribuir uma senha <em>criptografada</em> imediatamente:</p>
<pre><samp>$</samp> <kbd>createuser -P -s -E -e joel</kbd>
<samp>Digite a senha do novo papel:</samp> <kbd>xyzzy</kbd>
<samp>Digite novamente:</samp> <kbd>xyzzy</kbd>
<samp>CREATE ROLE joel PASSWORD 'md58c5635dc3b41432cacfbb67c661a0e36' SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN;</samp>
<samp>CREATE ROLE</samp>
</pre>
<p>Criar o usuário joel como um superusuário e atribuir uma senha <em>não criptografada</em> imediatamente:</p>
<pre><samp>$</samp> <kbd>createuser -P -s -N -e joel</kbd>
<samp>Digite a senha do novo papel:</samp> <kbd>xyzzy</kbd>
<samp>Digite novamente:</samp> <kbd>xyzzy</kbd>
<samp>CREATE ROLE joel PASSWORD 'xyzzy' SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN;</samp>
<samp>CREATE ROLE</samp>
</pre>
<p>Nos dois exemplos acima a nova senha não é realmente mostrada ao ser  digitada, mas está mostrado o que foi digitado para ficar mais claro.  Entretanto, a senha <em>aparecerá</em> no comando mostrado, conforme está ilustrado — portanto, não será desejado utilizar a opção -e ao atribuir uma senha não criptografada quando outra pessoa puder ver a tela. <a name="AEN58466" href="http://pgdocptbr.sourceforge.net/pg82/app-createuser.html#FTN.AEN58466">[1]</a></p>
</div>
<div>
<p><a name="AEN58468"></a></p>
<h2>Consulte também</h2>
<p><a href="http://pgdocptbr.sourceforge.net/pg82/app-dropuser.html">dropuser</a>, <a href="http://pgdocptbr.sourceforge.net/pg82/sql-createrole.html"><em>CREATE ROLE</em></a>, Variáveis de ambiente (<a href="http://pgdocptbr.sourceforge.net/pg82/libpq-envars.html">Seção 29.12</a>)</p>
</div>
<h2>Notas</h2>
<table border="0" width="100%">
<tbody>
<tr>
<td width="5%" align="LEFT" valign="TOP"><a name="FTN.AEN58466" href="http://pgdocptbr.sourceforge.net/pg82/app-createuser.html#AEN58466">[1]</a></td>
<td width="95%" align="LEFT" valign="TOP">No manual original só é mostrado o caso da senha não criptografada.  Nesta tradução foi adicionado o caso da senha criptografada para ficar  mais claro. (N. do T.)</td>
</tr>
</tbody>
</table>
<p>Fonte: http://pgdocptbr.sourceforge.net</p>
<div class="shr-publisher-438"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/11/18/postgresql-createuser/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Apache mod_deflate</title>
		<link>http://blog.deserv.info/2010/11/11/apache-mod_deflate/</link>
		<comments>http://blog.deserv.info/2010/11/11/apache-mod_deflate/#comments</comments>
		<pubDate>Thu, 11 Nov 2010 21:46:58 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Gerenciamento de Arquivos]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[mod_deflate]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=435</guid>
		<description><![CDATA[O mod_deflate permite comprimir de forma automática as páginas html (e também outros tipos de arquivos) enviados aos clientes, de forma a economizar banda e a reduzir o tempo de carregamento das páginas. Se os sites hospedados no servidor utilizam páginas com grandes volumes de texto, a redução pode ser bastante significativa.  O uso de [...]]]></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%252F11%252Fapache-mod_deflate%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Apache%20mod_deflate%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>O mod_deflate permite comprimir de forma automática as páginas html (e também outros tipos de arquivos) enviados aos clientes, de forma a economizar banda e a reduzir o tempo de carregamento das páginas. Se os sites hospedados no servidor utilizam páginas com grandes volumes de texto, a redução pode ser bastante significativa. <span id="more-435"></span></p>
<p>O uso de compressão é negociado entre o servidor e o cliente no momento em que ele requisita a página, de forma que você não precisa se preocupar em excluir navegadores móveis ou clientes com browsers antigos. Ao perceber que o cliente não suporta o recurso, o servidor simplesmente envia a página sem compressão.</p>
<p>O uso do deflate aumenta sutilmente o uso de processamento no servidor, já que ele terá o trabalho de comprimir cada página solicitada antes de enviá-la ao cliente, mas isso é compensado pelo fato de o cliente demorar menos tempo para carregar cada página, o que permite que o servidor mantenha um número menor de instâncias do Apache carregadas na memória.</p>
<p>Do ponto de vista do cliente, o deflate é bastante benéfico, pois o texto das páginas carrega mais rápido. Uma página html comprimida pelo deflate fica com, tipicamente, um quarto do tamanho original. Com isso, uma página de 100 KB, que demoraria até 15 segundos para ser carregada por um cliente acessando via modem, passaria a ser carregada em apenas 3 ou 4 segundos. Depois disso, ainda teríamos o tempo de carregamento das imagens e de outros elementos da página, como de praxe, mas com o html carregado o cliente pode já ir adiantando a leitura.</p>
<p>Note que, as &#8220;páginas em html&#8221; que citei no parágrafo anterior, incluem também páginas dinâmicas em php e em outras linguagens, pois, de qualquer forma, depois de serem processadas pelo servidor, elas são enviadas ao cliente como uma página html.</p>
<p>Nas distribuições derivadas do Debian, o módulo é ativado usando o a2enmod:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><strong># a2enmod deflate</strong></span></p>
<p>Nas distribuições derivadas do Red Hat, verifique se a linha a seguir está presente dentro da seção &#8220;Dynamic Shared Object (DSO) Support&#8221; do arquivo &#8220;<strong>/etc/httpd/conf/httpd.conf</strong>&#8220;. Adicione-a manualmente caso necessário (n<span style="font-family: Bitstream Vera Sans,sans-serif;">ão se esqueça de reiniciar o Apache para que a configuração entre em vigor</span>):</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;">LoadModule deflate_module modules/mod_deflate.so</span></p>
<p><span style="font-family: Bitstream Vera Sans,sans-serif;">Esta linha tem exatamente a  mesma função desta outra, usada em algumas distribuições. A única  diferença é que neste segundo exemplo é especificado o caminho completo  até o arquivo:</span> <span style="font-family: Bitstream Vera Sans Mono,sans-serif;">LoadModule deflate_module /usr/lib/apache2/modules/mod_deflate.so</span> <span style="font-family: Bitstream Vera Sans,sans-serif;">Em seguida, vem a configuração do módulo. No Debian, a configuração vai no arquivo &#8220;<strong>/etc/apache2/mods-available/deflate.conf</strong>&#8220;, enquanto do CentOS e no Fedora é usado o arquivo &#8220;<strong>/etc/httpd/conf.d/httpd-deflate.conf</strong>&#8220;.</span></p>
<p><span style="font-family: Bitstream Vera Sans,sans-serif;">Uma configuração simples, e bastante usada, é fazer com que o deflate comprima apenas arquivos em html, texto puro ou xml, sem tentar comprimir outros tipos de arquivos (como imagens ou a</span>rquivos diversos disponibilizados para download, que via de regra já estarão compactados). Esta configuração exige uma única linha e é a configuração padrão no Debian:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;">&lt;IfModule mod_deflate.c&gt;<br />
AddOutputFilterByType DEFLATE text/html text/plain text/xml<br />
&lt;/IfModule&gt;</span></p>
<p>Outra abordagem é orientar o deflate a comprimir todos os tipos de arquivos, com exceção das imagens em .gif, .png e .jpg. Isso pode ser interessante se, além das páginas html, você disponibiliza arquivos em formatos com baixos índices de compressão, como arquivos do MS Office, por exemplo. Nesse caso, a configuração ficaria:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;">&lt;IfModule mod_deflate.c&gt;<br />
# Comprime tudo, com exceção de arquivos .gif, .jpg e .png:<br />
SetOutputFilter DEFLATE<br />
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary<br />
&lt;/IfModule&gt;</span></p>
<p>Note que esta configuração deve ser usada apenas em casos específicos, pois ela faz com que o servidor tente comprimir todo tipo de arquivos, incluindo arquivos em formatos já compactados, o que resultará em um grande aumento no uso de processamento, sem que haja uma redução tangível no tamanho dos arquivos.</p>
<p>Concluindo, uma recomendação geral é incluir exceções para versões antigas do Netscape 4 e do IE 3 que não são capazes de negociar a compressão de páginas com o servidor corretamente. Estes navegadores são extremamente raros hoje em dia, por isso mesmo os sites movimentados não recebem mais do que um punhado de visitas diárias de clientes utilizando um deles, mas não custa deixar o servidor preparado para atender a esses casos específicos. Para isso, são incluídas três linhas adicionais na configuração:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;">&lt;IfModule mod_deflate.c&gt;<br />
AddOutputFilterByType DEFLATE text/html text/plain text/xml<br />
<strong> BrowserMatch ^Mozilla/4 gzip-only-text/html<br />
BrowserMatch ^Mozilla/4\.0[678] no-gzip<br />
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html</strong><br />
</span>&lt;/IfModule&gt;</p>
<p>Fonte: http://www.gdhpress.com.br/</p>
<div class="shr-publisher-435"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/11/11/apache-mod_deflate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Regras de mod_rewrite</title>
		<link>http://blog.deserv.info/2010/11/11/regras-de-mod_rewrite/</link>
		<comments>http://blog.deserv.info/2010/11/11/regras-de-mod_rewrite/#comments</comments>
		<pubDate>Thu, 11 Nov 2010 21:44:34 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[.htaccess]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[regras de rewrite]]></category>
		<category><![CDATA[rewrite]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=433</guid>
		<description><![CDATA[O mod_rewrite tem a função de reescrever URLs a partir de um conjunto de parâmetros especificado por você. O uso mais simples para ele é quando você muda o domínio de acesso do site e quer que todos os links sejam redirecionados para o novo endereço. Imagine, por exemplo, que você migrou do http://dominio.provedor.com.br 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%252F11%252Fregras-de-mod_rewrite%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Regras%20de%20mod_rewrite%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>O mod_rewrite tem a função de reescrever URLs a partir de um conjunto de parâmetros especificado por você. O uso mais simples para ele é quando você muda o domínio de acesso do site e quer que todos os links sejam redirecionados para o novo endereço.</p>
<p><span id="more-433"></span>Imagine, por exemplo, que você migrou do <a href="http://dominio.provedor.com/">http://dominio.provedor.com.br</a> para <a href="http://dominio.com/">http://www.dominio.com.br</a>. Você poderia simplesmente criar um arquivo &#8220;index.php&#8221; no diretório raiz do antigo endereço com o seguinte conteúdo:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;">&lt;?php<br />
header(&#8220;HTTP/1.1 301 Moved Permanently&#8221;);<br />
header(&#8220;location:</span><a href="http://www.gdhpress.com.br/"><span style="font-family: Bitstream Vera Sans Mono,sans-serif;">http://www.dominio.com.br</span></a><span style="font-family: Bitstream Vera Sans Mono,sans-serif;">&#8220;);<br />
exit;<br />
?&gt;</span></p>
<p>Este é um modelo simples de redirecionamento, que faz com que o servidor passe a encaminhar os acessos para o endereço especificado, usando o código 301, que indica que a página mudou permanentemente de endereço.</p>
<p>O problema é que fazendo isso o redirecionamento funcionaria apenas para os visitantes que acessassem a página principal do site. Um visitante que tentasse acessar o &#8220;<a href="http://dominio.provedor.com/produtos/index.php?id=312">http://dominio.provedor.com.br/produtos/index.php?id=312</a>&#8220;, por exemplo, receberia um erro 404.</p>
<p>Usando o mod_rewrite, você poderia solucionar isso de forma muito simples. O primeiro passo é verificar se o módulo está carregado na configuração do Apache 2. No caso das distribuições derivadas do Debian, você pode ativá-lo usando o comando a2enmod:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;"><strong># a2enmod rewrite</strong></span></p>
<p>Muito provavelmente você receberá um &#8220;This module is already enabled!&#8221; como resposta, já que ele vem ativo por padrão na maioria das instalações. No caso do Fedora, CentOS e outras distribuições derivadas do Red Hat, verifique o arquivo &#8220;<strong>/etc/httpd/conf/httpd.conf</strong>&#8221; e, caso necessário, descomente as linhas:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;">LoadModule rewrite_module modules/mod_rewrite.so<br />
AddModule mod_rewrite.c</span></p>
<p>Depois de checar a ativação do módulo, falta apenas a configuração, que é feita através do arquivo &#8220;<strong>.htaccess</strong>&#8220;, criado no diretório raiz do site antigo (ou seja, na pasta de arquivos do &#8220;http://dominio.provedor.com.br&#8221;). Embora o .htaccess seja geralmente associado com o uso de senhas, ele na verdade tem diversos outros usos, incluindo a configuração do mod_rewrite.</p>
<p>Para que o mod_rewrite passe a encaminhar todas as requisições automaticamente, o conteúdo do arquivo &#8220;.htaccess&#8221; seria:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;">&lt;IfModule mod_rewrite.c&gt;<br />
RewriteEngine On<br />
RewriteRule (.*) http://www.dominio.com.br/$1 [R=301,L]<br />
&lt;/IfModule&gt;</span></p>
<p>A linha &#8220;RewriteEngine On&#8221; é a responsável por encaminhar as requisições ao mod_rewrite, enquanto a linha <span style="font-family: Bitstream Vera Sans,sans-serif;">&#8220;RewriteRule (.*) http://www.dominio.com.br/$1 [R=301,L]&#8221; explica o que deve ser feito. </span></p>
<p><span style="font-family: Bitstream Vera Sans,sans-serif;">Apesar de parecer estranha à primeira vista, ela segue na verdade uma lógica bastante simples. O &#8220;(.*)&#8221; cria uma regra de encaminhamento, que será aplicada a qualquer URL dentro do domínio. A página especificada pelo visitante ao acessar o site vira uma variável ($1), que é então usada no parâmetro seguinte, o &#8220;<a href="http://dominio.org/$1">http://www.dominio.com.br/$1</a></span>&#8221; onde é indicado o novo domínio do site.</p>
<p><span style="font-family: Bitstream Vera Sans,sans-serif;">Com isso, se o visitante tentar acessar o &#8220;</span><a href="http://dominio.provedor.org/produtos/index.php?id=312">http://dominio.provedor.com.br/produtos/index.php?id=312</a>&#8221; do exemplo anterior, a variável &#8220;$1&#8243; será carregada com o valor &#8220;produtos/index.php?id=312&#8243; e ele será encaminhado ao &#8220;<a href="http://dominio.org/produtos/index.php?id=312">http://www.dominio.com.br/produtos/index.php?id=312</a>&#8220;. O mesmo se aplica a qualquer outra URL que ele vier a tentar acessar.</p>
<p>Concluindo, o &#8220;[R=301,L]&#8221; é o código de retorno que será enviado ao cliente. No caso estamos usando o código 301, que é o código de redirecionamento permanente. Além de encaminhar os visitantes, ele faz com que o Google indexe a nova página e transfira o pagerank da página antiga para ela. Normalmente, a atualização do pagerank demora cerca de 3 meses, mas depois de feita a atualização o novo endereço deverá receber o mesmo pagerank do antigo.</p>
<p><span style="font-family: Bitstream Vera Sans,sans-serif;">Outro uso comum para o mod_rewrite é a simplificação dos links, transformando URLs de páginas dinâmicas, como, por exemplo, &#8220;</span><a href="http://dominio.org/produtos/index.php?id=312">http://www.dominio.com.br/produtos/index.php?id=312</a>&#8221; em URLs mais simples, como &#8220;<a href="http://dominio.org/produtos/312">http://www.dominio.com.br/produtos/312/</a>&#8221; ou &#8220;<a href="http://dominio.org/produtos/index.php?id=312">http://www.dominio.com.br/312.htm</a>&#8221;</p>
<p>Nesse caso, criamos regras do rewrite que o orientam a detectar acessos à URL simplificada e encaminhar as requisições para a URL &#8220;real&#8221; de forma transparente, novamente através do uso de variáveis.</p>
<p>Para converter as URLs do formato &#8220;<a href="http://dominio.org/index.php?id=numero">http://www.dominio.com.br/index.php?id=numero</a>&#8221; para &#8220;<a href="http://dominio.org/numero">http://www.dominio.com.br/numero</a>/&#8221;, você usaria o seguinte modelo de arquivo .htaccess:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;">&lt;IfModule mod_rewrite.c&gt;<br />
RewriteEngine on<br />
RewriteRule (.*)/$ /index.php?id=$1<br />
&lt;/IfModule&gt;</span></p>
<p>Com isso, ao acessar o &#8220;<a href="http://dominio.org/512/">http://www.dominio.com.br/512/</a>&#8220;, por exemplo, o visitante veria a página &#8220;<a href="http://dominio.org/index.php?id=512">http://www.dominio.com.br/index.php?id=512</a>&#8220;, o que mascara a complexidade da URL. Se você preferir que os links abreviados tenham a aparência de páginas com extensão .htm, em vez de pastas, o arquivo .htaccess ficaria:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;">&lt;IfModule mod_rewrite.c&gt;<br />
RewriteEngine on<br />
RewriteRule (.*)\.htm$ /index.php?id=$1<br />
&lt;/IfModule&gt;</span></p>
<p>A mesma regra pode ser aplicada também a pastas específicas. Se você quiser que ela se aplique apenas à pasta &#8220;produtos&#8221;, sem ser aplicada a outras pastas do servidor, por exemplo, você poderia usar uma regra como:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;">&lt;IfModule mod_rewrite.c&gt;<br />
RewriteEngine on<br />
RewriteRule /produtos/(.*)\.htm$ /produtos/index.php?id=$1<br />
&lt;/IfModule&gt;</span></p>
<p>É possível também usar diversos parâmetros simultaneamente, facilitando o acesso a URLs que incluam um grande volume de argumentos, como em &#8220;<a href="http://dominio.org/index.php?cat=produtos&amp;cat=info&amp;id=23">http://www.dominio.com.br/index.php?cat=produtos&amp;cat=info&amp;id=23</a>&#8220;, desde que você consiga bolar um formato de URL que permita incluir todos os parâmetros necessários, como em:</p>
<p><span style="font-family: Bitstream Vera Sans Mono,sans-serif;">&lt;IfModule mod_rewrite.c&gt;<br />
RewriteEngine on<br />
RewriteRule (.*)/(.*)/(.*)/$ /index.php?cat=$1&amp;cat=$2&amp;id=$3<br />
&lt;/IfModule&gt;</span></p>
<p>Com isso, os três parâmetros que precisam ser incluídos na URL são digitados pelo usuário na forma de uma sequência de subpastas, como em &#8220;<a href="http://dominio.org/produtos/info/23/">http://www.dominio.com.br/produtos/info/23/</a>&#8221; e o mod_rewrite converte automaticamente as URLs ao formato usado pelo servidor.</p>
<p>À primeira vista, pode parecer uma mera mudança cosmética, mas o uso das URLs amigáveis facilita bastante a navegação do visitante e pode ajudar até mesmo na indexação por parte dos mecanismos de busca.</p>
<p>Fonte: http://www.gdhpress.com.br/</p>
<div class="shr-publisher-433"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/11/11/regras-de-mod_rewrite/feed/</wfw:commentRss>
		<slash:comments>1</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>Integração Apache =&gt; Tomcat</title>
		<link>http://blog.deserv.info/2010/08/12/integracao-apache-tomcat/</link>
		<comments>http://blog.deserv.info/2010/08/12/integracao-apache-tomcat/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 20:45:02 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Instalação e Compilação de SW]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[TomCat]]></category>
		<category><![CDATA[Apache2]]></category>
		<category><![CDATA[JRE]]></category>
		<category><![CDATA[Mod_jk]]></category>
		<category><![CDATA[OpenSource]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=415</guid>
		<description><![CDATA[Integrando o Apache com o TOMCAT para que as páginas estáticas sejam executadas pelo Apache e as em JSP pelo contêiner TOMCAT, além do direcionamento das aplicações via APACHE, sendo o WebServer de acesso para as aplicações que estão no TOMCAT. Conceito Integração APACHE/TOMCAT vou dividir em duas partes e abordar a primeira delas aqui. [...]]]></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%252F12%252Fintegracao-apache-tomcat%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F9TKIJU%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Integra%C3%A7%C3%A3o%20Apache%20%3D%3E%20Tomcat%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Integrando o Apache com o TOMCAT para que as páginas estáticas sejam  executadas pelo Apache e as em JSP pelo contêiner TOMCAT, além do  direcionamento das aplicações via APACHE, sendo o WebServer de acesso  para as aplicações que estão no TOMCAT. <span id="more-415"></span></p>
<div>
<h1>Conceito</h1>
<div>
<p>Integração <em>APACHE</em>/<em>TOMCAT</em> vou dividir em duas partes e  abordar a primeira delas aqui. São elas a integração com apenas  &#8220;simples&#8221;, a qual as páginas ESTÁTICAS serão executadas pelo APACHE  (ganho de performance) e as páginas dinâmicas (JSP) executadas pelo  contêiner TOMCAT.</p>
<p>Além dessa funcionalidade, nessa primeira integração conseguimos  &#8220;esconder&#8221; as portas do TOMCAT, já que sua aplicação será chamada por  uma URL na porta 80 e o APACHE sim, irá pegar sua aplicação no TOMCAT e  mostrar ela.</p>
<p>Temos também a segunda integração do APACHE/TOMCAT, que consiste nas  vantagens da primeira acrescidas da possibilidade de se realizar  LOADBALANCER entre dois TOMCATs usando o APACHE como o WebServer que irá  gerenciar essa carga e dividirá ela, porém esse assunto não será  abortado aqui.</p>
<h1>Pré-requisitos</h1>
<p>Iremos instalar os seguintes serviços em um servidor LINUX/UNIX:</p>
<ul>
<li> OPENSSL</li>
<li> APACHE</li>
<li> TOMCAT</li>
<li> TOMCAT CONECTOR(MOD_JK)</li>
<li> JDK+JRE(JAVA)</li>
</ul>
</div>
<div>
<h1>Instalando OpenSSL, Apache, Tomcat e Java</h1>
<h1>OpenSSL</h1>
<p>Baixar última versão do SOURCE em <a href="http://www.openssl.org/">www.openssl.org</a>.</p>
<p>Consideremos que estamos usando a versão 0.98e do OPENSSL, que está em  um diretório de instalação de nosso servidor, vamos descompactar e  instalar o mesmo:</p>
<p><strong># tar -xvf openssl-0.9.8e.tar.tar<br />
# cd openssl-0.9.8e<br />
# ./configure &#8211;prefix=/usr/local/ssl<br />
# make<br />
# make install</strong></p>
<h1>Apache</h1>
<p>Baixar o último SOURCE em  <a href="http://www.apache.org/">www.apache.org</a>.</p>
<p>Consideremos que estamos usando a versão 2.2.6 do APACHE, que está em um  diretório de instalação de nosso servidor, vamos descompactar e  instalar o mesmo:</p>
<p><strong># tar -xvf httpd-2.2.6.tar.gz<br />
# cd httpd-2.2.6<br />
# ./configure &#8211;prefix=/usr/local/apache2 &#8211;enable-ssl=/usr/local/ssl<br />
# make<br />
# make install<br />
# /usr/local/apache2/bin/apachectl start</strong></p>
<p>Pronto, o Apache está instalado com suporte a SSL no diretório padrão que definimos: /usr/local/apache2.</p>
<h1>Tomcat e Java</h1>
<p>Baixar o último SOURCE em <a href="http://tomcat.apache.org/">tomcat.apache.org/</a>.</p>
<p>Consideremos que estamos usando a versão 6.0.14 do TOMCAT, que está em  um diretório de instalação que iremos usar ele, pois o TOMCAT só  precisamos descompactar e não compilar, como os demais.</p>
<p>Usei como padrão o diretório /usr/local para instalação do TOMCAT, por  convenção, deixo o nome do diretório com a versão e crio um LINK para  ele com o nome &#8220;apache-tomcat&#8221;, o que me permite mudar de versão sem ter  que alterar demais arquivos de configurações do mesmo ou de terceiros.</p>
<p><strong># cd /usr/local<br />
# tar -xvf apache-tomcat-6.0.14.tar.gz<br />
#  ln -s apache-tomcat apache-tomcat-6.0.14/<br />
# vi /etc/profile</strong></p>
<p>Adicionar as seguintes linhas no final do arquivo:</p>
<div>
<p><span style="color: #004080;">#Tomcat</span></p>
<p>CATALINA_HOME=/usr/local/apache-tomcat<br />
TOMCAT_HOME=/usr/local/apache-tomcat<br />
export CATALINA_HOME TOMCAT_HOME CLASSPATH</p>
</div>
<p>Agora iremos instalar o JAVA, baixe a última versão do BIN JDK no site  da SUN e coloque do diretório que iremos instalar ele, no caso  /usr/local. Como ele será instalado com o &#8220;nome-versão&#8221;, também iremos  criar um LINK com o nome JAVA apontando para ele, o que também nos  permite trocar de versão sem maiores problemas.</p>
<p><strong># chmod +x jdk-1_5_0_12-linux-i586.bin<br />
# ./ jdk-1_5_0_12-linux-i586.bin </strong><br />
(seguir orientações da instalação &#8211; padrão, só YES e ENTER)</p>
<p><strong># ln -s java jdk1.5.0_12/<br />
# vi /etc/profile</strong></p>
<p>Adicionar as seguintes linhas no final do arquivo:</p>
<div>
<p><span style="color: #004080;">#Java</span></p>
<p>JAVA_HOME=&#8221;/usr/local/java&#8221;<br />
JRE_HOME=&#8221;/usr/local/java/jre&#8221;<br />
CLASSPATH=&#8221;$JAVA_HOME:$JAVA_HOME/lib:$JRE_HOME/lib:.&#8221;<br />
MANPATH=&#8221;$MANPATH:$JAVA_HOME/man&#8221;<br />
JAVA_DOC=&#8221;$JAVA_HOME/docs&#8221;<br />
PATH=&#8221;$PATH:$JAVA_HOME/bin:$JRE_HOME/bin&#8221;<br />
export JAVA_HOME JRE_HOME CLASSPATH MANPATH JAVA_DOC PATH</p>
</div>
<p><strong># /usr/local/apache-tomcat/bin/catalina.sh start</strong></p>
<p>Pronto, o TOMCAT foi instalado configurado e iniciado juntamente com o suporte ao JAVA.</p>
</div>
<div>
<h1>Tomcat conector &#8211; MOD_JK</h1>
<p>Consideremos que estamos usando a versão 1.2.25 do Tomcat-Conector, que  está em um diretório de instalação de nosso servidor, vamos descompactar  e instalar o mesmo:</p>
<p><strong># tar -xvf  tomcat-connectors-1.2.25-src.tar.gz<br />
# cd  tomcat-connectors-1.2.25-src<br />
# cd native/<br />
# ./configure  &#8211;with-apxs=/usr/local/apache2/bin/apxs<br />
# make<br />
# make install<br />
# vi /usr/local/apache2/conf/httpd.conf</strong></p>
<p>Acrescentar a linha abaixo:</p>
<div>LoadModule jk_module modules/mod_jk.so</div>
<p><strong># /usr/local/apache2/bin/apachectl restart</strong></p>
<p>Pronto, o MOD_JK foi instalado e configurado para que o APACHE o  carregue em sua inicialização. O MOD_JK será o responsável pela  comunicação entre o APACHE e o TOMCAT via o protocolo EJB3 do TOMCAT.</p>
<p>Pronto, agora iremos configurar um linha em nosso TOMCAT e dois arquivos  de configurações que iremos criar no CONF do APACHE e nossa integração  ficou pronta.</p>
</div>
<div>
<h1>Configuração no TOMCAT</h1>
<p>Iremos mudar apenas o arquivo <em>server.xml</em> dentro de  /usr/local/apache-tomcat/conf/. Iremos definir um NOME para o TOMCAT,  esse nome será buscado pelo MOD_JK e servirá para passadas de  parâmetros.</p>
<p><strong># vi /usr/local/apache-tomcat/conf/server.xml</strong></p>
<p>Procurar por:</p>
<p>&lt;!&#8211; You should set jvmRoute to support load-balancing via AJP ie :<br />
&lt;Engine name=&#8221;Standalone&#8221; defaultHost=&#8221;localhost&#8221; jvmRoute=&#8221;jvm1&#8243;&gt;<br />
&#8211;&gt;<br />
&lt;Engine name=&#8221;Catalina&#8221; defaultHost=&#8221;localhost&#8221;&gt;</p>
<p>Iremos adicionar a propriedade &#8220;jvmRoute=&#8221;tomcat1&#8243;&#8221; e ficará assim:</p>
<div>&lt;!&#8211; You should set jvmRoute to support load-balancing via AJP ie :<br />
&lt;Engine name=&#8221;Standalone&#8221; defaultHost=&#8221;localhost&#8221; jvmRoute=&#8221;jvm1&#8243;&gt;<br />
&#8211;&gt;<br />
&lt;Engine  <strong>jvmRoute=&#8221;tomcat1&#8243;</strong> name=&#8221;Catalina&#8221; defaultHost=&#8221;localhost&#8221;&gt;</div>
<p>Reiniciar o TOMCAT:</p>
<p><strong># /usr/local/apache-tomcat/bin/catalina.sh</strong></p>
</div>
<div>
<h1>Configuração no Apache</h1>
<p>Vamos criar dois arquivos, um para configurarmos a comunicação com o  TOMCAT e outro para configurações básicas do MOD_JK e definição de quais  serão os &#8220;CONTEX&#8221; do TOMCAT que serão executados pelo APACHE.</p>
<p>Arquivo <em>workers.properties</em>:</p>
<p><strong># vi workers.properties</strong></p>
<p>Adicionar o seguinte conteúdo ao arquivo criado:</p>
<div><span style="color: #004080;">#</span><br />
<span style="color: #004080;"># workers.properties</span><br />
<span style="color: #004080;">#</span></p>
<p><span style="color: #004080;"># In Unix, we use forward slashes:</span><br />
ps=/</p>
<p><span style="color: #004080;"># list the workers by name</span></p>
<p>worker.list=tomcat1(nome configurado no arquivo server.xml do TOMCAT)</p>
<p><span style="color: #004080;"># &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</span><br />
<span style="color: #004080;"># First tomcat server</span><br />
<span style="color: #004080;"># &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</span><br />
worker.tomcat1.type=ajp13<br />
worker.tomcat1.host=localhost(nome do servidor onde temos o tomcat)<br />
worker.tomcat1.port=8009<br />
worker.tomcat1.lbfactor=50<br />
worker.tomcat1.cachesize=10<br />
worker.tomcat1.cache_timeout=500<br />
worker.tomcat1.socket_keepalive=1<br />
worker.tomcat1.socket_timeout=300</p>
<p><span style="color: #004080;"># Specify the size of the open connection cache.</span><br />
<span style="color: #004080;">#worker.tomcat1.cachesize</span></p>
<p><span style="color: #004080;">#</span><br />
<span style="color: #004080;"># Specifies the load balance factor when used with</span><br />
<span style="color: #004080;"># a load balancing worker.</span><br />
<span style="color: #004080;"># Note:</span><br />
<span style="color: #004080;">#  &#8212;-&gt; lbfactor must be &gt; 0</span><br />
<span style="color: #004080;">#  &#8212;-&gt; Low lbfactor means less work done by the worker.</span><br />
worker.tomcat1.lbfactor=100 //Definindo que toda a carga será usada apenas para um TOMCAT, é o nosso caso.</p>
<p><span style="color: #004080;">#</span><br />
<span style="color: #004080;"># END workers.properties</span></p>
</div>
<p>É um arquivo bem simples onde definimos o &#8220;nome&#8221; do TOMCAT para  integração via MOD_JK, &#8220;worker.list=tomcat1&#8243; e demais parâmetros para  configuração de conexão, onde devemos alterar de acordo com nosso  ambiente.</p>
<p>Arquivo <em>tomcat.conf</em>:</p>
<p>Adicionar o seguinte conteúdo ao arquivo criado:</p>
<div>
<p>JkWorkersFile /usr/local/apache2/conf/workers.properties</p>
<p>JkLogFile /usr/local/apache2/logs/mod_jk.log</p>
<p>JkLogLevel info</p>
<p>JkLogStampFormat &#8220;[%a %b %d %H:%M:%S %Y] &#8221;</p>
<p>JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories</p>
<p>JkRequestLogFormat &#8220;%w %V %T&#8221;</p>
<p>JkMount /examples/servlet/* tomcat1<br />
JkMount /examples/* tomcat1<br />
JkMount /examples/jsp/* tomcat1<br />
JkMount /*.jsp tomcat1<br />
JkMount /aplicacao1/* tomcat1</p>
</div>
<p>O que destaco são apenas as linhas com &#8220;JKMount&#8221;, que é o diretório  (CONTEX ROOT) do TOMCAT, é o nome do DIR que você acessa sua aplicação.</p>
<p>Vamos adicionar nosso arquivo &#8220;tomcat.conf&#8221; no &#8220;httpd.conf&#8221; do Apache:</p>
<p><strong># vi /usr/local/apache2/conf/httpd.conf </strong></p>
<p>Adicionar a seguinte linha no arquivo:</p>
<div>Include conf/tomcat.conf</div>
<p>Vamos reiniciar o APACHE:</p>
<p><strong># /usr/local/apache2/bin/apachectl restart</strong></p>
<h1>Testando integração</h1>
<p>Agora ao invés de acessarmos o endereço do TOMCAT, Ex.:</p>
<p>http://localhost:8080/aplicacao1</p>
<p>Iremos acessar:</p>
<p>http://localhost/aplicacao1</p>
<p>Ele irá mostrar a aplicação que está no TOMCAT e aplicará suas melhorias.</p>
<p>Obs.: Para os diretórios que não estiverem no TOMCAT.CONF, ele irá procurar no DOCUMENT ROOT de nosso APACHE.</p>
</div>
<div><strong>Por:</strong> Bruno Lima Queiroz</div>
</div>
<div class="shr-publisher-415"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/08/12/integracao-apache-tomcat/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>Alterando a senha do usuário padrão do PostgreSQL</title>
		<link>http://blog.deserv.info/2010/07/31/alterando-a-senha-do-usuario-padrao-do-postgresql/</link>
		<comments>http://blog.deserv.info/2010/07/31/alterando-a-senha-do-usuario-padrao-do-postgresql/#comments</comments>
		<pubDate>Sun, 01 Aug 2010 00:46:20 +0000</pubDate>
		<dc:creator>Flávio  Silva</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[PGSQL]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Resetando Senha de Root]]></category>

		<guid isPermaLink="false">http://blog.deserv.info/?p=402</guid>
		<description><![CDATA[Mais uma dica rápidinha para os que estão precisando realizar esta tarefa. Conecte ao servidor com o usuário root e depois se transforme no usuário “postgres” como no exemplo abaixo: root@pgsql1:~# su – postgres Agora que está com o usuário postgres, execute o seguinte comando: postgres@pgsql1:~$ psql template1 Logado no “cliente do postgres” digite 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%252F07%252F31%252Falterando-a-senha-do-usuario-padrao-do-postgresql%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F9362lw%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Alterando%20a%20senha%20do%20usu%C3%A1rio%20padr%C3%A3o%20do%20PostgreSQL%22%20%7D);"></div>
<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Mais uma dica rápidinha para os que estão precisando realizar esta tarefa.</p>
<p>Conecte ao servidor com o usuário root e depois se transforme no usuário “postgres” como no exemplo abaixo:</p>
<p>root@pgsql1:~# su – postgres</p>
<p>Agora que está com o usuário postgres, execute o seguinte comando:</p>
<p>postgres@pgsql1:~$ psql template1</p>
<p>Logado no “cliente do postgres” digite o seguinte comando:</p>
<p>template1=# ALTER USER postgres WITH PASSWORD ‘SUA_NOVA_SENHA’;</p>
<p>Agora digite “\q” para sair, desconecte do servidor e tente conectar  com a sua aplicação ou seu cliente PostgreSQL ao seu servidor com a nova  senha.</p>
<p>Fonte: http://dotlinux.net</p>
<div class="shr-publisher-402"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->
]]></content:encoded>
			<wfw:commentRss>http://blog.deserv.info/2010/07/31/alterando-a-senha-do-usuario-padrao-do-postgresql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

