Script bash zenity copier des fichiers avec scp

Fermé
Signaler
Messages postés
730
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
26 novembre 2021
-
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
-
Bonjour,

J'ai fait un script bash avec zenity pour copier des fichiers avec scp d'un pc a l'autre.

Voici le code :
#!/bin/bash 
echo "
+----------------------------------------------------+
| Copie de fichiers d'un ordinateur à l'autre |
| avec scp |
+----------------------------------------------------+

Ce script ne fonctionne pas, je n'arrive pas à trouver la raison ????

bash /home/laurent/bash/dernier/copie-de-fichiers-d-un-pc-a-un-autre-graph.sh"

titre="Copier un fichier en ssh"
CHOIX=`zenity --entry --title="$titre" --text="Selectionnez un choix : \n" "Copier un fichier de votre ordinateur vers un autre" "Copier un fichier d'un autre ordinateur vers le vôtre"`

echo "test : $CHOIX"

case $CHOIX in
"Copier un fichier de votre ordinateur vers un autre")
FICHIER_A_COPIER=`zenity --file-selection --filename /home/$USER/* --title="$titre" --text="Sélectionnez le fichier à copier sur l'autre ordinateur"`

case $? in
0)
echo "\"$FICHIER_A_COPIER\" est sélectionné.";;
1)
echo "Aucun fichier sélectionné.";;
-1)
echo "Une erreur inattendue est survenue.";;
esac


SSH=`if zenity --entry \
--title="$titre" \
--text="Veuillez indiquer votre connexion ssh \nExemple : root@192.168.0.5" \
--entry-text "root@192.168.0.5"
then echo $?
else echo "Pas de nom saisi"
fi`
echo "SSH : $SSH"


DESTINATION=`if zenity --entry \
--title="$titre" \
--text="Veuillez indiquer ou doit être copier le fichier sur l'autre ordinateur \nExemple : /root/Bash/" \
--entry-text "/root/Bash/"
then echo $?
else echo "Pas de nom saisi"
fi`
echo "DESTINATION : $DESTINATION"


echo "scp $FICHIER_A_COPIER $SSH:$DESTINATION"
scp $FICHIER_A_COPIER $SSH:$DESTINATION
echo "DESTINATION : $DESTINATION"
;;

"Copier un fichier d'un autre ordinateur vers le vôtre")
;;
esac
echo


Mais ça marche pas, il ne me demande pas le mot de passe de la connexion scp
Retour :
laurent@Laurent-Bureau:~$ bash /home/laurent/bash/dernier/copie-de-fichiers-d-un-pc-a-un-autre-graph.sh

+----------------------------------------------------+
| Copie de fichiers d'un ordinateur à l'autre |
| avec scp |
+----------------------------------------------------+

Ce script ne fonctionne pas, je n'arrive pas a trouver la raison ????

bash /home/laurent/bash/dernier/copie-de-fichiers-d-un-pc-a-un-autre-graph.sh

(zenity:8209): Gdk-CRITICAL **: gdk_device_ungrab: assertion 'GDK_IS_DEVICE (device)' failed

(zenity:8209): Gtk-CRITICAL **: gtk_device_grab_remove: assertion 'GDK_IS_DEVICE (device)' failed

(zenity:8209): Gdk-CRITICAL **: gdk_device_ungrab: assertion 'GDK_IS_DEVICE (device)' failed

(zenity:8209): Gtk-CRITICAL **: gtk_device_grab_remove: assertion 'GDK_IS_DEVICE (device)' failed
test : Copier un fichier de votre ordinateur vers un autre
"/home/laurent/bash/vera/box2/sms-groupe_Everspring_SF812_couloir-1E_detecteur-fume.sh" est sélectionné.
SSH : root@192.168.0.5
0
DESTINATION : /root/Bash/
0
scp /home/laurent/bash/vera/box2/sms-groupe_Everspring_SF812_couloir-1E_detecteur-fume.sh root@192.168.0.5
0:/root/Bash/
0
0: No such file or directory
DESTINATION : /root/Bash/
0

laurent@Laurent-Bureau:~$


Vous constaterez que le retour affiche :
scp /home/laurent/bash/vera/box2/sms-groupe_Everspring_SF812_couloir-1E_detecteur-fume.sh root@192.168.0.5
sans afficher la destination de la copie sur l'autre pc, la variable "$DESTINATION" passe pas :
echo "scp $FICHIER_A_COPIER $SSH:$DESTINATION"

Je n'arrive pas à trouver d'où vient le problème ?

Merci.

4 réponses

Messages postés
30367
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
1 décembre 2021
7 235
scp /home/laurent/bash/vera/box2/sms-groupe_Everspring_SF812_couloir-1E_detecteur-fume.sh root@192.168.0.5


Il manque le
:
à la fin de la destination. Si tu l'omets cela signifie que tu fais ta copie vers le fichier
root@192.168.0.5
ce qui n'est pas ce que tu veux.

Plus généralement la syntaxe est (avec [...] qui signifie "optionnel") :

scp [-r] chemin_a chemin_b


... où un chemin est :

[[login@]machine:]chemin


Note que cette syntaxe permet donc à une machine C de faire un transfert de A à B, à un machine A d'uploader un fichier sur B, ou à une machine A de télécharger un fichier depuis B selon la manière dont tu l'invoques. Plus de détails :

man scp


Bonne chance
Messages postés
730
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
26 novembre 2021
14
Bonsoir,

Etês vous sûre, car j'ai remplacé à la fin :
echo "scp $FICHIER_A_COPIER $SSH:$DESTINATION"
scp $FICHIER_A_COPIER $SSH:$DESTINATION
echo "DESTINATION : $DESTINATION"

par
commande="scp [-r] $FICHIER_A_COPIER $SSH:$DESTINATION:"
echo $commande
$commande
echo "DESTINATION : $DESTINATION"



Retour :
laurent@Laurent-Bureau:~$ bash /home/laurent/bash/dernier/copie-de-fichiers-d-un-pc-a-un-autre-graph.sh

+----------------------------------------------------+
| Copie de fichiers d'un ordinateur à l'autre |
| avec scp |
+----------------------------------------------------+

Ce script ne fonctionne pas, je n'arrive pas a trouver la raison ????

bash /home/laurent/bash/dernier/copie-de-fichiers-d-un-pc-a-un-autre-graph.sh

(zenity:9435): Gdk-CRITICAL **: gdk_device_ungrab: assertion 'GDK_IS_DEVICE (device)' failed

(zenity:9435): Gtk-CRITICAL **: gtk_device_grab_remove: assertion 'GDK_IS_DEVICE (device)' failed

(zenity:9435): Gdk-CRITICAL **: gdk_device_ungrab: assertion 'GDK_IS_DEVICE (device)' failed

(zenity:9435): Gtk-CRITICAL **: gtk_device_grab_remove: assertion 'GDK_IS_DEVICE (device)' failed
test : Copier un fichier de votre ordinateur vers un autre
"/home/laurent/09-off.wav" est sélectionné.
SSH : root@192.168.0.5
0
DESTINATION : /root/Bash/
0
scp [-r] /home/laurent/09-off.wav root@192.168.0.5 0:/root/Bash/ 0:
laurent@0's password:
Permission denied, please try again.
laurent@0's password:
Permission denied, please try again.
laurent@0's password:
Permission denied (publickey,password).
lost connection
DESTINATION : /root/Bash/
0

laurent@Laurent-Bureau:~$

Il y a "0:" à la place de la destination ?
scp [-r] /home/laurent/09-off.wav root@192.168.0.5 0:/root/Bash/ 0:

Et il ne reconnaît pas le mot de passe quand je le tape ?

Merci.
Messages postés
30367
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
1 décembre 2021
7 235
Non tu n'as pas bien compris ce que j'ai voulu écrire.

A) Pré-requis :

Pour information quand tu lis un man, par exemple
man scp
, quand quelque chose est écrit entre crochet il ne faut pas les réécrire : cela signifie que ce qui est entre crochet peut être ou ne pas être écrit dans ta commande (en fonction de tes besoins). C'est notamment le cas des options.

Regarde par exemple
man ls
: tu sais que tu peux écrire
ls -l
ou
ls -a
ou encore
ls -a -l 
ou encore
ls -al
. Si ls se limitait à ces deux options, son synopsis dans le man serait alors :

ls [-al] [chemin]


Dans le cas de
ls
tu peux même écrire plusieurs fichiers à la suite :

ls /home/toto /home/tata


... du coup son synopsis serait :

ls [-al] [chemin...]


Dans le cas de
cp
tu peux copier n fichiers vers 1 destination donc le synopsis ressemble à :

cp [-r] chemin_sources... chemin_destinatoin


scp
suit la même convention : tu peux copier n sources vers 1 destination, et chacun de ces paramètres peuvent correspondre à un fichier/dossier local à la machine ou sur une machine distante. La syntaxe de
scp
requiert donc de pouvoir exprimer ces deux types de chemins. Ainsi :
- un chemin local continue à s'écrire "normalement"
- un chemin sur une machine distante doit comporter les informations pour faire la connexion ssh vers cette machine (donc le login et le nom de machine). Si le login est omis, c'est sous-entendu le résultat de la commande
whoami
.

B) Quelques exemples avec scp

Ils seront peut-être plus claire que la syntaxe avec des crochets.

1) Upload (fichier / dossier) :

scp /home/toto/mon/fichier loginA@machineA:/chemin/sur/a
scp -r /home/toto/dossier loginA@machineA:/chemin/sur/a


Cas particulier : upload dans
/home/loginA
:

scp /home/toto/mon/fichier loginA@machineA:/home/loginA
scp /home/toto/mon/fichier loginA@machineA:


Upload de plusieurs fichiers :

scp fichier1 fichier2 fichier3 loginA@machineA:/home/loginA


Upload de plusieurs répertoires :

scp -r dossier1 dossier2 dossier3 loginA@machineA:/home/loginA


2) Download

En gros, c'est la même chose mais dans l'autre sens.

scp loginA@machineA:/mon/fichier/sur/a /home/toto/mon/fichier 
scp -r loginA@machineA:/mon/dossier/sur/a /home/toto/dossier


Cas particulier : download dans le répertoire courant :

scp loginA@machineA:/chemin/sur/a .


On peut aussi downloader plusieurs fichiers/dossiers.

3) Transfert (depuis ta machine, de A vers B)

scp loginA@machineA:/fichier/sur/a loginB@machineB:/fichier/sur/b
scp -r loginA@machineA:/dossier/sur/a loginB@machineB:/dossier/sur/b


J'espère que c'est plus clair.

C) Si tu es bloqué

N'hésite pas à demander des précisions en cas de besoin. Si tu es bloqué, reporte-moi la commande scp (sans les variables shells), sa valeur exacte. Pour ce faire, tu peux modifier ton script pour qu'il affiche la commande qu'il va exécuter.

Exemple :

cmd="scp -r $login_src@$machine_src:$chemin_src /home/toto"
echo $cmd
eval $cmd


Bonne chance
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 480
Salut,

SSH=`if zenity --entry \
--title="$titre" \
--text="Veuillez indiquer votre connexion ssh \nExemple : root@192.168.0.5" \
--entry-text "root@192.168.0.5"
then echo $?
else echo "Pas de nom saisi"
fi`
echo "SSH : $SSH"


et

(zenity:8209): Gtk-CRITICAL **: gtk_device_grab_remove: assertion 'GDK_IS_DEVICE (device)' failed
test : Copier un fichier de votre ordinateur vers un autre
"/home/laurent/bash/vera/box2/sms-groupe_Everspring_SF812_couloir-1E_detecteur-fume.sh" est sélectionné.
SSH : root@192.168.0.5
0

DESTINATION : /root/Bash/
0


Ta syntaxe n'est pas bonne, le résultat donne bien l'adresse de ton serveur, mais aussi le résultat du code retour, d'où l'erreur ;-(