web-dev-qa-db-fra.com

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

Je dois transférer un fichier journal sur un hôte distant à l'aide de sftp à partir d'un hôte Linux. Mon groupe d'opérations m'a fourni des informations d'identification pour la même chose. Cependant, étant donné que je n'ai pas le contrôle sur un autre hôte, je ne peux pas générer et partager de clés RSA avec l'autre hôte.

Existe-t-il un moyen d'exécuter la commande sftp (avec le nom d'utilisateur/mot de passe fourni) à partir du script Bash via un travail cron ?

J'ai trouvé une question similaire de Stack Overflow, spécifiez le mot de passe de sftp dans un script Bash, mais aucune réponse satisfaisante problème.

160
anubhava

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 répond probablement à vos besoins)
  3. Utilisez attendez (moins sécurisé et plus de codage nécessaire)

Si vous décidez de donner à sshpass une chance, voici un extrait de script qui fonctionne:

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

Une autre façon serait d’utiliser lftp:

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

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

Une alternative plus sécurisée, disponible depuis LFTP 4.5.0, définit la variable LFTP_PASSWORDenvironment et exécute 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 inclut également une fonctionnalité de mise en miroir intéressante (pouvant inclure la suppression après transfert confirmé '--Remove-source-files'):

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

Expect est un excellent programme à utiliser.

Sur Ubuntu, installez-le avec:

Sudo apt-get install expect

Sur une machine CentOS, installez-la avec:

yum install expect

Disons que vous souhaitez établir une connexion avec un serveur sftp, puis télécharger un fichier local de votre ordinateur local sur le serveur sftp distant.

#!/usr/bin/expect

spawn sftp [email protected]
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 sur le serveur.

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

Cela télécharge un fichier journal du répertoire local situé dans/var/log/avec le nom du fichier en cours fichier.log dans le "répertoire_journal" sur le serveur distant.

46
rezizter

Vous pouvez utiliser lftp de manière interactive dans un script Shell afin que le mot de passe ne soit pas enregistré dans .bash_history ou similaire, en procédant comme suit:

vi test_script.sh

Ajoutez ce qui suit dans 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 mot de passe et le répertoire de votre fichier put en tapant :wq. Ensuite, créez votre script exécutable chmod +x test_script.sh et exécutez-le ./test_script.sh.

21
Mike S.

Vous pouvez remplacer en activant l'authentification sans mot de passe. Mais vous devriez installer les clés (pub, priv) avant d’y aller.

Exécutez les commandes suivantes sur le serveur local.

Local $> ssh-keygen -t rsa 

Appuyez sur ENTER pour toutes les options demandées. Aucune valeur ne doit être saisie.

Local $> cd .ssh
Local $> scp .ssh/id_rsa.pub user@targetmachine:
Prompts for pwd$>  ENTERPASSWORD

Connectez-vous au serveur distant à l'aide de la commande suivante

Local $> ssh user@targetmachine
Prompts for pwd$> ENTERPASSWORD

Exécutez les commandes suivantes sur le serveur distant

Remote $> mkdir .ssh
Remote $> chmod 700 .ssh
Remote $> cat id_rsa.pub >> .ssh/authorized_keys
Remote $> chmod 600 .ssh/authorized_keys
Remote $> exit

Exécutez la commande suivante sur le serveur local pour tester l'authentification sans mot de passe. Il devrait être connecté sans mot de passe.

$> ssh user@targetmachine
17
SriniV

On m'a récemment demandé de passer de ftp à sftp, afin de sécuriser la transmission de fichiers entre serveurs. Nous utilisons le package Tectia SSH, qui dispose d'une option --password pour transmettre 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"

Avant de lancer la commande d'aide (sftp -h), je pensais que je devrais partager cette information car je consultais différents sites Web. J'ai été surpris de voir l'option de mot de passe.

16
Mahony

Combinez sshpass avec un fichier d’identifiants verrouillé et, dans la pratique, il est aussi sécurisé que jamais: si vous avez la racine sur le coffre pour lire le fichier d’identifiants, tous les paris sont désactivés.

7
Rich Harding

Vous pouvez utiliser sshpass pour cela. Ci-dessous les étapes

  1. Installez sshpass pour Ubuntu - Sudo apt-get install sshpass
  2. Ajoutez l'adresse IP distante à votre fichier d'hôte connu si c'est la première fois. Pour Ubuntu -> utilisateur ssh @ IP -> entrez "oui"
  3. donne une commande combinée de scp et sshpass pour cela. Vous trouverez ci-dessous un exemple de code permettant à war de gérer une Tomcat distante sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/Tomcat7/webapps
5
ravi ranjan

Le programme Bash attend que sftp demande un mot de passe, puis l'envoie:

#!/bin/bash
expect -c "
spawn sftp username@your_Host
expect \"Password\"
send \"your_password_here\r\"
interact "

Vous devrez peut-être installer expect, changer le libellé de 'Password' en minuscule 'p' pour qu'il corresponde à ce que votre invite reçoit. Le problème ici est que votre mot de passe est exposé en texte brut dans le fichier ainsi que dans l'historique des commandes. Ce qui va presque à l'encontre du but d'avoir un mot de passe en premier lieu.

5
Eric Leschinski