Ich muss ein Skript schreiben, das auf einem PC mit Centos 7 ausgeführt wird und mit Centos 7 eine Verbindung zu einem anderen PC herstellt Führen Sie mit ssh einen Konsolenbefehl aus, z. B. „ls -la“, und speichern Sie die Ausgabe in einer Datei, um diese Ausgabe später analysieren zu können.

Ich habe das folgende EXPECT-Skript geschrieben:

ssh_connection.exp:

#!/usr/bin/expect -f set timeout 120 spawn ssh [email protected] expect "assword:" send "PASSWORD\r" expect "prompt#" sleep 5 puts "Executing ls -la" send "ls -la\r" sleep 10 puts "Executing ps -af" puts "ps -af\r" sleep 10 puts "Closing the ssh session\r" send "exit\r" 

Dieses Skript stellt über ssh eine korrekte Verbindung zum Computer mit IP = 129.0.0.10 her und zeigt die Meldungen auf dem Bildschirm an Dies wird bei „Puts“ angezeigt: Ausführen von ls -la Ausführen von ps -af Schließen der SSH-Sitzung

Das Ergebnis der Ausführung der Befehle, die ich mit send sende, wird jedoch nicht angezeigt:

ls -la ps -af 

Was ist mit diesem Skript falsch?

Wie kann ich die Ausgabe der vorherigen Befehle in einer Datei speichern, um sie später mit einem Bash analysieren zu können? Skript oder ein C-Programm?

Kommentare

  • Verwenden Sie einfach einen sta ndard ssh Befehl mit ssh Schlüsseln und einem Heredoc
  • Es scheint, dass Sie Dinge zu kompliziert machen. Sie müssen Expect nicht verwenden, um Inhalte über ssh zu automatisieren.
  • Haben Sie einen Befehl wie spawn ssh [email protected] ls -la>Ls ausprobiert?
  • Führen Sie Ihr Skript mit aus expect -d ssh_connection.exp und sehen, wo die Probleme liegen. Als erstes empfehle ich ', alle Schlafzustände durch expect "prompt#"
Antwort

Sie müssen dazu nicht expect verwenden. Die ssh kann zusätzliche Argumente für Befehle annehmen, die Sie über die SSH-Verbindung ausführen möchten.

Schritt 1

Richten Sie ein SSH-Schlüsselpaar ein (google it) und kopieren Sie dann die SSH Schlüssel zum Remote-Server. Dazu würde ich die Verwendung von ssh-copy-id empfehlen. Siehe meine Antwort auf dieses U & LQ & A mit dem Titel: So kopieren Sie richtig Private Schlüssel von Remote-Servern zu meiner lokalen Maschine, damit ich über ssh eine Verbindung herstellen kann.

Schritt 2

Jetzt mit SSH-Verbindung zu einem Server mithilfe eines Schlüssels Ihr oben genanntes Problem wird zu folgendem:

$ ssh [email protected] "ls -la; ps -af" 

Sie können hier Dokumente (heredocs aka) verwenden . here-docs) , um diese Technik weiter zu verbessern.

$ ssh [email protected] <<EOF > ls -la > ps -af > EOF 

oder fügen Sie die Befehle in eine Datei ein und übergeben Sie sie an ssh:

$ ssh [email protected] < my.cmds 

Kommentare

Antwort

Danke,

Ich habe mein Skript geändert und die Zeile ersetzt:

spawn ssh [email protected]

mit diesem anderen, wie Sie mir sagen:

spawn ssh [email protected] „ls -la; ps -af“

Jetzt sehe ich die auf dem Bildschirm ausgegebenen Befehle und ich kann zu einer Datei umleiten.

Als nächstes habe ich versucht, dieses Skript anzupassen, um einen Befehl auf einem anderen Computer auszuführen, der ein Cisco-ähnlicher Switch ist (es ist nicht Cisco, aber kompatibel).

Das Skript, mit dem ich über ssh eine Verbindung zum Switch herstelle, lautet:

** #! / usr / bin / expected -f

Zeitlimit 120

festlegen

spawn ssh [email protected] „show vlan 500“

erwarten „Assword:“

senden Sie die Eingabeaufforderung „PASSWORD \ r“

erwarten “ # „

sleep 5

setzt“ Schließen der SSH-Sitzung \ r „

send“ exit \ r „**

Dies funktioniert nicht auf dem Switch und ich erhalte die folgende Fehlermeldung:

spawn ssh [email protected] show vlan 501

[email protected] „s Passwort:

imish: ungültige Option -“ c „

Versuchen Sie` imish –help „für mehr Informationen.

send: Spawn-ID exp6 nicht geöffnet

while executing 

„send“ exit \ r „“

(file "./ssh_script_v3.exp" line 7) 

Ich muss also das Expect-Skript verwenden, das den Befehl mit „send“ sendet:

! / usr / bin / expected

spawn ssh [email protected]

erwartet „Assword:“

sendet „Benutzer \ r“

erwartet „>“

sleep 5

send „sh vlan 500 \ r“

sleep 5

send „exit \ r“

Jetzt erhalte ich keine Fehlermeldung, aber es wird nichts auf dem Bildschirm angezeigt.

Ich habe gelesen, dass dies Dies geschieht, weil Linux- und UNIX-Systeme ihre Ausgabe automatisch puffern, wenn sie nicht interaktiv ausgeführt werden. Ich denke, dass Expect die Programme mithilfe von „Unbuffer“ zu der Annahme bringen kann, dass sie interaktiv ausgeführt werden, aber ich weiß nicht, wie man „Unbuffer“ mit „Send“ verwendet. Meine Versuche, dies zu tun, funktionieren nicht.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.