fragen stichworte

Kennwort überprüfen in bash-Skript, das auf Expect aufruft

Hintergrund: Ich muss eine Datei von einem Server auf über 100 Server in einer Testumgebung kopieren. Sobald die Datei kopiert wurde, müssen die Berechtigungen für die Datei geändert/überprüft werden. Dies sind alles Linux-Server. Die meisten von ihnen haben das gleiche Passwort für die Anmeldung, andere jedoch nicht.

Ich brauche Hilfe beim Erstellen einer Schleife in meinem Bash-Skript. Es ist eigentlich auf Expect anrufen. Der Bereich, den ich "besser" machen oder reparieren möchte, ist ein paar Dinge

  • der Teil, an dem ein Passwort erwartet wird. (der Abschnitt *) sollte das Skript nach einem fehlgeschlagenen Kennwortversuch beendet und die IP in eine Textdatei mit dem Namen "fail.txt"
  • übertragen werden
  • Im Idealfall sollte ein Teil vorhanden sein, der die IP-Adresse auch in eine fail.txt -Datei kopiert, wenn keine Verbindung zum Server besteht.

Ich habe versucht, das Kennwortstück zu schreiben, wobei ich denke, es ist eine Schleife, aber ich bin mir nicht wirklich sicher, ob diese Denkmethode ein Deal ist. Ich habe nur versucht, ein weiteres "Expect Password:" hinzuzufügen. Ich denke, wenn ich die Aufforderung ein zweites Mal bekomme, um herauszugehen, habe ich es schwer gehabt, das zum Laufen zu bringen. Vielen Dank!

#!/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

antworten

Wenn Sie Hunderte von Linux-Servern verwalten müssen, sollten Sie ein Konfigurationsmanagement-Tool verwenden, um diese Aufgaben auszuführen. Ein sehr einfaches Konfigurationsmanagement-Tool ist möglich, die einzige Voraussetzung für ein Managed System ist Python 2.4 oder höher (http://docs.ansible.com/intro_installation.html#managed-node-requirements).

Ihr Problem wurde mit ansible gelöst:

1) Definieren Sie eine Liste der Hosts, die Sie ein Standardkennwort für alle Hosts und ein anderes Kennwort für einige Hosts definieren können

[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) Definieren Sie ein einfaches Playbook mit den Aufgaben, die Sie auf den verwalteten Knoten ausführen möchten

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) Führen Sie das Playbook aus und überprüfen Sie das Ergebnis

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

Sie erhalten die Liste des Servers, auf dem die Aufgabe ausgeführt wurde, und die Liste des Servers, auf dem die Aufgabe mit den Gründen fehlschlägt (nicht erreichbarer Server oder falsches Kennwort). Sie erhalten auch die Teilmenge des Servers, auf der die Datei, ihre Berechtigung und ihr Inhalt nicht geändert wurden, da sie bereits aktualisiert wurden

Warum verwenden Sie nicht sshpass?


Schleife mit einer Tabelle:

tab=(
     1.2.3.4
     4.3.2.1
     ...
);

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

Sie benötigen einige Bedingungen für bestimmte IP-Adressen, um das richtige Kennwort festzulegen.


SCP

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

Entsprechend der Manpage sind die Rückgabewerte:

0 Success

1 Invalid command line argument

2 Conflicting arguments given

3 General runtime error

4 Unrecognized response from ssh (parse error)

5 Invalid/incorrect password

6 Host public key is unknown. sshpass exits without confirming the new key.

Nützlich, wenn Sie $ HOST in einer Datei mit dem Rückgabewert drucken möchten:

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

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

SSH

So senden Sie Befehle:

sshpass -p $PASSWORD ssh -o StrictHostKeyChecking=no $USER@$HOST $CMD