Em vez de criar seus próprios scripts, recomendamos o uso de pssh . Ele tem recursos internos para passar a senha para ssh, paralelizar o processo, tratamento de erros e assim por diante. É uma boa roda, não há necessidade de inventar outra.
Eu iniciei um novo contrato e preciso ter uma conta ativa em quase 200 servidores. A segurança bloqueia as contas após 30 dias de inatividade, bem como se você não fizer login dentro de 1 hora depois de desbloquear a conta.
Para impedir que tudo seja bloqueado, gostaria de criar um script que percorra a lista de servidores, efetue login com meu nome de usuário e senha e, em seguida, efetue logout.
Estamos executando o RHEL 5 na maioria das máquinas, com alguns OEL 6s também (principalmente o RHEL5).
Ir para o tópico continua me trazendo para o tópico keygen do SSH (que nós temos / usamos), mas eu quero que minha conta genérica não fique bloqueada o tempo todo nos outros servidores, no caso de problemas de rede onde eu tenho para ir fisicamente e fazer o login.
Em vez de criar seus próprios scripts, recomendamos o uso de pssh . Ele tem recursos internos para passar a senha para ssh, paralelizar o processo, tratamento de erros e assim por diante. É uma boa roda, não há necessidade de inventar outra.
Suponho que você tenha um usuário com nome de usuário como user1 em todas as 200 máquinas.
Primeiro, crie uma chave ssh pública em sua máquina (digamos, máquina 1)
ssh-keygen -t rsa
Você será perguntado por uma senha que será solicitada a digitar na primeira vez que executar qualquer comando ssh após cada login. Isso significa que, para vários comandos ssh ou scp , você só precisará inseri-lo uma vez. No entanto, você pode deixá-lo vazio para ter acesso totalmente sem senha.
Se você estiver em uma rede, todos os seus endereços IP estarão disponíveis em /etc/hosts .
Você pode obter a lista de endereços IP ou nomes de host e salvá-los em um arquivo apenas com os nomes de host.
Meu IPlistfile.txt é como abaixo.
192.168.1.11
192.168.1.12
Depois de gerar sua chave pública, copie-a (como user1 ) para cada computador da sua rede.
while read ip; do
ssh-copy-id -i ~/.ssh/id_rsa.pub user1@$ip
done < IPlistfile.txt
Você terá que inserir manualmente a senha para cada IP (a menos que você use uma das soluções abaixo para esta etapa também), mas uma vez feito isso, você poderá executar o script sem usar senhas em todas as etapas. essas máquinas.
Agora, você pode ter um script para ssh em todas as máquinas e fazer logout periodicamente.
while read ip; do
ssh user1@$ip
exit
done < IPlistfile.txt
O script acima pode ser colocado em cronjob e pode ser executado periodicamente para efetuar login e logout de servidores como desejar, sem bloquear a conta do usuário.
Por favor, consulte a resposta à minha pergunta intitulada script para automatizar o scp em uma rede e ele lhe dará mais ideias.
As chaves RSA seriam a melhor solução, no entanto, se você não puder usá-las, precisará fazer alguns hacks feios com expect da seguinte forma:
#!/usr/bin/expect
set timeout 60
#set maxSpawn 20
if { $argc >= 2 } {
set user [lindex $argv 0]
set pass [lindex $argv 1]
set cmd ""
for {set i 2} {$i < $argc} {incr i 1} {
append cmd "[lindex $argv $i] "
}
#puts $cmd
} else {
exit
}
log_user 0
spawn sh -c "$cmd"
log_user 1
expect {
"$user:" {
send "$pass\n";
#exp_continue;
expect {
"Sorry" { exit }
"assword:" { send "$pass\n"; exp_continue; }
"$user: " { send "$pass\n"; exp_continue; }
timeout { exit }
eof { exit }
default { exp_continue; }
}
}
"assword:" {
send "$pass\n";
#exp_continue;
expect {
"Sorry" { exit }
"assword:" { send "$pass\n"; exp_continue; }
"$user: " { send "$pass\n"; exp_continue; }
timeout { exit }
eof { exit }
default { exp_continue; }
}
}
"(yes/no)?" {
send "yes\n";
exp_continue
}
"\[Y/n\]\?" {
send "y\n";
exp_continue
}
eof { exit }
timeout { exit }
default { exp_continue; }
}
Salve-o como ssh.exp e execute como:
ssh.exp your_username your_password ssh server exit