Script bash zenity copier des fichiers avec scp

Fermé
xunil2003 Messages postés 761 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 24 mars 2024 - Modifié par xunil2003 le 19/02/2015 à 22:16
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 20 févr. 2015 à 12:10
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.

A voir également:

4 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié par mamiemando le 19/02/2015 à 22:37
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
0
xunil2003 Messages postés 761 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 24 mars 2024 14
Modifié par xunil2003 le 19/02/2015 à 23:37
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.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié par mamiemando le 20/02/2015 à 12:00
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
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
20 févr. 2015 à 12:10
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 ;-(
0