So senden Sie mehrere Befehle in einer Zeile an sftp


13

Der folgende Befehl sendet einen Befehl an die sftpVerwendung einer Zeile:

sftp -o PasswordAuthentication=no user@host" <<<"lcd /home"

So senden Sie mehrere Leitungen an sftpeine Leitung. Gibt es eine Möglichkeit, Zeilenumbrüche einzufügen oder etwas, um dies zu erreichen, zum Beispiel:

sftp -o PasswordAuthentication=no user@host" <<<"lcd /home\n cd /myhome\n get file"

Die Idee ist, NICHT die sftp -bOption zu verwenden, bei der Befehle für eine externe Dateiliste geladen werden.

Antworten:


12

Aus der von <<<Ihnen verwendeten here-string ( ) -Syntax schätze ich, dass Ihre Shell so ist bash, dass Sie auch Zeichenfolgen mit umgekehrten Schrägstrichen ( $'') verwenden können:

sftp -o PasswordAuthentication=no user@host <<< $'lcd /home\n cd /myhome\n get file'

Die tragbare Alternative ist hier-Dokument:

sftp -o PasswordAuthentication=no user@host <<END
lcd /home
cd /myhome
get file
END

1
<<<wurde zuerst von zsh eingeführt (obwohl inspiriert von rc) und später zu ksh93 und dann zu bash hinzugefügt.
Stéphane Chazelas

Vielen Dank, @StephaneChazelas. Ich muss wirklich meine zshFähigkeiten stärken .
Manatwork

8

Verwenden Sie die -b/--batchfileOption für eine ordnungsgemäße Fehlerbehandlung:

 printf '%s\n' 'lcd /home' 'cd /myhome' 'get file' | sftp -b - user@host

1
Um Variablen zu verwenden, ändern Sie "zu"
Radnaskela Samot

2

Ja, Sie können nur verwenden echo -e

echo -e "lcd /home\ncd /myhome\nget file" | sftp user@host

3
echoist sehr ungewöhnlich - echo -efunktioniert nicht überall gleich, also müsstest du zuerst nachsehen. Alternativ können Sie auch nur das verwenden, printfwas viel tragbarer ist und überall gleich funktionieren sollte.
jw013

1

Es ist nicht erforderlich, die -bOption zu umgehen, um das Schreiben der Stapeldatei auf die Festplatte zu vermeiden. Mit der Prozessersetzung können Sie die Charge im laufenden Betrieb erstellen.

batch() {
  echo lcd /home
  echo cd /myhome
  echo get file
}

sftp -b <(batch) -o PasswordAuthentication=no user@host

0

Verwenden Sie den nativen Befehl sftp

sftp -o PasswordAuthentication = kein Benutzer @ Host: / home / myhome / file


Was du nicht bemerkt hast war das lcdund cdmache verschiedene Dinge. Sie haben die Pfade zu etwas kombiniert, das es nicht geben wird.
Underscore_d

0

Mybru, du kannst deine Befehle so leiten:

echo '
    lcd /home
    cd /myhome
    get file
' | sftp -o PasswordAuthentication=no user@host
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.