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