проверка пароля в обращении сценария удара ожидает

Фон: Я должен скопировать файл с одного сервера к более чем 100 серверам в тестовой среде. после того как файл копируется, он требует, чтобы иметь полномочия на файле, изменился/проверил. Это все серверы Linux. у большинства из них есть тот же пароль для входа в систему, но некоторые не могут.

Я нуждаюсь в помощи с созданием цикла в моем сценарии удара. Это на самом деле обращается, Ожидают. Область, которую я хочу сделать 'лучше' или зафиксировать, несколько вещей

  • часть, где это ожидает пароль. (* раздел), это должно выйти из сценария после 1 неудавшейся попытки пароля и вывести IP к текстовому файлу под названием "fail.txt"
  • идеально должна быть часть, которая также выводит IP к fail.txt, если нет никакого соединения с сервером.

Я пытался записать часть пароля, думая, что это - цикл, но я не действительно уверен, является ли тот метод взглядов соглашением. Я пытался просто добавить, что другой "ожидает Пароль": думая, что, если это получает подсказку во второй раз, для выхода, но мне пришлось нелегко с тем, чтобы заставлять это работать.Спасибо!

#!/bin/bash
while read ip; do

sleep 2
expect <<- DONE
        set timeout 1
        spawn scp yoman.txt root@$ip:/felixtemp
                if above command fails, dump the IP to fail.txt, otherwise continue
        expect yes/no { send yes\r }
        expect Password: { send aaaaaa\r } #if this is good, continue the script from *****
                else                                     #exit the script
                expect Password: { send 033\r }
                expect # { send "echo 'password failed'\r" }
                && dump to a text file called fail.txt
*****   expect # { send "exit\r\r" }
        sleep 1

        set timeout 1
        spawn ssh root@$ip
        sleep 2
        expect yes/no { send yes\r }
        sleep 2
        expect Password: { send aaaaaa\r }
        sleep 5
        expect # { send "cd /felixtemp\r" }
        expect # { send "chown informix:informix yoman.txt\r" }
        expect # { send "chmod 775 yoman.txt\r" }
        expect # { send "sum yoman.txt | grep 10350 && echo 'transfer good' || echo 'transfer bad'\r" }
        expect # { send exit\r }
        sleep 1
DONE

done < ip.txt
2
задан 21 April 2015 в 18:54
3 ответа

ನೀವು ನೂರಾರು ಲಿನಕ್ಸ್ ಸರ್ವರ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಬೇಕಾದರೆ ಈ ಕಾರ್ಯಗಳನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಲು ನೀವು ಸಂರಚನಾ ನಿರ್ವಹಣಾ ಸಾಧನವನ್ನು ಬಳಸಬೇಕು. ತುಂಬಾ ಸರಳವಾದ ಸಂರಚನಾ ನಿರ್ವಹಣಾ ಸಾಧನವು ಉತ್ತರಿಸಬಲ್ಲದು,ನಿರ್ವಹಿಸಲಾದ ವ್ಯವಸ್ಥೆಯ ಏಕೈಕ ಅವಶ್ಯಕತೆ ಪೈಥಾನ್ 2.4 ಅಥವಾ ಹೆಚ್ಚಿನದು ( http://docs.ansible.com/intro_installation.html#managed-node-requirements ).

ನಿಮ್ಮ ಸಮಸ್ಯೆಯನ್ನು ಉತ್ತರಿಸಬಹುದಾದ ರೀತಿಯಲ್ಲಿ ಪರಿಹರಿಸಲಾಗಿದೆ:

1) ನೀವು ಎಲ್ಲಾ ಹೋಸ್ಟ್‌ಗಳಿಗೆ ಡೀಫಾಲ್ಟ್ ಪಾಸ್‌ವರ್ಡ್ ಮತ್ತು ಕೆಲವು ಹೋಸ್ಟ್‌ಗಳಿಗೆ ಇತರ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಬಹುದಾದ ಹೋಸ್ಟ್‌ಗಳ ಪಟ್ಟಿಯನ್ನು ವಿವರಿಸಿ

[hosts_list]
172.17.0.101 ansible_ssh_user=root ansible_ssh_pass=password
172.17.0.102 ansible_ssh_user=root ansible_ssh_pass=oldpassword
172.17.0.103
172.17.0.104

[hosts_list:vars]
ansible_ssh_user=root ansible_ssh_pass=default_password

2) ನೀವು ನಿರ್ವಹಿಸಿದ ನೋಡ್‌ಗಳಲ್ಲಿ ಕಾರ್ಯಗತಗೊಳಿಸಲು ಬಯಸುವ ಕಾರ್ಯಗಳನ್ನು ಒಳಗೊಂಡಿರುವ ಸರಳ ಪ್ಲೇಬುಕ್ ಅನ್ನು ವಿವರಿಸಿ

    root@node1:~# cat play.yoman
---
- hosts: hosts_list
  tasks:
  - name: "Build hosts file"
    copy: src=/root/yoman.txt dest=/tmp/felixtemp owner=user group=adm mode=0755

3) ಪ್ಲೇಬುಕ್ ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಿ ಮತ್ತು ಫಲಿತಾಂಶವನ್ನು ಪರಿಶೀಲಿಸಿ

root@node1:~# ansible-playbook -i hosts_list play.yoman

PLAY [hosts_list] *************************************************************

GATHERING FACTS ***************************************************************
fatal: [172.17.0.104] => SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue
fatal: [172.17.0.103] => SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue
ok: [172.17.0.101]
fatal: [172.17.0.102] => Authentication failure.

TASK: [Build hosts file] ******************************************************
ok: [172.17.0.101]

PLAY RECAP ********************************************************************
           to retry, use: --limit @/root/play.yoman.retry

172.17.0.101               : ok=2    changed=0    unreachable=0    failed=0
172.17.0.102               : ok=0    changed=0    unreachable=1    failed=0
172.17.0.103               : ok=0    changed=0    unreachable=1    failed=0
172.17.0.104               : ok=0    changed=0    unreachable=1    failed=0

ಕಾರ್ಯವು ಕಾರ್ಯಗತಗೊಳಿಸಿದ ಸರ್ವರ್‌ನ ಪಟ್ಟಿಯನ್ನು ಮತ್ತು ಕಾರ್ಯವು ವಿಫಲವಾದ ಸರ್ವರ್‌ಗಳ ಪಟ್ಟಿಯನ್ನು ನೀವು ಪಡೆಯುತ್ತೀರಿ (ತಲುಪಲಾಗದ ಸರ್ವರ್ ಅಥವಾ ತಪ್ಪು ಪಾಸ್‌ವರ್ಡ್). ಫೈಲ್, ಅದರ ಅನುಮತಿ ಮತ್ತು ವಿಷಯವನ್ನು ಬದಲಾಯಿಸದ ಸರ್ವರ್‌ನ ಉಪವಿಭಾಗವನ್ನು ಸಹ ನೀವು ಪಡೆದುಕೊಳ್ಳುತ್ತೀರಿ ಏಕೆಂದರೆ ಅವುಗಳು ಈಗಾಗಲೇ ನವೀಕರಿಸಲ್ಪಟ್ಟಿವೆ

1
ответ дан 3 December 2019 в 12:47

Почему не вы используете sshpass ?


Цикл с таблицей:

tab=(
     1.2.3.4
     4.3.2.1
     ...
);

for (( i = 1; i < ${#tab[*]}; i++ )) {
        echo ${tab[i]};
        ...
}

Вам потребуются некоторые условия для определенных IP-адресов, чтобы установить правильный пароль.


SCP

sshpass -p $PASSWORD scp -o StrictHostKeyChecking=no $FILE $USER@$HOST:$PATH

Согласно manpage возвращаемые значения:

0 Успех

1 Неверный аргумент командной строки

2 Указаны конфликтующие аргументы

3 Общая ошибка времени выполнения

4 Нераспознанный ответ от ssh (ошибка синтаксического анализа)

5 Неверный / неверный пароль

6 Открытый ключ хоста неизвестен. sshpass завершает работу без подтверждения новый ключ.

Полезно, если вы хотите вывести $ HOST в файл с возвращаемым значением:

sshpass -p $PASSWORD scp -o StrictHostKeyChecking=no $FILE $USER@$HOST:$PATH

if [ $? -ne 0 ]
then
    echo $HOST:$? >> file.txt;
fi

SSH

Для отправки команд:

sshpass -p $PASSWORD ssh -o StrictHostKeyChecking=no $USER@$HOST $CMD
0
ответ дан 3 December 2019 в 12:47

Ни один из предыдущих комментариев не использовался внутри сценария bash, как спрашивал ОП.

Недавно мне нужно было выполнить аналогичную задачу, поэтому вот мое решение с использованием ожидания:

expect <<- DONE
    set timeout 1
    spawn scp yoman.txt root@${ip}:/felixtemp
        while 1 {
            expect {
                "no)?"   {
                    send "yes\n"
                }
                "denied" {
                    log_file fail.txt
                    send_log "Couldn't log in to ${ip}.\n";
                    exit 1
                }
                "assword:" {
                    send "${password}\n"
                }
                "100%" {
                     break;
                }

            }
        }
    expect eof
DONE

Объяснение синтаксиса ожидания:

  • в то время как 1 { }: создает бесконечный цикл. Внутри цикла я определяю разные случаи ожидания.
  • log_file fail.txt: создайте файл с именем fail.txt.
  • send_log "text": отправляет текст в log_file.
  • break: прерывает бесконечный цикл и завершает раздел ожидания.
1
ответ дан 14 December 2019 в 19:05

Теги

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