J'ai un nombre n de fichiers dans un répertoire sur mon système unix. Y a-t-il un moyen d'écrire un shellscript qui transférera tous ces fichiers via scp vers un système distant spécifié. Je spécifierai le mot de passe dans le script, afin de ne pas avoir à le saisir pour chaque fichier.
Réponses
Trop de publicités?Rsync est un programme qui se comporte à peu près de la même manière que rcp, mais qui possède beaucoup plus d'options et utilise le protocole rsync remote-update pour accélérer considérablement les transferts de fichiers lorsque le fichier de destination est en cours de mis à jour.
Le protocole rsync remote-update permet à rsync de transférer uniquement les différences entre deux ensembles de fichiers sur la connexion réseau, en utilisant un algorithme efficace de recherche de somme de contrôle décrit dans le rapport qui accompagne ce paquetage.
Copie d'un dossier d'un emplacement à un autre
#!/usr/bin/expect -f
spawn rsync -a -e ssh username@192.168.1.123:/cool/cool1/* /tmp/cool/
expect "password:"
send "cool\r"
expect "*\r"
expect "\r"
Si vous êtes d'accord pour entrer votre mot de passe une fois pour chaque exécution du script, vous pouvez le faire facilement en utilisant une connexion maître SSH.
#!/usr/bin/env bash
USER_AT_HOST="user@host" # use "$1@$2" here if you like
SSHSOCKET=~/".ssh/$USER_AT_HOST"
# This is the only time you have to enter the password:
# Open master connection:
ssh -M -f -N -o ControlPath="$SSHSOCKET" "$USER_AT_HOST"
# These do not prompt for your password:
scp -o ControlPath="$SSHSOCKET" file1.xy "$USER_AT_HOST":remotefile1.xy
scp -o ControlPath="$SSHSOCKET" file2.xy "$USER_AT_HOST":remotefile2.xy
# You can also use the flag for normal ssh:
ssh -o ControlPath="$SSHSOCKET" "$USER_AT_HOST" "echo hello"
ssh -o ControlPath="$SSHSOCKET" "$USER_AT_HOST" "echo world"
# Close master connection:
ssh -S "$SSHSOCKET" -O exit "$USER_AT_HOST"
Il existe deux moyens rapides d'y parvenir :
-
Utilisation de scp
#!/usr/bin/env bash password="YOURPASSWORD" username="YOURUSERNAME" dir_origin="YOURSOURCEDIRECTORY" dir_destination="REMOTEDESTINATION" Ip="SERVERIP" echo "Uploading files to remote server...." sshpass -p "$password" scp -rC $dir_origin $username@$Ip:$dir_destination echo "File upload to remote server completed! ;)"
-
Utilisation de rsync
#!/usr/bin/env bash password="YOURPASSWORD" username="YOURUSERNAME" dir_origin="YOURSOURCEDIRECTORY" dir_destination="REMOTEDESTINATION" Ip="SERVERIP" echo "Uploading files to remote server...." sshpass -p "$password" rsync -avzh $dir_origin $username@$Ip:$dir_destination echo "File upload to remote server completed! ;)"
**NOTE :**Vous devez installer sshpass
(par exemple en exécutant apt install sshpass
pour deb comme os eg Ubuntu
) qui vous permettra de télécharger automatiquement des fichiers sans demande de mot de passe.
Vous pouvez le faire avec les clés publiques/privées ssh uniquement. Ou utiliser putty dans lequel vous pouvez définir le mot de passe. scp ne permet pas de donner un mot de passe en ligne de commande.
Vous pouvez trouver les instructions pour les clés publiques/privées ici : http://www.softpanorama.org/Net/Application_layer/SSH/scp.shtml