Como criar scripts a partir do histórico de comandos do MySQL

As queries ou consultas feitas no cliente interativo MySQL, que funcionam bem, podem ser facilmente convertidas em scripts para automatizar suas tarefas ou adiantar o seu trabalho como desenvolvedor — seja qual for a sua linguagem de programação.
Logo MySQL sobre um fundo com um lago e um barco
A solução relatada neste artigo permite reusar as queries, de uma sessão anterior do MySQL, que estão funcionando para você, em um script.

Use um arquivo tee ou o histórico do MySQL

Uma das formas de reusar as queries MySQL, dentro de um script, é buscá-las a partir de um arquivo tee.
No artigo, Como guardar o histórico dos comandos no MySQL em um arquivo externo, eu explico o procedimento em detalhes.
Outra forma, é buscar as queries no arquivo de histórico padrão do MySQL, importar o texto e ir retirando tudo o que não serve ao seu script.
Neste caso, comece por digitar suas queries no cliente MySQL, normalmente — se certificando de que estejam funcionando sintaticamente e entregando os resultados desejados.
Em seguida, saia do MySQL, com o comando quit e liste o arquivo do histórico da sua sessão, da linha de comando:

cat .mysql_history

No Linux, o arquivo do histórico costuma ficar armazenado no seu diretório home.
Experimente combinar o comando cat com o comando grep, para obter resultados mais precisos em relação ao que te interessa:

cat .mysql_history grep -e select

Exemplo de execução do comando cat com o comando grep
Clique, para ver detalhes.

O arquivo do histórico, bem como aquele criado pelo comando tee, pode ser aberto no seu editor de scripts favorito, de onde você pode extrair as queries que deseja e editá-las como bem entender.
captura de tela komodo editor

Como determinar a versão do PHP no servidor

É possível obter informações sobre a versão do PHP em um servidor remoto, a partir de um simples terminal.
Vou mostrar como fazer isto, do console do Linux e, caso você queira saber, vou mostrar como dificultar que estranhos obtenham esta informação do seu servidor.
php logo elephpant
Ocultar a versão do PHP a requisições remotas, pode ser útil para evitar que visitantes maliciosos conheçam a que vulnerabilidades o seu site pode estar exposto.
Pode ser recomendado como um primeiro passo básico (de muitos outros) para tornar o seu servidor mais seguro.
Como se trata de segurança por obscuridade, recomenda-se não ficar dependente exclusivamente deste método.

Como obter a versão do PHP, de um servidor remoto

Tal como visto no texto Como descobrir a versão do Apache em execução, é possível obter informações diversas de um servidor remoto com o uso do comando HEAD.
Veja como obter informações sobre o PHP, no servidor:

HEAD http://localhost/sites/ial/site/index.php

Observe as informações na última linha:

200 OK
Connection: close
Date: Wed, 11 Mar 2015 20:40:37 GMT
Server: Apache
Content-Type: text/html
Client-Date: Wed, 11 Mar 2015 20:40:37 GMT
Client-Peer: 127.0.0.1:80
Client-Response-Num: 1
X-Powered-By: PHP/5.5.9-1ubuntu4.6

É importante indicar uma página .php na linha de comando do HEAD, para obter um resultado significativo.
Este é o banner que o (meu) PHP adiciona às informações do sistema: X-Powered-By: PHP/5.5.9-1ubuntu4.6.

Como determinar a localização do arquivo php.ini

Vamos ao arquivo de configuração, para ajustar a diretiva adequada.
A localização do arquivo de configuração do PHP php.ini pode variar em função do sistema operacional em uso (Linux, Unix, Windows, MacOS etc.)
No Ubuntu 14.04 LTS e em outras distrbuições Linux baseadas no Debian o arquivo de configuração a ser alterado é /etc/php5/apache2/php.ini.
Se você tiver dúvidas, uma maneira eficiente de encontrar o arquivo de configuração do PHP é usar o comando locate com o comando grep. Veja:

locate php.ini | grep apache

O meu foi encontrado aqui:

/etc/php5/apache2/php.ini
The elephant inside the snake  - O elefante dentro da cobra - em o pequeno príncipe
Tentar encontrar o arquivo de configuração do PHP, me fez pensar no “O Pequeno Príncipe”.

Como desabilitar a exibição do banner de informações do PHP no servidor

Uma vez determinado o seu arquivo de configuração php.ini, faça uma cópia de segurança, antes de alterá-lo:

sudo cp /etc/php5/apache2/php.ini /etc/php5/apache2/php.ini.original

A seguir, abra o arquivo e localize a linha que contém expose_php On e altere-a para expose_php Off. Salve o arquivo e feche o editor.
De volta ao terminal, reinicie o Apache:

sudo apachectl stop
sudo apachectl start

Se o Apache estiver exibindo a mensagem “Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName”, leia este artigo, depois.


Agora, faça o teste:

HEAD http://localhost/sites/ial/site/index.php

Observe as informações na última linha:

200 OK
Connection: close
Date: Wed, 11 Mar 2015 20:40:37 GMT
Server: Apache
Content-Type: text/html
Client-Date: Wed, 11 Mar 2015 20:40:37 GMT
Client-Peer: 127.0.0.1:80
Client-Response-Num: 1

Você pode obter mais informações sobre a configuração do PHP, no manual online: php.net/manual/pt_BR/

Como ocultar a versão do Apache no servidor

Neste post vou mostrar como alterar a configuração do Apache para não mostrar mais sua versão a requisições remotas. Esta é uma das várias medidas para fortalecer a segurança de um servidor web.
apache cadeado segurança
No artigo Como descobrir a versão do Apache em execução, mostro como obter informações sobre um servidor web remoto (e local). Neste artigo vou mostrar como inibir a exibição deste “excesso” de informações a pessoas estranhas.
Ninguém precisa saber que versão do Apache você está executando; que módulos você tem rodando e quais são as suas vulnerabilidades (baseado na versão do servidor web em execução).
Para ficar claro, o procedimento não protege contra vulnerabilidades existentes — mas dificulta a vida de quem deseja obter informações sobre o seu sistema.
Nos tópicos, a seguir, vou motrar como alterar as diretrizes ServerTokens e ServerSignature dentro do arquivo de configuração do Apache, para ser o mais objetivo possível. Depois vou explicar um pouco melhor a função delas.

Como configurar o Apache

Antes de se aventurar a alterar um arquivo do sistema, faça uma cópia de segurança dele:

sudo cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf.original

Em seguida abra o arquivo com o seu editor de texto favorito (eu vou usar o nano):

sudo nano /etc/apache2/apache2.conf

Agora altere (ou inclua) as diretrizes a que me referi acima para os seguintes valores:

ServerTokens ProductOnly
ServerSignature Off

Agora, reinicie o Apache:

sudo apachectl stop
sudo apachectl start

Agora faça um teste:

HEAD http://localhost

Altere o comando acima para os valores adequados à sua situação.
Note que no meu resultado, na 6a. linha, o nome do servidor é exibido apenas como Apache. Sua versão não é divulgada, nem tampouco o nome do sistema operacional.

200 OK
Connection: close
Date: Tue, 10 Mar 2015 21:17:25 GMT
Accept-Ranges: bytes
ETag: "2cf6-50fc9c4fbc26b"
Server: Apache
Vary: Accept-Encoding
Content-Length: 11510
Content-Type: text/html

Se quiser aumentar um pouco mais os seus conhecimentos, veja os testes descritos neste artigo.

O que é ServerTokens

A diretriz ServerTokens controla quando o cabeçalho (header) de resposta do servidor deverá, ou não, incluir uma descrição genérica do tipo de sistema operacional instalado — bem como informações sobre módulos compilados e disponíveis para uso.
Dentro do arquivo de configurações /etc/apache2/apache2.conf, esta diretriz pode ter os seguintes valores:

  • ProductOnly ou Prod — Diz para o Apache mostrar apenas o nome produto (que é o software de servidor web): Apache.
  • Major — Permite mostrar parcialmente a versão do Apache. Por exemplo: Apache/2
  • Minor — Permite ao Apache mostrar um pouco mais de sua versão. Por exemplo: Apache/2.4
  • Minimal ou Min — Torna o Apache ainda mais verboso sobre a sua versão. Por exemplo: Apache/2.4.12
  • OS — Vai além da exibição do número completo da versão do Apache e dá uma dica do sistema operacional usado no servidor. Por exemplo: Apache/2.4.12 (Unix)
  • Full ou padrão (sem parâmetros) — Mostra outros dados, como a versão do OPenSSL. Por exemplo: Apache/2.4.12 (Unix) OpenSSL/1.0.1l

Ajustar a diretiva ServerTokens para menos do que minimal não é recomendado pela documentação oficial do Apache — uma vez que dificulta encontrar erros (interoperacionais) no produto.
Além disto, a “obscuridade” não é política de segurança ideal. O correto é manter os seus servidores atualizados e ficar “ligado” no que tange eventuais descobertas de falhas de segurança

A diretriz ServerSignature do Apache

Dependendo do seus parâmetros de configuração, esta diretriz permite exibir um rodapé nos documentos gerados pelo servidor web (mensagens de erro, mod_proxy, a listagem do diretório ftp, saída do mod_info etc.)
O motivo para deixar esta opção ligada é que, em uma cadeia de proxies, pode ficar difícil dizer em qual dos servidores houve um erro.
A opção padrão é Off.
As outras opções são:

  • On — Adiciona uma linha com o número da versão do servidor e o valor de ServerName do host virtual.
  • Email — cria uma referência mailto: ao ServerAdmin, que permite a um visitante contatar o administrador do documento em exibição.

Após a versão 2.0.44, do Apache, a informação sobre a versão do servidor passou a ser controlada pelo ServerTokens.
Este site tem outros artigos sobre Apache, MySQL, PHP e configuração de servidores. Use o campo de busca, no canto superior direito para descobrir mais textos interessantes para você.

Referências

Leia a documentação oficial do Apache, sobre o assunto deste post, aqui.

Como enviar queries pro MySQL da linha de comando

O MySQL aceita queries direto da linha de comando, o que poupa tempo para realizar tarefas rápidas e evita ter que usar o modo interativo provido pelo cliente.
O conceito é simples e você provavelmente já o viu ser aplicado a inúmeros outros programas.
Oracle and MySQL logos
Uma query pode ser fornecida ao MySQL, diretamente da linha de comando, com a adição da opção -e (ou –execute) ao cliente.
O exemplo abaixo mostra como ver a quantidade de registros em na tabela clientes, dentro do banco de dados admin:

mysql -e "SELECT COUNT(*) FROM clientes" admin
+----------+
| COUNT(*) |
+----------+
|
12 |
+----------+

Se quiser usar mais de uma query, faça como sempre — separe as queries com ; (ponto e vírgula):

mysql -e "SELECT COUNT(*) FROM clientes;SELECT NOW( )" admin
+----------+
| COUNT(*) |
+----------+
|
12 |
+----------+
+---------------------+| NOW( )
|
+---------------------+
| 2001-07-04 10:42:22 |
+---------------------+

Como saber o nome de um pacote para instalar no Ubuntu ou Debian

Quem usa a Central de Software do Ubuntu ou outro gerenciador gráfico, no Debian, pode fazer uma pesquisa, na caixa adequada para encontrar o aplicativo desejado.
Muita gente, contudo (eu!!!!) prefere usar o bom e ágil terminal para instalar todos os programas de que necessita.
Os comandos apt-get e aptitude são os que resolvem a parada, nestas horas.
capa do tutorial do apt-cache no ubuntu
Mas… e quando você não sabe o nome do pacote em que o programa se encontra?

O Ubuntu sugere um pacote a partir de um nome errado

Ao digitar o nome de um aplicativo, ainda não instalado no sistema, ele tenta sugerir que você instale algum pacote que contenha algum programa com nome parecido:

grin

No exemplo, acima, tentei executar um nome de programa inexistente (de propósito). Veja, abaixo, a relação de pacotes sugerida pelo Ubuntu, nos quais eu posso encontrar alguma coisa parecida com o que desejo:

Comando 'grin' não encontrado, você quis dizer:
 Comando 'gri' do pacote 'gri' (universe)
 Comando 'gcin' do pacote 'gcin' (universe)
 Comando 'grn' do pacote 'groff' (main)
 Comando 'grpn' do pacote 'grpn' (universe)
 Comando 'grind' do pacote 'wordnet-grind' (universe)
 Comando 'grun' do pacote 'grun' (universe)
 Comando 'grig' do pacote 'grig' (universe)
grin: comando não encontrado

Use a tecla Tab, para autocompletar

Uma outra forma prática de obter o nome completo do pacote a ser instalado e digitar o seu nome parcial e teclar Tab, para ver o restante.

sudo apt-get install chro <Tab>
chromium-browser                  chromium-bsu                      chromium-chromedriver-dbg         chromium-codecs-ffmpeg-extra      chrony
chromium-browser-dbg              chromium-bsu-data                 chromium-codecs-ffmpeg            chromium-codecs-ffmpeg-extra-dbg  chrootuid
chromium-browser-l10n             chromium-chromedriver             chromium-codecs-ffmpeg-dbg        chronicle   

Este resultado, com certeza, ajuda na maioria das vezes.

Use o comando apt-cache para encontrar o pacote de programas desejado

O comando apt-cache search pode ser usado para encontrar pacotes e programas que você deseja.
No exemplo que segue, vou mostrar como encontrar o pacote em que está instalado o navegador/browser Chromium ou Chrome, do Google.

apt-cache search browser

Como a lista pode ser muito extensa, vou novamente lançar mão do comando grep, para filtrar os resultados. Veja:

apt-cache search browser | grep chrom
chromium-browser-dbg - chromium-browser debug symbols
chromium-chromedriver - WebDriver driver for the Chromium Browser
unity-chromium-extension - Unity WebApp extension for the chromium browser
oxideqt-chromedriver - Web browser engine library for Qt (chromedriver build)
chromium-browser - Chromium web browser, open-source version of Chrome
chromium-browser-l10n - chromium-browser language packages
chromium-codecs-ffmpeg - Free ffmpeg codecs for the Chromium Browser
chromium-codecs-ffmpeg-extra - Extra ffmpeg codecs for the Chromium Browser
google-chrome-beta - The web browser from Google
google-chrome-stable - The web browser from Google
google-chrome-unstable - The web browser from Google

A lista acima mostra, pelo menos 4 opções (em destaque) válidas de navegadores ou browsers para baixar no meu sistema (Ubuntu 14.04 LTS). Basta escolher e instalar:

sudo apt-get install chromium-browser

O comando apt-cache show

O comando apt-cache não precisa de privilégios administrativos para ser executado e nem de conexão à Internet — uma vez que ele pesquisa dentro do cache do Ubuntu, que fica no diretório /var/cache/apt/.
Você pode obter mais informações sobre o pacote disponível para o seu sistema usando a opção show, acompanhada do nome do pacote, desta forma:

apt-cache show chromium-browser

Se você achar a descrição muito extensa, tente novamente usar o comando grep para filtrar as informações relevantes, assim:

apt-cache show chromium-browser | grep -i description -A 10

O comando, acima, usa as opções:

  • -i — para ignorar maiúsculas/minúsculas
  • -A 10 — para mostrar 10 linhas além da que contém a expressão desejada

Veja o resultado:

Description-en: Chromium web browser, open-source version of Chrome
 An open-source browser project that aims to build a safer, faster, and more
 stable way for all Internet users to experience the web.
Description-md5: 4a155380274636a47c53917539df83d7
Homepage: http://code.google.com/chromium/
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Origin: Ubuntu
Supported: 9m
Task: mythbuntu-frontend, mythbuntu-desktop, mythbuntu-backend-slave, mythbuntu-backend-master

Package: chromium-browser
Priority: optional
Section: universe/web
Installed-Size: 153832
--
Description-pt_BR: navegador Chromium
 Chromium é um projeto de navegador de código fonte aberto que tem como
 objetivo construir uma forma mais segura, rápida e estável para que todos
 os usuários de Internet aproveitem a web.
 .
 Chromium serve como base para o Google Chrome, que é o Chromium com uma
 marca diferente (nome e logo) com poucas adições tais como uso de
 rastreamento e um sistema de autoatualização.
 .
 Este pacote contém o navegador Chromium.
Description-md5: f899058e5c597ae295f6ef23b467dade
Homepage: http://code.google.com/chromium/
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Origin: Ubuntu
Supported: 9m
Task: mythbuntu-frontend, mythbuntu-desktop, mythbuntu-backend-slave, mythbuntu-backend-master

Eu destaquei, acima, a descrição em inglês e em português (mais completa).
Divirta-se!

SAIBA MAIS!

Conheça as diferenças entre as diversas versões: Chromium vs Chrome-stable vs Chrome-unstable vs Chrome-beta.