Permissão negada ao tentar executar um script que usa 'sshpass'

1

A idéia é fazer este script rodar sem precisar digitar senhas dos hosts (escrito no arquivo Hosts.txt ). No momento, quando estou executando isso, recebo uma Permission denied, please try again. como resposta.

#!/bin/bash

[[ -z "" ]] && OUT_FILE="WhereTheAnswearIsGoing.txt" || OUT_FILE=""
[[ -z "" ]] && IN_FILE="Hosts.txt" || IN_FILE=""

while IFS= read -r host; do
        indication="$(sshpass -pfootbar ssh -p 2222 -o StrictHostKeyChecking=no -n "$host" 'who -b' | awk '{print $(NF-1)" "$NF}')"
        printf '%-14s %s\n' "$indication" "$host" >> "$OUT_FILE"
done < "$IN_FILE"

Desculpe se esta pergunta não está clara, mas eu não sei muito sobre coisas como essas.

    
por Ludvig 14.12.2017 / 10:53

1 resposta

5

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
    
por pa4080 14.12.2017 / 13:57