Discussion:
[shell-script] Lendo uma lista de possível senhas para uma lista de hosts
George Robinson george.robinson.br@gmail.com [shell-script]
2017-07-05 21:49:34 UTC
Permalink
Olá pessoal,

Estou tentando criar um formato para que eu consiga pegar uma lista de
hosts, exemplo:

host1
host2
host3
....
host(n)

e para cada um desses, eu consiga testar uma lista de possíveis senhas.

Até o momento, eu consegui fazer uma comparação 1 para 1, ou seja, primeiro
host com a primeira senha, e ele retorna se está correto ou não. Usei os
seguintes scripts:

hosts_dev.txt:
host1
host2
host3

pws_dev.txt:
senha1
senha2
senha3

Utilizei um arquivo que testa as senhas pwtest.exp:

#!/usr/bin/expect -f
################################################################################################################
## Script para testar a conexao com servidor e checar se a senha do usuario
root esta correta
## Utiliza o comando expect para fazer o acesso e inserir a senha ##
## Referencia:
http://www.pantz.org/software/expect/expect_examples_and_tips.html ##
## Nix - 23/08/2013 ##
################################################################################################################
######### Variaveis #########
set timeout 5
set HOST [lindex $argv 0]
set PASS [lindex $argv 1]
log_user 0

## Inicializa a conexao SSH
spawn ssh -q -o StrictHostKeyChecking=no root@$HOST
## Mensagem de erro a ser exibida caso ocorra timeout na conexao SSH
(prompt que solicita a senha nao eh exibido!)
## *assword eh para corresponder "Password" ou "password" :)
expect {
timeout { send_user "\nFailed to get password prompt\n"; exit 1 }
eof { send_user "\nSSH failure for $HOST\n"; exit 1 }
"*assword"
}
## Caso o prompt que solicita a senha seja exibido, a mesma eh enviada
send "$PASS\r"

## Mensagem a ser exibida caso a senha esteja incorreta
## *\# indica o prompt do usuario caso, o root
expect {
timeout { send_user "$HOST - Login failed. Password incorrect.\n"; exit 1}
"*\# "
}
## Caso a senha esteja correta, eh exibida a mensagem abaixo:
send_user "$HOST - Password is correct\n"

## Desconecta do servidor - o mesmo que Control+D:
send "exit\r"
## Encerra programa
close

----------------------------------------------------------------------------------------------------------

E por fim, o arquivo que valida tudo, valida_pw.sh:


#!/bin/bash

################################################################################################################
## Script para validar senhas em massa a partir de um arquivo de servidores
e outro com as respectivas senhas
## Executa o arquivo pwtest.exp
## Nix - 23/08/2013
################################################################################################################

######## Variaveis ########
# Lista de servidores
HOSTS=$(cat /root/temp/hosts_dev.txt)
# Arquivo de senhas
PWDS=$(cat /root/temp/pws_dev.txt)

####### Contador para ler o arquivo de senhas linha a linha #######
i=0
for pd in $PWDS; do
pws[$i]=$pd;
i=`expr $i + 1`
done

####### Contador para ler o arquivo de hosts linha a linha e testar a senha
usando o script expect #######
### Eh passado como parametro o servidor ($j) e a senha do mesmo ($pws)
i=0
for j in $HOSTS; do
/root/temp/pwtest.exp $j ${pws[$i]}
i=`expr $i + 1`
done


Eu tentei fazer um for para os arquivos de host e um while para o arquivo
de senha, fazendo com que ele teste todas as possíveis senhas para cada
host a ser testado, porém o loop fica infinito. Pensei em algo como (apenas
senhas):

while read $PWDS ; do
pws[$i]=$pd;
i=`expr $i + 1`
done

Mas não tive sucesso até o momento.

George Robinson
Analista de Suporte
Tel: +55 (21) 97449-8138
George Robinson george.robinson.br@gmail.com [shell-script]
2017-07-06 01:00:23 UTC
Permalink
Só complementando pessoal, o meu problema é que eu tenho uma lista de mais
de 100 vms Linux que saíram praticamente do mesmo template. fazendo algumas
observações, notei que alguns arquivos podem me ajudar a descobrir a data
de criação de cada uma delas. O arquivo /etc/modprobe.conf por exemplo tem
a data de criação alterada em cada vm, portando preciso matar 3 problemas:
1 - gerar uma lista com todos os servers (ok)
2 - gerar um arquivo com todas as possíveis senhas (ok)
3 - rodar um ls -tlha /etc/modprobe.conf após relacionar o host com a senha
correta, por isso esse script. No momento eu só consigo validar host1 com a
senha 1, host2 com a senha 2. Então, mesmo que eu tenha que fazer desta
forma, ainda não estou conseguindo passar o argumento pra rodar o ls.
Post by George Robinson ***@gmail.com [shell-script]
Olá pessoal,
Estou tentando criar um formato para que eu consiga pegar uma lista de
host1
host2
host3
....
host(n)
e para cada um desses, eu consiga testar uma lista de possíveis senhas.
Até o momento, eu consegui fazer uma comparação 1 para 1, ou seja,
primeiro host com a primeira senha, e ele retorna se está correto ou não.
host1
host2
host3
senha1
senha2
senha3
#!/usr/bin/expect -f
############################################################
####################################################
## Script para testar a conexao com servidor e checar se a senha do
usuario root esta correta
## Utiliza o comando expect para fazer o acesso e inserir a senha ##
## Referencia: http://www.pantz.org/software/expect/expect_examples_and_
tips.html ##
## Nix - 23/08/2013 ##
############################################################
####################################################
######### Variaveis #########
set timeout 5
set HOST [lindex $argv 0]
set PASS [lindex $argv 1]
log_user 0
## Inicializa a conexao SSH
## Mensagem de erro a ser exibida caso ocorra timeout na conexao SSH
(prompt que solicita a senha nao eh exibido!)
## *assword eh para corresponder "Password" ou "password" :)
expect {
timeout { send_user "\nFailed to get password prompt\n"; exit 1 }
eof { send_user "\nSSH failure for $HOST\n"; exit 1 }
"*assword"
}
## Caso o prompt que solicita a senha seja exibido, a mesma eh enviada
send "$PASS\r"
## Mensagem a ser exibida caso a senha esteja incorreta
## *\# indica o prompt do usuario caso, o root
expect {
timeout { send_user "$HOST - Login failed. Password incorrect.\n"; exit 1}
"*\# "
}
send_user "$HOST - Password is correct\n"
send "exit\r"
## Encerra programa
close
------------------------------------------------------------
----------------------------------------------
#!/bin/bash
############################################################
####################################################
## Script para validar senhas em massa a partir de um arquivo de
servidores e outro com as respectivas senhas
## Executa o arquivo pwtest.exp
## Nix - 23/08/2013
############################################################
####################################################
######## Variaveis ########
# Lista de servidores
HOSTS=$(cat /root/temp/hosts_dev.txt)
# Arquivo de senhas
PWDS=$(cat /root/temp/pws_dev.txt)
####### Contador para ler o arquivo de senhas linha a linha #######
i=0
for pd in $PWDS; do
pws[$i]=$pd;
i=`expr $i + 1`
done
####### Contador para ler o arquivo de hosts linha a linha e testar a
senha usando o script expect #######
### Eh passado como parametro o servidor ($j) e a senha do mesmo ($pws)
i=0
for j in $HOSTS; do
/root/temp/pwtest.exp $j ${pws[$i]}
i=`expr $i + 1`
done
Eu tentei fazer um for para os arquivos de host e um while para o arquivo
de senha, fazendo com que ele teste todas as possíveis senhas para cada
host a ser testado, porém o loop fica infinito. Pensei em algo como (apenas
while read $PWDS ; do
pws[$i]=$pd;
i=`expr $i + 1`
done
Mas não tive sucesso até o momento.
George Robinson
Analista de Suporte
Tel: +55 (21) 97449-8138 <(21)%2097449-8138>
itamarnet@yahoo.com.br [shell-script]
2017-07-06 11:30:30 UTC
Permalink
George, Não vou entrar no mérito do código sobre as conexões ou da tarefa do script.
Vou me concentrar na repetição de dois arquivo onde é preciso fazer a combinação:


Tendo o arquivo lista1.txt
$ cat lista1.txt
linha1
linha2
linha3
linha4



E o arquivo lista2.txt
$ cat lista2.txt
item1
item2
item3
item4
item5


Para combiná-los eu faço:
$ while read linha;do (while read item;do echo $linha $item;done < lista2.txt) ;done < lista1.txt
linha1 item1
linha1 item2
linha1 item3
linha1 item4
linha1 item5
linha2 item1
linha2 item2
linha2 item3
linha2 item4
linha2 item5
linha3 item1
linha3 item2
linha3 item3
linha3 item4
linha3 item5
linha4 item1
linha4 item2
linha4 item3
linha4 item4
linha4 item5



Essa construção resolveria o problema da distribuição entre 2 arquivos?


[]'s
Itamar
George Robinson george.robinson.br@gmail.com [shell-script]
2017-07-06 13:02:59 UTC
Permalink
Olá Itamar,

Essa correlação ficou perfeita. Com isso já tenho a correlação entre hosts
e possíveis senhas. O que vou evoluir agora é a execução de comandos a
partir de um login.

Conseguindo, vou postar aqui a construção do script a fim de compartilhar
com todos, caso venha ser útil
Post by ***@yahoo.com.br [shell-script]
George,
Não vou entrar no mérito do código sobre as conexões ou da tarefa do
script.
Vou me concentrar na repetição de dois arquivo onde é preciso fazer a
Tendo o arquivo lista1.txt
$ cat lista1.txt
linha1
linha2
linha3
linha4
E o arquivo lista2.txt
$ cat lista2.txt
item1
item2
item3
item4
item5
$ while read linha;do (while read item;do echo $linha $item;done <
lista2.txt) ;done < lista1.txt
linha1 item1
linha1 item2
linha1 item3
linha1 item4
linha1 item5
linha2 item1
linha2 item2
linha2 item3
linha2 item4
linha2 item5
linha3 item1
linha3 item2
linha3 item3
linha3 item4
linha3 item5
linha4 item1
linha4 item2
linha4 item3
linha4 item4
linha4 item5
Essa construção resolveria o problema da distribuição entre 2 arquivos?
[]'s
Itamar
--
George Robinson
Analista de Suporte
Tel: +55 (21) 97449-8138
George Robinson george.robinson.br@gmail.com [shell-script]
2017-07-06 23:15:02 UTC
Permalink
Pessoal,

Eu consegui evoluir no script, porém estou achando que ele está muito lento
para executar os procedimentos. Testei apenas com 3 hosts e o tempo está
muito elevado. Então resolvi mudar para um modelo mais simples, onde eu
valido dois arquivos, linha a linha (sem testar possíveis correlações).

No momento está assim:

hosts.txt:
host1
host2
host3

sehas.txt
senhahost1
senhahost2
senhahost3

arquivo de validação:

#Variaveis
HOSTS=$(cat /root/temp/hosts.txt)
PWDS=$(cat /root/temp/pws.txt)
DATA=`ls -lct /etc | tail -1 | awk '{print $6, $7, $8}'`

# Comando a ser executado
####### Contador para ler o arquivo de senhas linha a linha #######
i=0
for pd in $PWDS; do
pws[$i]=$pd;
i=`expr $i + 1`
done

####### Contador para ler o arquivo de hosts linha a linha e testar a senha
usando o script expect #######
### Eh passado como parametro o servidor ($j) e a senha do mesmo ($pws)
i=0
for j in $HOSTS; do
/root/temp/pwtest.exp $j ${pws[$i]} ${DATA}
i=`expr $i + 1`
done

Arquivo do expect para receber as variaveis pwtest.exp:

######### Variaveis #########
set timeout 5
set HOST [lindex $argv 0]
set PASS [lindex $argv 1]
set DATA [lindex $argv 2]
log_user 1

## Inicializa a conexao SSH
spawn -noecho ssh -q -o StrictHostKeyChecking=no root@$HOST
send "$PASS\r"
expect " \n"
send_user "$DATA\r"
#expect -re "\n(\[^\r]*)\r" ;
expect " \n"
send "exit\r"

O que acontece é que na hora de tratar a variável data, só vem pra mim a
primeira parte da data:

[***@br001vs0246 temp]# ls -lct /etc | tail -1 | awk '{print $6, $7, $8}'
Mar 1 2016

Porém, dentro do script, só vem "Mar" como valor. Alguém saberia dizer como
eu concateno esses valores formando uma string?

Muito obrigado!
Post by George Robinson ***@gmail.com [shell-script]
Olá Itamar,
Essa correlação ficou perfeita. Com isso já tenho a correlação entre hosts
e possíveis senhas. O que vou evoluir agora é a execução de comandos a
partir de um login.
Conseguindo, vou postar aqui a construção do script a fim de compartilhar
com todos, caso venha ser útil
Post by ***@yahoo.com.br [shell-script]
George,
Não vou entrar no mérito do código sobre as conexões ou da tarefa do
script.
Vou me concentrar na repetição de dois arquivo onde é preciso fazer a
Tendo o arquivo lista1.txt
$ cat lista1.txt
linha1
linha2
linha3
linha4
E o arquivo lista2.txt
$ cat lista2.txt
item1
item2
item3
item4
item5
$ while read linha;do (while read item;do echo $linha $item;done <
lista2.txt) ;done < lista1.txt
linha1 item1
linha1 item2
linha1 item3
linha1 item4
linha1 item5
linha2 item1
linha2 item2
linha2 item3
linha2 item4
linha2 item5
linha3 item1
linha3 item2
linha3 item3
linha3 item4
linha3 item5
linha4 item1
linha4 item2
linha4 item3
linha4 item4
linha4 item5
Essa construção resolveria o problema da distribuição entre 2 arquivos?
[]'s
Itamar
--
George Robinson
Analista de Suporte
Tel: +55 (21) 97449-8138 <(21)%2097449-8138>
--
George Robinson
Analista de Suporte
Tel: +55 (21) 97449-8138
itamarnet@yahoo.com.br [shell-script]
2017-07-07 10:32:03 UTC
Permalink
Caro George

Tente usar no lugar de:
DATA=`ls -lct /etc | tail -1 | awk '{print $6, $7, $8}'`

isso por exemplo:
DATA=`ls -lct /etc | tail -1 | awk '{print $6 "-" $7 "-" $8}'`

ou usar "/" no lugar de "-"


O que acontece é que da forma como vc estabelece a variável data com espaço, cada elemento da data é uma variável, e quando usa:
set DATA [lindex $argv 2]



Aqui vc estabelece que apenas o mês é selecionado, já que o dia e o ano estão separados por espaço são considerados outros argumentos.
ou use:


set DATA_MES [lindex $argv 2]

set DATA_DIA [lindex $argv 3]

set DATA_ANO [lindex $argv 4]





send_user "$DATA_MES DATA_DIA DATA_ANO\r"




Acredito que o problema esteja ai


[]'s
Itamar
George Robinson george.robinson.br@gmail.com [shell-script]
2017-07-07 12:42:05 UTC
Permalink
Olá Itamar,

Deu certo!

Porém, o script está executando o comando no servidor de origem do script.

Resumindo, todos os servidores testados estão fazendo o print da variável
extraída no arquivo de validação antes de executar remoto.

=(
Post by ***@yahoo.com.br [shell-script]
Caro George
DATA=`ls -lct /etc | tail -1 | awk '{print $6, $7, $8}'`
DATA=`ls -lct /etc | tail -1 | awk '{print $6 "-" $7 "-" $8}'`
ou usar "/" no lugar de "-"
O que acontece é que da forma como vc estabelece a variável data com
set DATA [lindex $argv 2]
Aqui vc estabelece que apenas o mês é selecionado, já que o dia e o ano
estão separados por espaço são considerados outros argumentos.
set DATA_MES [lindex $argv 2]
set DATA_DIA [lindex $argv 3]
set DATA_ANO [lindex $argv 4]
send_user "$DATA_MES DATA_DIA DATA_ANO\r"
Acredito que o problema esteja ai
[]'s
Itamar
--
George Robinson
Analista de Suporte
Tel: +55 (21) 97449-8138
itamarnet@yahoo.com.br [shell-script]
2017-07-07 13:28:38 UTC
Permalink
George

Isso faz todo o sentido, pois você está definindo o resultado da chamada no servidor na variável e repassando esse resultado já difinido, então é preciso mudar o ponto onde define a variável.


O que recomento é comentar a sua linha da definição da variável DATA,
e no lugar de:
set DATA [lindex $argv 2]



usar:
set DATA [ls -lct /etc | tail -1 | awk '{print $6 "-" $7 "-" $8}']



Não sou especialista na linguagem tcl, mas creio que isso resolveria.


[]'s
Itamar
George Robinson george.robinson.br@gmail.com [shell-script]
2017-07-07 14:04:35 UTC
Permalink
Olá Itamar,

Fiz alguma pesquisa e descobrir que as chamadas funcionam assim em tcl

set DATA [exec ls -lct /etc | tail -1 | awk {{print $7 "/" $6 "/" $8}}]

Mas incrivelmente, a execução ainda está sendo feita em ambiente remoto.

vou tentar algo mandando a saida de um comando para um arquivo txt e em
seguida tentar capturar saída, pois acredito que tratar um dentro de um
arquivo de texto pode ser menos complicado pra mim.

Assim que evoluir aqui eu posto o resultado.
Post by George Robinson ***@gmail.com [shell-script]
George
Isso faz todo o sentido, pois você está definindo o resultado da chamada
no servidor na variável e repassando esse resultado já difinido, então é
preciso mudar o ponto onde define a variável.
O que recomento é comentar a sua linha da definição da variável DATA,
set DATA [lindex $argv 2]
set DATA [ls -lct /etc | tail -1 | awk '{print $6 "-" $7 "-" $8}']
Não sou especialista na linguagem tcl, mas creio que isso resolveria.
[]'s
Itamar
--
George Robinson
Analista de Suporte
Tel: +55 (21) 97449-8138
George Robinson george.robinson.br@gmail.com [shell-script]
2017-07-07 14:05:08 UTC
Permalink
Só corrigindo,

A execução está sendo feita no ambiente local, mesmo após ganhar prompt
remoto.
Post by George Robinson ***@gmail.com [shell-script]
Olá Itamar,
Fiz alguma pesquisa e descobrir que as chamadas funcionam assim em tcl
set DATA [exec ls -lct /etc | tail -1 | awk {{print $7 "/" $6 "/" $8}}]
Mas incrivelmente, a execução ainda está sendo feita em ambiente remoto.
vou tentar algo mandando a saida de um comando para um arquivo txt e em
seguida tentar capturar saída, pois acredito que tratar um dentro de um
arquivo de texto pode ser menos complicado pra mim.
Assim que evoluir aqui eu posto o resultado.
Post by George Robinson ***@gmail.com [shell-script]
George
Isso faz todo o sentido, pois você está definindo o resultado da chamada
no servidor na variável e repassando esse resultado já difinido, então é
preciso mudar o ponto onde define a variável.
O que recomento é comentar a sua linha da definição da variável DATA,
set DATA [lindex $argv 2]
set DATA [ls -lct /etc | tail -1 | awk '{print $6 "-" $7 "-" $8}']
Não sou especialista na linguagem tcl, mas creio que isso resolveria.
[]'s
Itamar
--
George Robinson
Analista de Suporte
Tel: +55 (21) 97449-8138 <(21)%2097449-8138>
--
George Robinson
Analista de Suporte
Tel: +55 (21) 97449-8138
Loading...