Verwenden Sie expat, um einen Befehl mit Argumenten zu erzeugen, die Leerzeichen enthalten

8

Ich möchte expect verwenden, um einen einfachen Befehl cat /tmp/id_rsa.pub über ssh auszuführen.

In einer Shell kann ich dieses Wo-Problem ausführen (mit manuell eingegebenem Passwort)

%Vor%

Ich möchte das mit expect automatisieren. Mein expect Skript ist,

%Vor%

Es wird der Fehler bash: cat /tmp/id_rsa.pub: no such file or directory ausgegeben. Es sieht sehr komisch aus. Was könnte die mögliche Ursache sein?

Edit: Nach einigen Tests finde ich das nicht nur im Fall von cat üblich. Wenn das Argument für den erzeugten Befehl im Leerzeichen steht (auch wenn es in den Anführungszeichen steht), hat es ein Problem. Beispiel: Ersetzen Sie cat /tmp/id_rsa.pub durch andere Befehle mit Leerzeichen wie

%Vor%

es klagt mit bash: which java: command not found . Aber wenn das durch pwd ersetzt wird, wie

%Vor%

es funktioniert gut.

    
Richard 20.09.2012, 18:08
quelle

3 Antworten

3

Einfache Anführungszeichen ( ' ) haben im Gegensatz zu sh und anderen kompatiblen Shells keine besondere Bedeutung für Expect.
Dies bedeutet, dass Ihre Anweisung

%Vor%

wird in die folgenden Wörter unterteilt:

  • spawn
  • ssh
  • root@localhost
  • 'cat - nicht bis zum anderen einfachen Zitat.
  • /tmp/id_rsa.pub'

Die Verwendung in sh besteht darin, dies zu einem einzigen Argument zusammenzufassen. In Tcl können Sie entweder doppelte Anführungszeichen ( " ) oder geschweifte Klammern ( {} ) verwenden. In doppelten Anführungszeichen werden Tcl-Variablen ersetzt, während der Inhalt in {} ohne Substitution 1 übergeben wird.

tl; dr Das Expect / Tcl-Äquivalent von shs ' ist {} .

1 A \ , bevor eine neue Zeile noch ersetzt wird.

    
Johannes Kuhn 16.10.2013 12:02
quelle
2

Wie Johannes gesagt hat, funktioniert die Verwendung von ' nicht.
Ich hatte ein ähnliches Problem, aber ich wollte mehr Befehle ausführen und dann immer noch eine Login-Shell bekommen. Ich habe es geschafft mit " :

arbeiten zu lassen %Vor%     
genesys87 05.03.2014 10:33
quelle
0

Ich nehme an, dass Sie eval nicht benötigen. Entfernen Sie es und überprüfen Sie es.

Sehen Sie sich den Beispiel-Link für Beispiele an, um detaillierte Beispiele zur Verwendung von expect zu erhalten. .

Hoffe, das hilft.

    
mtk 20.09.2012 18:14
quelle