Назад | Перейти на главную страницу

Автоматизировать вход по SSH с паролем

Прежде чем этот вопрос будет удален, я уже прочитал этот, этот, этот, и этот; и большинство этих ссылок не отвечают на мой вопрос; так как:

  1. Мне нужен ключ И пароль
  2. У меня несколько серверов (50+), и я не могу позволить себе изменить их все без пароля.
  3. То же самое верно для открытых и закрытых ключей, это займет слишком много времени для каждого сервера.

Я попробовал sshpass, но это как-то испортило мой вход по SSH с некоторыми из моих устройств (мне пришлось сбросить known_hosts сервера). Если бы я мог изменить свой сценарий для правильной работы с sshpass, это было бы возможным решением.

Я надеюсь найти какую-то опцию ssh, которая автоматически вводит пароль; что-то вроде:

ssh -o ConnectTimeout=5 -p 'USER_PASSWORD' USER@192.168.0.*** sensors | grep Core >> sensors.txt

Или что-то с небольшим скриптом, который может распознавать и автоматически заполнять (например, макрос или что-то в этом роде?) Пароль (в любом случае половина серверов имеет одинаковый PWD).

Моя вторая проблема заключается в том, что я заметил, что сценарий иногда зависает (Ping подключается, а SSH - нет), что требует от меня ожидания тайм-аута или перезапуска сценария. Не уверен, проблема в сети или что-то в этом роде, но если я перезапущу ее, иногда она все же проходит.

ConnectTimeout = 5 работает не так, как ожидалось. Сценарий останавливается только тогда, когда сервер отключен (IP-ссылка не установлена). Когда сервер в сети, но openssh не выполняет рукопожатие, скрипт зависает ...

я использовал expect для автоматизации входа в систему без ключа. Вот мой код. Обертка оболочки:

#!/bin/bash
    HOSTNAME=$1
    case `echo ${HOSTNAME:7:1}` in
            d|q)
              ENV='sit'
              PW='pw1'
              ;;
            u)
              ENV='uat'
              PW='pw2'
              ;;
            p)
              ENV='prod'
              PW='pw3';
              ;;
    esac
    # Pass hostname and password to expect script
    ./go.exp $HOSTNAME $PW

Ожидайте сценарий:

#!/usr/bin/expect -f
set hostname [lindex $argv 0];
set password [lindex $argv 1];
spawn ssh your_username@$hostname
expect "*:"
send "$password\n"
send "bash\n"
expect "bash-*"
# The next two lines are prompt customization, it is not necessary
send "export PROMPT_COMMAND='echo -ne \"\\033k\$HOSTNAME\\033\\\\\"'\n"
send "export PS1='\\e\[0;33m\\u\\e\[0;36m@\\e\[0;33m\\h \\e\[0;32m\\w> \\e\[m'\n"
# If you don't need interactive session then you may replace the below with whatever you need
interact

Примечание. Предполагается, что имя пользователя и приглашение везде одинаковы, более того, это небезопасно, потому что пароль передается как arg в открытом тексте и поэтому отображается (например, в ps вывод) другими пользователями