Идея состоит в том, чтобы запустить этот скрипт без необходимости вводить какие-либо пароли хостов (записано в файле 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"
Извините, если этот вопрос неясен, но я не знаю много о таких вещах.
Это смотрит сообщение 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