Desafio do Beakman

By | June 15, 2009

Lembram do Beakman?  uhauhauhauha…

Eu cai na seguinte situação: Tenho um número X de servidores que tem um usuário que eu posso utilizar para dar login. Existem 4 senhas possíveis para este usuário, mas eu não sei qual senha está em qual servidor, de forma que eu tenho que ir tentando até conseguir quando tento conectar no mesmo.

Depois de conseguir dar login na máquina eu tenho que virar root. Eu sei que cada servidor tem uma senha de root diferente, mas sempre que eu usar a senha de usuário X a senha de root vai ser Y, senha de usuário A, senha de root B.

Até o momento só consegui semi-automatizar o processo, mostrando na tela qual senha funcionou para o usuário, de forma que eu vou saber qual senha de root usar. O ideal é automatizar o login de forma que eu só precise bater o nome da máquina e já caia no prompt de root.

O que fiz foi:

#!/bin/bash

senhas="senha1 senha2 senha3 senha4"

SERVER=$1

for senha in $senhas
do
    export SSHPASS=$senha
    echo "Tentando $senha"
    sshpass -e ssh user@$SERVER
    [ $? -eq 0 ] && exit
done

O Pascal me sugeriu o paramiko, mas acho que ele não tem a funcionalidade de me entregar o prompt de comando. Estou tentando também usar o Pexpect, mas sem muita sorte.

4 thoughts on “Desafio do Beakman

  1. Pascal

    O paramiko é bem completo, oferece todas as funcionalidades do ssh. Para ter uma idéia, no momento estou trabalhando em um projeto usando a função de ReverseForward do ssh.

    Dei uma olhada rápida nos meus bookmarks, talvez algum desses links te ajude:

    http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-different/

    http://tlepsh.blogspot.com/2007/09/python-ssh-paramiko-run-command-at.html

    http://www.enterpriseitplanet.com/networking/features/article.php/3789961

  2. Paulo

    Opa,

    Quem tal tentar com o kermit?

    boa sorte

  3. Silvio Fonseca

    Solução porca 1: Sudo sem senha
    Solução menos-porca 2: cria um script expect que receba a senha via parâmetro e roda e sshpass pra executar \”su root /bin/bash –login\” dentro do ssh… a senha de root você pode pegar no bash mesmo, no lugar de \”senha1 senha2 senha3\” você usa \”senha1:root1 senha2:root2 senha3:root3\” e separa as senhas via \’cut\’ dentro do loop.

  4. Leonardo

    Tive um problema parecido com o seu… ai hoje criei vergonha e fiz o script… para mim deu certo… Mande notícias pra saber se funcionou pra vc.

    []’s
    Leo


    #/bin/bash!
    #para evitar problemas com o ssh, adicione essas linhas, colocando no host sua rede de servidores
    #Host 192.168.*
    # StrictHostKeyChecking no
    sshpass="/usr/bin/sshpass"
    passwords='12345678 12345672221 123456 senhazonha'
    serverList=$(cat serverList.txt)
    serverSeq=0
    log="./out.log"
    #Se quiser que ele mude a senha por uma nova, use 1 (meio logico, ne?!)
    changePassword=1
    #a senha deve ser encriptada, vc pode fazer isso ao ver o conteudo de uma senha no shadow.
    #newPassword="12345678"
    newPassword='$1$jrcfLuot$O0cRA2OOq9KKesetDmgrC0'
    for server in ${serverList}; do
    passwordSeq=0
    let serverSeq++
    erro=1
    echo ${server} >> ${log}
    for password in ${passwords}; do
    let passwordSeq++
    ${sshpass} -p ${password} ssh root@${server} /bin/true; erro=$? >> ${log}
    if [ ${erro} -eq 0 ] ; then
    echo "Senha encontrada... [${serverSeq}]${server}, senha: [${passwordSeq}] " >> ${log}
    if [ ${changePassword} -eq 1 ]; then
    echo "Mudando senha do servidor [${serverSeq}]${server}. Senha Antiga: [${passwordSeq}][${password}] " \
    "Senha Nova: [${newPassword}]" >> ${log}
    ${sshpass} -p ${password} ssh root@${server} /usr/sbin/usermod -p \'${newPassword}\' root; erro=$? ; \
    echo "Saida ${erro}" >> ${log}
    fi
    break
    fi
    done
    if [ ! ${erro} -eq 0 ] ; then
    echo "Senha nao encontrada... [${serverSeq}]${server}" >> ${log}
    fi
    done

Comments are closed.