222 votes

Comment exécuter la commande sftp avec un mot de passe à partir de Bash script ?

J'ai besoin de transférer un fichier journal vers un hôte distant à l'aide de la fonction sftp à partir d'un hôte Linux. Mon groupe d'exploitation m'a fourni des informations d'identification à cet effet. Cependant, comme je n'ai pas le contrôle de l'autre hôte, je ne peux pas générer et partager des clés RSA avec l'autre hôte.

Alors, y a-t-il un moyen d'exécuter le sftp (avec le nom d'utilisateur/mot de passe fourni) depuis l'intérieur du script de Bash par le biais d'une commande cron travail ?

J'ai trouvé une question similaire sur Stack Overflow, Spécifier le mot de passe pour sftp dans un script de Bash. mais je n'ai trouvé aucune réponse satisfaisante à mon problème.

225voto

anubhava Points 172509

Vous avez quelques options autres que l'utilisation de l'authentification par clé publique :

  1. Utilisez porte-clés
  2. Utilisez sshpass (moins sécurisé mais qui répond probablement à votre besoin)
  3. Utilisez s'attendre à (moins sécurisé et plus de codage nécessaire)

Si vous décidez de donner une chance à sshpass, voici un extrait de script fonctionnel pour le faire :

export SSHPASS=your-password-here
sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-host << !
   cd incoming
   put your-log-file.log
   bye
!

3 votes

Pour l'utiliser sur Mac : stackoverflow.com/questions/9102557/

0 votes

Salut, j'ai un problème similaire, et j'ai essayé d'utiliser expect car les autres alternatives ne sont pas présentes sur l'hôte. Avec expect J'obtiens cette erreur Permission denied (publickey,keyboard-interactive). . S'il vous plaît pouvez-vous me faire savoir, comment se connecter à un hôte sftp avec passwd à partir d'un bash script.

0 votes

S'il vous plaît voir, ont posé la question ici stackoverflow.com/q/12508206/1135954

131voto

Karassik Points 148

Un autre moyen serait d'utiliser lftp :

lftp sftp://user:password@host  -e "put local-file.name; bye"

L'inconvénient de cette méthode est que les autres utilisateurs de l'ordinateur peuvent lire le mot de passe à partir d'outils tels que ps et que le mot de passe peut devenir une partie de l'historique de votre shell.

Une alternative plus sûre, qui est disponible depuis LFTP 4.5.0, consiste à définir le paramètre LFTP_PASSWORD et en exécutant lftp avec --env-password . Voici un exemple complet :

LFTP_PASSWORD="just_an_example"
lftp --env-password sftp://user@host  -e "put local-file.name; bye"

LFTP comprend également une fonction cool de mise en miroir (peut inclure la suppression après un transfert confirmé). --Remove-source-files ) :

lftp -e 'mirror -R /local/log/path/ /remote/path/' --env-password -u user sftp.foo.com

9 votes

+1 pour avoir suggéré une alternative mais peut-on éviter de fournir le mot de passe en ligne de commande ?

2 votes

Dévalorisé pour avoir montré le mot de passe à n'importe qui sur le même ordinateur.

16 votes

Vous pouvez créer le fichier script pour lftp, de cette façon vous n'aurez pas à fournir le mot de passe dans la ligne de commande. Créer un fichier put-script : open sftp://user:password@host; put local-file.name; exit Que courir lftp -f put-script De cette façon, vous n'avez pas besoin d'avoir le nom d'utilisateur et le mot de passe dans une ligne de commande et vous pouvez mettre en place des autorisations restrictives pour votre fichier script.

67voto

rezizter Points 542

EXPECT est un excellent programme à utiliser.

Sur Ubuntu, installez-le avec :

sudo apt-get install expect

Sur une machine CentOS, installez-le avec :

yum install expect

Disons que vous voulez établir une connexion avec un serveur sftp, puis télécharger un fichier local de votre machine locale vers le serveur sftp distant.

#!/usr/bin/expect

spawn sftp username@hostname.com
expect "password:"
send "yourpasswordhere\n"
expect "sftp>"
send "cd logdirectory\n"
expect "sftp>"
send "put /var/log/file.log\n"
expect "sftp>"
send "exit\n"
interact

Cela ouvre une connexion sftp avec votre mot de passe vers le serveur.

Ensuite, il va dans le répertoire où vous voulez télécharger votre fichier, dans ce cas "logdirectory".

Cette opération télécharge un fichier journal du répertoire local /var/log/, dont le nom de fichier est file.log, vers le répertoire "logdirectory" du serveur distant.

0 votes

Merci pour votre réponse, je m'attendais à ce que ce soit une de mes options pour réaliser cette tâche.

1 votes

Merci. J'ai trouvé votre réponse par une recherche, je l'ai utilisée et j'ai construit un script avec succès avec expect. J'ai juste posté le script pour la potérité

0 votes

Merci beaucoup pour votre réponse, je l'ai déjà upvoted :)

29voto

Mike S. Points 2039

Vous pouvez utiliser lftp de manière interactive dans un shell script afin que le mot de passe ne soit pas sauvegardé dans .bash_history ou similaire en faisant ce qui suit :

vi test_script.sh

Ajoutez ce qui suit à votre fichier :

#!/bin/sh
HOST=<yourhostname>
USER=<someusername>
PASSWD=<yourpasswd>

cd <base directory for your put file>

lftp<<END_SCRIPT
open sftp://$HOST
user $USER $PASSWD
put local-file.name
bye
END_SCRIPT

Et écrivez/quittez l'éditeur vi après avoir modifié l'hôte, l'utilisateur, le pass et le répertoire pour votre fichier put en tapant :wq Ensuite, rendez votre script exécutable. chmod +x test_script.sh et l'exécuter ./test_script.sh .

2 votes

Pour écraser le fichier existant, ajoutez "set xfer:clobber on" après lftp<<END_SCRIPT

18voto

Mahony Points 91

On m'a récemment demandé de passer de ftp à sftp, afin de sécuriser la transmission des fichiers entre les serveurs. Nous utilisons le paquet Tectia SSH, qui dispose d'une option --password pour passer le mot de passe sur la ligne de commande.

exemple : sftp --password="password" "userid"@"servername"

Exemple de lot :

(
  echo "
  ascii
  cd pub
  lcd dir_name
  put filename
  close
  quit
    "
) | sftp --password="password" "userid"@"servername"

J'ai pensé que je devais partager cette information, puisque j'ai consulté divers sites web, avant d'exécuter la commande d'aide ( sftp -h ), et j'ai été surpris de voir l'option du mot de passe.

10 votes

+1 pour votre bonne suggestion. Cependant, cela nécessitera que vous passiez le mot de passe sur la ligne de commande et que n'importe qui sur le système le fasse. ps serait capable de voir votre mot de passe.

5 votes

J'ai essayé ça, j'ai eu unknown option -- - usage: sftp [-1246aCfpqrv] [-B buffer_size] [-b batchfile] [-c cipher] [-D sftp_server_path] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-R num_requests] [-S program] [-s subsystem | sftp_server] host sftp [user@]host[:file ...] sftp [user@]host[:dir[/]] sftp -b batchfile [user@]host

2 votes

@ihue probablement parce que vous avez besoin Techia SSH pas OpenSSH

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X