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.

Radnaskela Samot
la source

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
homme au travail
la source
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
Stéphane Chazelas
la source
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
utopiabound
la source
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
ceving
la source
0

Utiliser la commande native sftp

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

Markomafs
la source
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
Paque Mann
la source