
Ich muss ein Skript schreiben, damit meine Kollegen und ich verschiedene Dienste auf mehreren Servern neu starten können. Wir stellen alle über LDAP eine Verbindung zu den Servern her, daher möchte ich, dass mein Skript unsere LDAP-Benutzer mit dem Server verbindet und dann sudo verwendet, um die Dienste neu zu starten (ich kann auf jedem Server ein Skript schreiben, um alle benötigten Dienste neu zu starten). Im Moment führt das Skript einfach einen Befehl wie diesen aus:
ssh -t user@host "sudo service XXX restart"
Das Problem besteht darin, dass das Skript für jeden Server zweimal nach dem Benutzerkennwort fragt (einmal für die SSH-Verbindung und zweimal für den Sudo-Befehl). Meine erste Vermutung war, den Benutzer mit read -s -p nach Login und Passwort zu fragen und dann die Variable zu verwenden, um sich automatisch mit SSH anzumelden. Anscheinend ist Expect die Möglichkeit, dies zu tun, aber ich habe keine Möglichkeit gefunden, in einem Expect-Skript sicher nach einem Passwort zu fragen oder es in einem Bash-Skript abzufragen und die Variable sicher im Expect-Skript zu übergeben.
Ich habe nach Lösungen wie pssh und Cluster-SSH gesucht, die zu funktionieren scheinen, aber nicht mit sudo. Ich verstehe, dass dies am besten mit SSH-Schlüsseln funktioniert, aber da mehrere Benutzer das Skript verwenden müssen, würde ich gerne den LDAP-Login/das LDAP-Passwort verwenden.
Antwort1
Wie Glenn in den Kommentaren vorgeschlagen hat, besteht die richtige Vorgehensweise darin, stty zu verwenden:
# grab the password
stty -echo
send_user -- "Password for $user@$host: "
expect_user -re "(.*)\n"
send_user "\n"
stty echo
set pass $expect_out(1,string)
#... later
send -- "$pass\r"