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.

Radnaskela Samot
quelle

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
Mann bei der Arbeit
quelle
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
Stéphane Chazelas
quelle
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
utopisch
quelle
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
ceving
quelle
0

Verwenden Sie den nativen Befehl sftp

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

Markomafs
quelle
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
Paque Mann
quelle