Wie übergebe ich eine Variable an sftp?

1

Ich versuche, während einer SFTP-Verbindung einen Dateinamen mit einem String abzugleichen, der im Grunde genommen ein Zeitstempel ist.

Wie kann ich einen Teil des Dateinamens abgleichen? Ich kann keine Variable innerhalb einer SFTP-Verbindung deklarieren. Und ich kann auch keine zuvor in Bash erstellte Variable aufrufen.

Edit: Dinge, die ich versucht habe

yr=$(date + "%Y")
sftp -i key.pem un@server
sftp> echo $yr
Invalid command.
sftp> $yr
Invalid command.

neue Schale

sftp -i key.pem un@server
sftp> test=$(date +"%Y")
Invalid command.

Versuchte diese 2

einfachcodieren
quelle
1
Hallo! Es wäre hilfreich, wenn Sie Ihre Frage so bearbeiten würden, dass der genaue von Ihnen verwendete Befehl angezeigt wird, damit wir feststellen können, was Sie versucht haben und was genau nicht funktioniert.
Dhag
SFTP ist ein Protokoll. Kann auf verschiedene Arten verwendet werden
Ed Heal
hinzugefügt im Code von dem, was ich versucht habe
einfach 10.09.15
Verwenden Sie expect- das sollte das Geschäft für Sie erledigen
Ed Heal
Wenn ich benutze expect, muss ich wahrscheinlich ein paar expectund sendZeilen machen, oder? Oder kann ich nur expecteinmal für den Zeitstempel verwenden?
Simplycoding

Antworten:

2

Das sftpProgramm ist eine eigene Sache; Es ist völlig unabhängig von und unabhängig von bash, das den Wert seiner Variablen kennt und expandieren würde $yr. Im Allgemeinen können Sie keine bash-Variablen ohne anwendungsspezifische Kommunikationsmethoden an solche externen Programme übergeben.

Wenn Sie nur eine Datei mit $yrdem Dateinamen hochladen oder herunterladen möchten , können Sie scpstattdessen Folgendes verwenden:

yr=$(date +%Y)
scp -i key.pem un@server:/some/long/path/that/includes/$yr .

zum Download oder

scp -i key.pem some_local_file un@server:/some/long/$yr/path

zum Hochladen.

Wenn Sie aus irgendeinem Grund eine sftpbestimmte Verwendung wirklich benötigen , können Sie dynamisch eine Batch-Datei erstellen, z

sftp -i key.pem -b - un@server <<< "get /some/path/with/$yr"
Tom Hunt
quelle
Ja, ich habe nachgesehen, scpaber es ist auf dem Server nicht erlaubt. Ich schaue in expectden Moment
einfach 10.9.15
expectkann viel, aber es ist im Grunde genommen ein Hack, der verwendet wird, um Skripte für Programme zu erstellen, die nicht für Skripte geeignet sind. Wenn Sie eine andere Methode verwenden können, z. B. die -bOption zu SFTP, ist es in der Regel einfacher. (In Klammern, wie ist Ihr Server eingerichtet, dass SFTP erlaubt ist, aber SCP nicht?)
Tom Hunt
Es ist nicht mein Server, aber alles, was ich im Moment weiß, ist, dass scpdas nicht erlaubt ist. Könnten Sie erklären, was aht -btun würde? Mit Blick auf documenation, seine Wirkung ist , dass sie benachrichtigt werden, wenn Jobs im Hintergrund laufen beenden
simplycoding
Soll ich in einem Here-Doc eine Variable setzen können? Oder würde das den gleichen Fehler wie vorher auslösen?
Simplycoding
Sie können Variablen entweder in Heredocs oder Herestrings erweitern (Herestring ist die oben verwendete Syntax).
Tom Hunt
2

sftpist ein eigenständiges Programm, nicht Teil der Shell. Die Shell-Syntax wird nicht verstanden. Es verfügt nicht über Funktionen wie Variablenerweiterungen und bedingte Anweisungen.

Der einfachste Weg, komplexe Dinge über SFTP zu erledigen, ist die Verwendung von SSHFS . SSHFS ist ein Dateisystem, das SFTP verwendet, um ein entferntes Dateisystem als lokales Dateisystem anzuzeigen. Auf dem Client benötigt SSHFS FUSE , das auf den meisten modernen Unices verfügbar ist. Auf dem Server erfordert SSHFS SFTP. Wenn der Server SFTP zulässt, können Sie SSHFS damit verwenden.

mkdir server
sshfs -o IdentityFile=key.pem un@server: server
cp "server/dir/myfile-$(date +%Y).txt" /local/path
fusermount -u server
Gilles
quelle