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.