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

13

Ceci est une question très basique que je suis tout juste nouvelle à bash et ne pouvais pas comprendre comment faire cela. Googler 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 parce que la session sftp a été fermée, il dit simplement put: command not found.

Comment puis-je obtenir que cela fonctionne correctement?

Merci

kalenpw
la source

Réponses:

15

Vous pouvez changer 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).

Thomas Dickey
la source
Génial qui a fait exactement ce dont j'avais besoin. Je vais devoir lire ici les documents. Merci pour la réponse rapide, je l'accepterai dans 8 min.
kalenpw
Pas de problème (j'ai cherché un doublon mais n'en ai trouvé qu'un fermé comme "peu clair").
Thomas Dickey
Êtes-vous sûr que le serveur ne s'étouffera pas avec les commentaires du script shell?
Alk
Cette approche dépend également du type de shell.
alk
@alk le script fonctionne avec et sans commentaires
kalenpw
5

Vous préférerez peut-être utiliser scpau lieu de sftp. scpse comporte comme la cpcommande ordinaire , 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 ssh, scpet les sftpservices sont généralement disponibles si l' un d'entre eux sont; 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.

db48x
la source
Ne connaissait pas scp au préalable semble très utile. Et vous aviez raison scpest déjà disponible sur ma machine
kalenpw
4

Vous pouvez également utiliser l' -boption de sftppour indiquer un fichier contenant des commandes pour sftp.

Par exemple, vous pouvez mettre toutes vos commandes dans un 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 fonctionner sftpcomme:

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 fichier batch

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 l'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 *).

heemayl
la source
2

Une autre option serait d'utiliser curl :

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