Upgrade Ubuntu – The following packages have been kept back

Quando fui realizar as últimas atualizações do Ubuntu Server do And After através do sudo apt-get upgrade recebi a seguinte mensagem:

The following packages have been kept back

Fui pesquisar e descobri que um pacote pode retornar se ele for fazer alguma atualização do sistema, e era exatamente o que estava acontecendo.

Gerei um backup do sistema (recomendo que tu faça isso antes de cada atualização que tem alguma chande de dar problema) e para forçar a atualização dos pacotes que alterar o sistema utilize o aptitude no lugar do apt-get, o comando vai ficar assim:

sudo aptitude dist-upgrade

Pronto, Ubuntu Server com todos os pacotes atualizados e nada quebrado. 🙂

Backup do MySQL com shell script

Desde a migração do And After (final de dez 2010) para sua nova versão eu não tinha nenhuma rotina de backup do MySQL rodando – e já aprendi que nunca nesta vida devemos ficar sem backup do banco de dados de nossos projetos ou clientes.

Como eu sou "dummie" no Linux (veja você que cheguei a escrever como ver o IP no Linux) eu não sabia como fazer o agendamento de tarefas até descobrir como usar o crontab para agendar rotinas e executar shell scripts.

Ontem pesquisei um pouco sobre a melhor forma de executar um backup do MySQL e as recomendações em fóruns era de que a forma mais correta de fazer um backup sem a necessidade de derrubar o serviço é usando o mysqldump.

O MySQL dump

O mysqldump acessa sua base de dados como qualqer aplicação, por isso não é necessário derrubar o serviço antes do backup. Se você optar pela cópia de arquivos do sistema ao invés do dump (e não derrubar o mysql antes do backup) pode acontecer problema nos arquivos caso sua base seja alterada durante o backup.

O comando para gerar um .sql usando o  mysqdump é recebe algumas variáveis, um exemplo do comando (as variáveis estão explicadas abaixo do comando):

mysqldump -h localhost -u usuario -pSUASENHA nomedabase > meubackup.sql

Todos os itens sublinhados são variáveis e você deve alterar de acordo com as configurações do seu servidor.

localhost – o servidor para acessar o banco MySQL

usuario – o nome do usuário do banco

SUASENHA – password do usuário setado na variável acima (repare que não existe espaço entre -p e a senha digitada

nomedabase – nome da base que será exportada

meubackup.sql – nome do arquivo que será salvo (incluir a extensão .sql)

O arquivo gerado irá ser salvo no local em que o comando foi executado, portanto você deve primeiro ir até a pasta onde você quer salvar seu backup (usando o comando cd), por exemplo:

cd /var/backups/mysql

Feito isso você executa o comando mostrado anteriormente e será gerado o arquivo dentro de /var/backups/mysql.

Shell script para fazer o mysqldump

Sabendo os comandos para executar o dump do MySQL tudo o que você precisa agora é passar estes comando para um arquivo .sh (shell script).

Requisitos e/ou configurações

  • Ubuntu Server 10
  • gzip instalado (sudo apt-get install gzip)
  • MySQL rodando (com possibilidade de executar o mysqldump)
  • Usuário/senha com acesso a base mysql

Não estou dizendo que só vai funcionar na versão do SO que estou passando aí, mas como cada versão tem suas peculiaridades a informação pode ser importante para quem tiver problemas. 😉

#/bin/bash
U_PASTA="/var/backup/mysql"
U_DATA=$(/bin/date +%Y%m%d%H%M%S)
U_CAMINHO="backup-$U_DATA.sql"
U_HOST="localhost"
U_USER="root"
U_PASSWORD="password"
U_DATABASE="database"
#
cd $U_PASTA
mysqldump -h $U_HOST -u $U_USER -p$U_PASSWORD $U_DATABASE > $U_CAMINHO
gzip $U_CAMINHO
echo "Backup do MySQL executado"
 

No início do código as definições das variáveis para o comando mysqdump e também é salvo uma variável com informações de data, que é usada para nomear o arquivo sql gerado.

A lógica do código:

  1. Vai para o caminho especificado onde será salva a exportação do banco
  2. Executa o mysqldump com as configurações das variáveis
  3. Compacta o arquivo exportado (gzip, não mantém o arquivo descompactado)

Meu post anterior foi um tutorial sobre como usar crontab, com ele é possível você criar uma rotina que executa o seu shell script e mantém seus dados seguros. Para o And After criei uma tarefa diária, toda a madrugada uma cópia do banco é salva.

Cuidado!

O shell script deste post apenas gera os backups e não trata os backups antigos. Se você fizer a exportação diária do banco e não tratar de alguma forma seus backups consumirão todo o espaço do seu servidor.

Existem exemplos em que o próprio shell script e exclui os arquivos antigos, achei mais prático deixar isso a cargo do logrotate (que é assunto para outro post).

Como usar o crontab

Finalmente resolvi pesquisar como funciona o agendamento de tarefas no Linux para eu poder agendar o backup do MySQL (uso Ubuntu Server) e o funcionamento do crontab é bem mais simples do que eu pensava.

Como funciona o crontab

O funcionamento do crontab é simples: você tem um arquivo de texto em que cada linha representa uma tarefa agendada, cada linha é composta de 6 variáveis separadas por vírgula, explicadas abaixo.

O primeiro passo é no terminal digitar:

crontab -e

Este comando vai abrir seu arquivo de crontab ou criar um arquivo caso ele ainda não exista. No editor é só inserir uma linha com a rotina que você quer agendar, seguindo a estrutura abaixo abaixo:

*     *     *   *    *        comando a ser executaco
-     -     -   -    -
|     |     |   |    |
|     |     |   |    +----- dia da semana (0 - 6) (Domingo=0)
|     |     |   +------- mês (1 - 12)
|     |     +--------- dia do mês (1 - 31)
|     +----------- hora (0 - 23)
+------------- minuto (0 - 59)

O * representa "todos", por exemplo:

0 4 * * 0 rm /home/gserrano/backup/*

O exemplo acima remove todos os arquivos da pasta /home/gserrano/backup todo o domingo as 4 AM. Para a execução de comandos completos você pode usar shellscript, para isso o seu comando ficaria

0 4 * * 0 sh /home/exemplo.hs

O exemplo acima executa o "exemplo.sh" também as 4 da madrugada aos domingos.

Dicas

Você pode usar vírgula para executar um comando mais de uma vez. O exemplo abaixo vai executar o comando as 4 AM de domingo e quinta-feira:

0 4 * * 0,4 sh /home/exemplo.hs

Você pode usar / para indicar uma repetição dentro do intervalo que vem depois da barra. O exemplo abaixo vai executar o comando a cada 10 minutos, todo o dia:

/10 * * * * sh /home/exemplo.hs

Atenção:  o uso do / para intervalo não é suportado em todos os sistemas.

 

Tentei ser o mais direto e conciso neste pequeno tutorial, se você tiver dúvidas ou quiser corrigir ou acrescentar algo use os comentários.

Referências

Recuperando senhas armazenadas no navegador com javascript

Buenas, dando continuidade as minhas experiências com javascript rodando através da url no navegador achei uma utilidade para alguns comandos, por exemplo recuperar senhas que estão salvas no navegador.

O código utiliza jQuery, portanto o site deve ter o jQuery carregado (ou você pode carregar pela url, como explicado neste post).

Recuperando senhas gravadas no navegador

Existem softwares para recuperação de senhas gravadas em inputs do tipo password, neste caso não vou utilizar nenhum programa externo, apenas javascript e um navegador (testado apenas no FF).

O primeiro passo é acessar o site e fazer com que a senha seja carregada no campo de password, em alguns casos é necessário digitar o usuário para que isto aconteça.

Feito isso, carregue o jQuery no site através do campo da url:

javascript:var%20script=document.createElement("script");script.type="text/javascript";script.src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js";document.getElementsByTagName("head")[0].appendChild(script);void(0);

via Como carregar javascript externo em qualquer site

Sabendo que agora você pode usar os recursos do jQuery, você precisa encontrar o input do tipo password  e exibir o atributo "value" dele, o código que faz isso:

javascript:alert($("input[type=password]").val())

Simples assim, este comando deve abrir um alert com a sua senha.

Paranóico que sou, fui fazer testes em sites bancários – que não armazenam a senha, porém queria testar se era possível visualizar uma senha já digitada.

O site do Banco do Brasil chama uma função a cada tecla pressionada, que criptografa o valor digitado na senha, a função se chama filtraPassa. Portanto, o alert exibe a senha, mas ela é "criptografa".

Maldade: destruir a função filtraPassa, para isso fui na url e…

javascript: function filtraPassa(){};void(0);

A cada tecla pressionada a função é chamada (e não faz nada), então utilizando o código anterior é possível dar um alert na senha.

Não vejo isso como nenhum risco a segurança, já que é necessário ter acesso ao computador para fazer isso tudo (e a página não pode ser recarregada), então o relato foi apenas para entender o funcionamento da segurança nestes site. 🙂

Carregando um JavaScript em qualquer site

Passei minhas últimas madrugadas fazendo testes de segurança com javascript, e descobri umas coisas que achei interessantes. Desde que mudei para São Paulo comecei a trabalhar apenas com interface, isso me fez aprender muito sobre javascript, tomar alguns cuidados com performance e agora resolvi dar uma olhada em "segurança no front-end", se é que isso existe.

Quando eu falo de "segurança no javascript" me refiro a possibilidade de manipular o script da página para fazer alguma coisa que ela não está aguardando que seja feita, por isso vale relembrar que todo o processo de segurança e validação deve ser feito no back-end.

Bem, você deve saber que é possível executar um código javascript em uma página através da URL, para isso você só precisa digitar no campo de URL do navegador o comando javascript antecedido por "javascript:".

Por exemplo, aqui mesmo no O Desenvolvedor, digite o seguinte na url do seu navegador:

javascript:alert("DONT PANIC!");

Qualqur código js será interpretado quando colocado na linha de url do site, seria como um link no site com o comando "javascript:". Sabendo disso você sabe que é possível:

  1. Chamar qualquer função do código do site
  2. Criar e manipular funções do js (validação,posts,etc.)
  3. Manipular o DOM (inputs,action,methods)

Aí entra a minha curiosidade: existem plataformas onde o javascript pode fazer requisições que executam funções no back-end (insert,delete,update) e se isso não for validado e o usuário tiver um pouco de conhecimento do sistema, poderá executar funções malignas, penso eu. Ainda não testei.

Mas o motivo do post não é mostrar que é possível executar comandos através da url do navegador, é mostrar que é possível carregar um javascript hospedado em qualquer lugar e fazer com que ele seja interpretado pelo site que você está navegando.

Carregando um javascript em qualquer site

Utilizando a url do navegador vamos manipular o <head> da página e fazer com que ela carregue o jQuery, por exemplo. Vou primeiro colocar o código do "load", depois transformar ele em uma única linha para que seja colocado no navegador.

//criamos um <script> e setamos o tipo e a url
var script=document.createElement("script");
script.type="text/javascript";
script.src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js";

//manipulamos o <head> do site para inserir o script
document.getElementsByTagName("head")[0].appendChild(script);

 

Simples, se você colocar isso em qualquer .js do seu site ele irá carregar o jQuery do Google libraries. Para fazer isso através em qualquer site que você esteja navegando é só digitar o seguinte no campo de url (com o site carregado no seu navegador):

javascript:var%20script=document.createElement("script");script.type="text/javascript";script.src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js";document.getElementsByTagName("head")[0].appendChild(script);void(0);

A única diferença do bloco de código anterior é o void(0);, que serve unicamente para o navegador não entender seu comando com uma chamada para uma url e tentar abrir uma nova página.

Pronto, agora o site que você está visualizando tem a biblioteca jQuery funcionando.

Algumas curiosidades que descobri:

  1. Se o caminho do javascript que você tentar carregar for no seu computador "///file…" OU em um localhost (rodando servidor na sua máquina) ele será carregado no DOM porém não será interpretado
  2. Para o problema anterior não adianta simular um domínio apontando para o localhost (através do hosts do Windows), ele vai continuar carregando o javascript no DOM mas não interpretando

Então o jeito para carregar um JS externo é hospedar em algum servidor e fazer a chamada para o arquivo hospedado. Todos os testes foram feitos no Windows Seven com Firefox 3.6.

 

Opinião

Agora eu quero a opinião dos leitores, o que vocês acham deste lance de segurança no front-end? Uma babaquice? Perigoso? É necessário se preocupar?

Comentem, estou curioso sobre estas coisas e queria saber até que ponto vocês acham que pode ser perigoso a manipulação de uma página por scripts externos…