Parece que a mensagem Permission denied, please try again.
é gerada pelo cliente SSH. A senha deve ser citada para escapar do significado especial de caracteres como $
, !
, etc. ( ref ) :
sshpass -p 'footbar' ...
Ou você pode usar um arquivo onde a senha seja armazenada ( source ):
sshpass -f "/path/to/passwordfile" ...
No entanto, lembro-me, este é um script da minha resposta anterior, onde mencionei: "Nota aqui é assumido que há ~/.ssh/config
arquivo e parâmetros adicionais como -p 2222
não são necessários ( referência ). " O que eu quis dizer foi:
A melhor solução é (1) configurar a autenticação SSH baseada em chave, (2) criar o arquivo ~/.ssh/config
e (3) modificar o script para trabalhar com essa configuração.
1. Autenticação SSH baseada na chave de configuração ( source ).
-
Como gerar chaves RSA e não insira a senha :
mkdir ~/.ssh chmod 700 ~/.ssh ssh-keygen -t rsa -b 4096 chmod 600 ~/.ssh/id_rsa
-
Transfira a chave do cliente para cada host (por favor, note as marcas de aspas):
ssh-copy-id "<username>@<host> -p <port_nr>"
-
Agora você deve conseguir se conectar ao (s) servidor (es) sem senha:
ssh <username>@<host> -p <port_nr>
-
Quando isso funcionar, você poderá desabilitar a autenticação de senha (que é um método menos seguro) editando o arquivo
/etc/ssh/sshd_config
de cada máquina host dessa maneira:#PasswordAuthentication yes PasswordAuthentication no
2. Crie o arquivo ~/.ssh/config
. (Leia também: Como eu adiciono várias máquinas com a mesma configuração para ~ / .ssh / config? )
-
O conteúdo do arquivo
~/.ssh/config
poderia ser assim (host-i
é o objeto de sua escolha):Host host-1 HostName <domain-or-IP-address> IdentityFile ~/.ssh/id_rsa User <username> Port 2222 # other parameters... Host host-2 HostName <domain-or-IP-address> IdentityFile ~/.ssh/id_rsa User <username> Port 2222 # other parameters... Host host-3...
-
Altere as permissões do arquivo:
chmod 600 ~/.ssh/config
-
Agora você deve poder se conectar a cada um desses hosts por um comando como:
ssh host-1
3.A. Você pode continuar usando o script acima com uma pequena modificação:
#!/bin/bash
[[ -z "" ]] && OUT_FILE="WhereTheAnswearIsGoing.txt" || OUT_FILE=""
[[ -z "" ]] && IN_FILE="Hosts.txt" || IN_FILE=""
while IFS= read -r host; do
indication="$(ssh -n "$host" 'who -b' | awk '{print $(NF-1)" "$NF}')"
printf '%-14s %s\n' "$indication" "$host" >> "$OUT_FILE"
done < "$IN_FILE"
Nesse caso, o arquivo Hosts.txt
deve ser:
host-1
host-2
host-3
3.B. Ou você pode modificar o script de maneira mais geral:
#!/bin/bash
# Collect the user's input, and if it's empty set the default values
[[ -z "" ]] && OUT_FILE="WhereTheAnswearIsGoing.txt" || OUT_FILE=""
# Provide the list of the hosts as an array
HOSTS=("host-1" "host-2" "host-3")
for host in "${HOSTS[@]}"; do
indication="$(ssh -n "$host" 'who -b' | awk '{print $(NF-1)" "$NF}')"
printf '%-14s %s\n' "$host" "$indication" >> "$OUT_FILE"
done