В доступе отказано при попытке запустить скрипт, который использует '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
задан 14 December 2017 в 23:29

1 ответ

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

sshpass -p 'footbar' ...

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

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

enter image description here


Однако я помню, это - сценарий из моего предыдущего ответа, где я упомянул что: "Примечание здесь принято существует ~/.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
6
ответ дан 14 December 2017 в 23:29

Другие вопросы по тегам:

Похожие вопросы: