Comment envoyer plusieurs commandes à sftp en utilisant une seule ligne


14

La commande suivante envoie une commande à l' sftpaide d'une seule ligne:

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

Comment envoyer plusieurs lignes à l' sftpaide d'une seule ligne. Existe-t-il un moyen d'insérer des retours chariot ou quelque chose pour y parvenir, par exemple:

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

L'idée est de NE PAS utiliser l' sftp -boption où une commande de liste de fichiers externes est chargée.

Réponses:


12

D'après la <<<syntaxe here-string ( ) que vous avez utilisée, je suppose que votre shell l'est bash, vous pouvez donc également utiliser une chaîne avec des caractères d'échappement antislash ( $''):

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

L'alternative portable est ici-document:

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

1
<<<a été introduit en premier par zsh (bien qu'inspiré par rc) et a ensuite été ajouté à ksh93 puis à bash.
Stéphane Chazelas

Merci, @StephaneChazelas. J'ai vraiment besoin de renforcer mes zshcompétences.
manatwork

8

Utilisez l' -b/--batchfileoption pour gérer correctement les erreurs:

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

1
Pour utiliser les variables, changez 'en "
Radnaskela Samot

2

Oui, vous pouvez simplement utiliser echo -e

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

3
echoest très non standard - echo -ene fonctionne pas de la même manière partout, vous devez donc d'abord vérifier. Alternativement, utilisez simplement printfce qui est beaucoup plus portable et devrait fonctionner de la même manière partout.
jw013

1

Il n'est pas nécessaire d'éviter l' -boption pour éviter d'écrire le fichier de commandes sur le disque. En utilisant la substitution de processus, vous pouvez créer le lot à la volée.

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

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

0

Utiliser la commande native sftp

sftp -o PasswordAuthentication = aucun utilisateur @ hôte: / home / myhome / file


Ce que vous n'avez pas remarqué, c'est cela lcdet cdfaites des choses différentes. Vous venez de combiner les chemins en quelque chose qui n'existera pas.
underscore_d

0

Mybru, vous pouvez diriger vos commandes comme ceci:

echo '
    lcd /home
    cd /myhome
    get file
' | sftp -o PasswordAuthentication=no user@host
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.