7
votes

Pourquoi le paramiko élever Eoferror () lorsque l'objet SFTP est stocké dans un dictionnaire?

J'ai des problèmes avec une application que j'écris qui télécharge et télécharge des fichiers vers et depuis d'autres cases via SSH. Le problème que je ressens est que je peux obtenir des fichiers (téléchargez) simplement bien, mais lorsque j'essaie de mettre (télécharger) les sur un autre serveur, je reçois une exception Eoferror (). Quand j'ai regardé _write_all () dans le paramiko \ sftp.py, il semblait que l'erreur a été causée lorsqu'il ne pouvait écrire aucune donnée au flux? Je n'ai aucune expérience de programmation réseau, donc si quelqu'un sait ce qu'il tente de faire et de pouvoir communiquer que je l'apprécierais.

J'ai écrit une version simplifiée de la fonction qui gère mes connexions comme SSH (). RunCommand () montre comment le téléchargement échoue dans ma candidature tandis que SimpleTest () montre comment SFTP Met est fonctionne, mais je ne vois aucune différence entre RunCommand () et SimpleTest (), à part comment mes objets SFTP sont stockés. On est stocké dans un dictionnaire et l'autre par lui-même. Cela semble être si le dictionnaire était le problème que le téléchargement de fichiers ne fonctionnerait pas mais ce n'est pas le cas. P>

Est-ce que quelqu'un sait ce qui pourrait causer ce comportement ou peut recommander une autre façon de gérer mes connexions si cette voie causant des problèmes? p>

J'utilise Python 2.7 avec PARAMIKO 1.7.6. J'ai testé ce code sur Linux et Windows et obtenu les mêmes résultats. P>

Modifier: code inclus maintenant. Strong> p>

running test that works
sftp connection to testbox opened
downloaded C:\testfile from testbox
uploaded C:\testfile to testbox
running test that fails
ssh connection to testbox opened
sftp connection to testbox opened
if [ -d /tmp ]; then echo -n 1; else echo -n 0; fi executed on testbox
returned 1
downloaded /tmp/tempfile from testbox
Traceback (most recent call last):
  File "paramikotest.py", line 71, in <module>
    test.runCommand()
  File "paramikotest.py", line 47, in runCommand
    self.sftpConnections[host].put(self.localfile, self.remotefile)
  File "C:\Python27\lib\site-packages\paramiko\sftp_client.py", line 561, in put

    fr = self.file(remotepath, 'wb')
  File "C:\Python27\lib\site-packages\paramiko\sftp_client.py", line 245, in open
    t, msg = self._request(CMD_OPEN, filename, imode, attrblock)
  File "C:\Python27\lib\site-packages\paramiko\sftp_client.py", line 627, in _request
    num = self._async_request(type(None), t, *arg)
  File "C:\Python27\lib\site-packages\paramiko\sftp_client.py", line 649, in _async_request
    self._send_packet(t, str(msg))
  File "C:\Python27\lib\site-packages\paramiko\sftp.py", line 172, in _send_packet
    self._write_all(out)
  File "C:\Python27\lib\site-packages\paramiko\sftp.py", line 138, in _write_all

    raise EOFError()
EOFError


0 commentaires

3 Réponses :


0
votes

Après avoir lu votre édition, je pense que le problème est ici xxx

cette ligne déconnectez apparemment la chose FTP

édité


1 commentaires

Commentaire déplacé pour répondre ci-dessous.



7
votes

J'ai pu résoudre mon problème. J'étais censé utiliser paramiko.transport puis créer le SFTPPCLIPE avec paramiko.sftpclient.from_transport (t) au lieu d'utiliser Open_sftp () de sshclient () .

Le code suivant fonctionne: xxx


1 commentaires

Cependant, utilisez le même code, cette exception est soulevée au hasard



2
votes

Comme je le vois, avec ssh = sshclient () Vous créez un objet SSHClient, puis avec SFTP = SSH.OPEN_SFTP () Vous créez un objet SFTP. Pendant que vous voulez seulement utiliser le SFTP, vous stockez le SSH dans une variable locale, qui obtient ensuite GC'D, mais si le SSH est GC'D, le SFTP cesse de fonctionner par magie. Je ne sais pas pourquoi, mais essayez de stocker le SSH pour que votre SFTP vit.


0 commentaires