Python Shell et mot de passe

Salut,

Je me mets au Python depuis peu et je viens de tomber sur un sacret morceau.
J’aimerai faire en sorte que mon programme Python puisse auto compléter les commande demandant un mot de passe pour le scp afin que je transfère les fichiers simplement

Ca fait 2 jours que je suis à la recherche d’une solution, j’ai essayé plusieurs chose tel que -S, ou l’expect
mais sans résultat…

Merci d’avance

Salut,
Tu veux faire du scp.
La commande scp est la commande cp en mode ssh.
Plutôt que de jouer avec python (ce qui ets un très bon jeu, là n’est pas le souci), sais tu que pour faire un scp entre un Linux et un autre Linux, il suffit d’échanger des clés .
En gros, Linux01 et Linux02 se connaissent et Linux02 ne demande pas à Linux01 de taper un mot de passe car la clé joue son rôle.
Et pouf, tout fonctionne sans intervention humain.
Très utile pour faire des rsync entre un NAS et des PC clients :wink:

Si je ne me suis pas trompé dans l’analyse de ta demande, ton axe de recherche sera alors « connexion ssh sans mot de passe »

++

1 « J'aime »

Totalement d’accord avec Nabla, l’échange de clef est là pour ca :slight_smile:

Si tu n’as pas encore de clef

ssh-keygen

puis simplement

ssh-copy-id ton_compte@ip_de_destination

et c’est bon :slight_smile:

Super merci,

De mon coté j’ai fini par trouvé un truc, sshpass.
Ca permet de faire un connexion ssh sans intéraction humaine, on entre le mdp dans la commande.

Hello,

Du coup, c’est beaucoup moins sécurisé !

Par exemple, si j’ai un accès physique à ta machine, je fourre ta SD dans mon PC Linux et j’ai ton mot de passe.
Aucune commande d’expert de sécurité à taper, tout apparait en clair.
Idem si une personne arrive à passer dans ton Rpi par le réseau, le mot de passe apparait en clair et offre ainsi l’accès à l’autre machine.

Ha je vois, j’avais réussi en Shell du coup je suis passé au Python. Les commandes que Gpapig sont toujours valide ?

J’ai un autre souci depuis que je suis passé à Python, je veux faire un code qui reconnais les erreurs, par exemple si le fichier à transférer n’est pas trouvé je fais un print. Souci j’arrive pas à récupérer l’output de ma commande, du moins avec ce que j’ai trouvé (subprocess) je n’ai que l’output si la commande n’a pas erreur…

hello,

pour ce type de problème, python peut les gérer avec des « exceptions » c’est expliqué par là:

Bon alors je comprend pas pourquoi ça fonctionne pas

try:
    os.system(ssh -p raspberry scp /home/pi/Desktop pi@10.3.141.147:Desktop/)
except Exception as e:
    print(e)

J’ai toujours l’erreur de la command mais jamais l’Exception…
(Je changerai pour le sshpass mais chaque chose en sont temps)

Merci d’avance

. la syntaxe de ta commande scp devrait ressembler plutôt à ça:
scp -r pi@10.3.141.147:/home/pi/Desktop /home/someone/répertoire_destination

en fait, apparemment (…) , se n’est pas python qui plante mais ta commande scp donc python s’en fout et donc ne génère pas d’exception !

Mais du coup j’ai aucun moyen de pouvoir départagé entre une erreur X ou Y ?

Avec cette syntaxe c’est pour prendre un fichier d’un autre vers nous.

Salut,

J’ai des gros gros doutes que

try:
    os.system(ssh -p raspberry scp /home/pi/Desktop pi@10.3.141.147:Desktop/)
except Exception as e:
    print(e)

puisse fonctionner.

Tu as tenter

ssh -p raspberry scp /home/pi/Desktop pi@10.3.141.147:Desktop/

pour voir ?

(Franchement, un rsync avec échange de clé ne serait pas plus simple ???)

Oui parfaitement, je le fait toujours en boucle sur avec un programme shell, en python dans les programme que je vous ai réécrit j’ai oublié de simple cote de chaque coté de la commande mais ça fonctionne

Pour le ssh simple je l’option -p c’est pour un port et « raspberry » n’est pas un port d’après le terminal

Oui peut être comme je l’ai dit que n’y connait pas grand chose je viens de me lancer.
J’ai essayer avec ssh-keygen et ensuit ssh-agent pour ne plus avoir de mdp mais la encore si je relance le raspberry je suis obligé d’entre un passphrase au début…

Si tu veux avoir plus de contenu dans tes messages d’erreur je te propose de passer par une lib’ spécifique plutot que d’utiliser des commandes systèmes :

Ensuite je trouve étonnant de te connecter d’abord en SSH puis de lancer une commande scp depuis cet hôte.

Ne serait il pas plus simple de faire un « get » directement depuis la machine de base?

Edit : je ne sais pas si la libraire que je t’ai mise est plus détaillée, mais l’idée générale est d’utiliser le python en lui même plutot que les commandes système

Et c’est sans doute ce jump ssh qui t’empêche d’avoir une erreur plus parlante.

  1. Tu te connectes en SSH donc si une erreur arrive ici tu auras le détails
  2. Tu lances une commande scp depuis ce ssh, si une erreur arrive ici, tu n’auras qu’un retour partiel

En fait
Je ne pige pas

ssh -p raspberry scp /home/pi/Desktop pi@10.3.141.147:Desktop/

J’utilise ssh -p 9022 pi@192.168.0.48 pour me connecter via le port 9022

Mais pourquoi passer par ssh pour faire du scp qui est du cp via ssh

si je relance le raspberry je suis obligé d’entre un passphrase au début

Faut pas mettre de passphrase lors de la création du ssh-keygen

++

en fait scp offre deux possibilités:
.transfert scp d un fichier du poste distant vers le poste local (réception)
scp pi@192.168.5.87:/home/pi/image.jpg /home/someone/Images
et dans l’autre sens :
.transfert scp d un fichier du poste local vers le poste distant (envoie)
scp /home/someone/Images/photo.jpg pi@192.168.5.87:/home/pi

plus d’info : Transférer des fichiers sur la Raspberry Pi sans FTP avec SSH.