web-dev-qa-db-fra.com

Exécuter la commande dans une connexion sftp via un script

Ceci est une question très basique que je suis tout juste nouvelle à bash et ne pouvais pas comprendre comment faire cela. La recherche sur Google ne m'a malheureusement conduit nulle part.

Mon objectif est de me connecter avec sftp à un serveur, de télécharger un fichier, puis de me déconnecter.

J'ai le script suivant:

UpdateJar.sh

#!/bin/bash

sftp -oPort=23 [email protected]:/home/kalenpw/TestWorld/plugins
#Change directory on server
#cd /home/kalenpw/TestWorld/plugins

#Upload file
put /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar

exit

le problème est que ce script établira une connexion sftp et ne fera rien. Une fois que je tape manuellement exit dans la connexion, il essaie d'exécuter la commande put, mais comme la session sftp a été fermée, il indique simplement put: command not found.

Comment puis-je obtenir que cela fonctionne correctement?

Merci

14
kalenpw

Vous pouvez modifier votre script pour passer des commandes dans un document ici, par exemple,

#!/bin/bash

sftp -oPort=23 [email protected]:/home/kalenpw/TestWorld/plugins <<EOF
put /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar   
exit
EOF

Le << marqueur suivi du nom (EOF) indique au script de passer les lignes suivantes jusqu'à ce que le nom soit trouvé au début de la ligne (par lui-même).

16
Thomas Dickey

Vous préférerez peut-être utiliser scp au lieu de sftp. scp se comporte comme la commande ordinaire cp, mais les fichiers peuvent être distants:

scp -P 23 /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar [email protected]:/home/kalenpw/TestWorld/plugins

Cela copie le fichier sur votre machine locale dans un répertoire sur la machine distante sans avoir à utiliser l'interface de commande de style ftp à l'ancienne.

Les services ssh, scp et sftp sont généralement disponibles si l'un d'entre eux l'est; le même programme démon les fournit tous simultanément. En principe, l'administrateur du serveur peut choisir de désactiver l'un d'eux, mais en pratique, c'est assez rare.

5
db48x

Vous pouvez également utiliser le -b option de sftp pour indiquer un fichier contenant des commandes pour sftp.

Par exemple, vous pouvez placer toutes vos commandes dans le fichier sftp_commands.txt:

cd /home/kalenpw/TestWorld/plugins
put /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar
exit

et exécutez sftp comme:

sftp -oPort=23 -b sftp_commands.txt [email protected]:/home/kalenpw/TestWorld/plugins 

Ou vous pouvez également passer les commandes via STDIN si vous ne souhaitez pas utiliser de fichier.

De man sftp:

-b batchfile

Le mode batch lit une série de commandes à partir d'un fichier batch d'entrée au lieu de stdin. Comme il manque d'interaction avec l'utilisateur, il doit être utilisé en conjonction avec une authentification non interactive. Un fichier batch de "-" peut être utilisé pour indiquer une entrée standard. sftp abandonnera si l'une des commandes suivantes échoue: get, put, reget, rename, ln, rm, mkdir, chdir, ls, lchdir, chmod, chown, chgrp, lpwd, df, symlink et lmkdir. La terminaison en cas d'erreur peut être supprimée commande par commande en préfixant la commande avec un caractère "-" (par exemple, -rm/tmp/blah *).

4
heemayl

Une autre option serait d'utiliser curl :

curl -u user -T file.tar sftp://example.com/home/user/
2
Pere