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.
Vous avez quelques options autres que l’utilisation de l’authentification par clé publique:
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
!
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_PASSWORD
environment 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
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.
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
.
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
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.
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.
Vous pouvez utiliser sshpass pour cela. Ci-dessous les étapes
Sudo apt-get install sshpass
sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/Tomcat7/webapps
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.