Script bash zenity copier des fichiers avec scp

xunil2003 Messages postés 766 Date d'inscription   Statut Membre Dernière intervention   -  
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    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
  2. xunil2003 Messages postés 766 Date d'inscription   Statut Membre Dernière intervention   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.
    0
  3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    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
  4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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