В доступе отказано при попытке запустить скрипт, который использует 'sshpass'

Идея состоит в том, чтобы этот скрипт выполнялся без необходимости вводить какие-либо пароли узлов (записанные в Hosts.txt файл). Прямо сейчас, когда я запускаю это, я получаю Permission denied, please try again. как ответ.

#!/bin/bash

[[ -z "${1}" ]] && OUT_FILE="WhereTheAnswearIsGoing.txt" || OUT_FILE="$1"
[[ -z "${2}" ]] && IN_FILE="Hosts.txt" || IN_FILE="$2"

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"

Извините, если этот вопрос неясен, но я не знаю много о таких вещах.

1 ответ

Решение

Выглядит сообщение Permission denied, please try again. генерируется клиентом SSH. Пароль должен быть заключен в кавычки, чтобы избежать специального значения символов, таких как $, ! и т. д. ( ссылка):

sshpass -p 'footbar' ...

Или вы можете использовать файл, где хранится пароль ( источник):

sshpass -f "/path/to/passwordfile" ...


Тем не менее, я помню, это сценарий из моего предыдущего ответа, где я упоминал, что: "Примечание здесь предполагается, что есть ~/.ssh/config файл и дополнительные параметры как -p 2222 не нужны ( ссылка). " То, что я имел в виду, было:

Лучшее решение - (1) настроить SSH-аутентификацию на основе ключей, (2) создать ~/.ssh/config файл и (3) изменить скрипт для работы с этой настройкой.

1. Установочный ключ на основе аутентификации SSH ( источник).

  • Генерация ключей RSA и не вводите парольную фразу:

    mkdir ~/.ssh
    chmod 700 ~/.ssh
    ssh-keygen -t rsa -b 4096
    chmod 600 ~/.ssh/id_rsa
    
  • Передайте клиентский ключ каждому хосту (обратите внимание на кавычки):

    ssh-copy-id "<username>@<host> -p <port_nr>"
    
  • Теперь вы сможете подключиться к серверу (ам) без пароля:

    ssh <username>@<host> -p <port_nr>
    
  • Как только это сработает, вы можете отключить аутентификацию по паролю (это менее безопасный метод), отредактировав файл /etc/ssh/sshd_config каждого хоста следующим образом:

    #PasswordAuthentication yes
    PasswordAuthentication no
    

2. Создать ~/.ssh/config файл. (Читайте также: Как добавить несколько машин с одинаковой конфигурацией в ~ /.ssh / config?)

  • Содержание файла ~/.ssh/config может выглядеть так (host-i это объект на ваш выбор):

    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...
    
  • Измените права доступа к файлу:

    chmod 600 ~/.ssh/config
    
  • Теперь вы сможете подключиться к каждому из этих хостов с помощью команды:

    ssh host-1
    

3.A. Вы можете продолжать использовать вышеуказанный скрипт с небольшой модификацией:

#!/bin/bash

[[ -z "${1}" ]] && OUT_FILE="WhereTheAnswearIsGoing.txt" || OUT_FILE="$1"
[[ -z "${2}" ]] && IN_FILE="Hosts.txt" || IN_FILE="$2"

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"

В этом случае Hosts.txt файл должен быть:

host-1
host-2
host-3

3.b. Или вы можете изменить скрипт более общим способом:

#!/bin/bash

# Collect the user's input, and if it`s empty set the default values
[[ -z "${1}" ]] && OUT_FILE="WhereTheAnswearIsGoing.txt" || OUT_FILE="$1"
# 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
Другие вопросы по тегам