12
votes

Comment supprimer tous les fichiers du répertoire sur le serveur SFTP distant à Python?

J'aimerais supprimer tous les fichiers d'un répertoire donné sur un serveur distant que je suis déjà connecté à l'utilisation de paramiko. Je ne peux pas explicitement donner les noms de fichiers, car ceux-ci varient en fonction de la version du fichier que j'avais précédemment placé là-bas.

Voici ce que j'essaie de faire ... La ligne ci-dessous est l'appel i 'm Essayer où remotereartigactpath est quelque chose comme / opt / foo / * xxx

aucune idée de la façon dont je peux y parvenir ?


0 commentaires

5 Réponses :


13
votes

J'ai trouvé une solution: itérer sur tous les fichiers de l'emplacement distant, puis appelez supprimer code> sur chacun d'entre eux:

ssh = paramiko.SSHClient()
ssh.load_host_keys(os.path.expanduser(os.path.join("~", ".ssh", "known_hosts")))
ssh.connect(server, username=username, pkey=mykey)
sftp = ssh.open_sftp()

# Updated code below:
filesInRemoteArtifacts = sftp.listdir(path=remoteArtifactPath)
for file in filesInRemoteArtifacts:
    sftp.remove(remoteArtifactPath+file)

# Close to end
sftp.close()
ssh.close()


2 commentaires

Je suggère d'utiliser os.path.join (RemoTearTIFactPath, fichier) au lieu de sftp.remove (RemoTeartFactPath + fichier) , car os.path.join () < / code> est indépendant de la plate-forme. Les séparateurs de lignes peuvent différer par la plate-forme et utiliser OS.Path.Join assure que les chemins sont générés correctement, quelle que soit la plate-forme.


Cela supprimera-t-il aussi des fichiers cachés?



8
votes

a Tissu routine pourrait être aussi simple que ceci: xxx p> est génial Pour exécuter des commandes shell sur des serveurs distants. Le tissu utilise réellement paramiko en dessous. Vous pouvez donc utiliser les deux si vous en avez besoin.


1 commentaires

+1, car dans l'EC2, nos images du système d'exploitation ont défaut par défaut avec SFTP désactivé. (Je ne suis pas sûr que si c'est la valeur par défaut d'Amazon ou ma société, mais la question est hors de propos parce que je ne peux pas obtenir cela changé. J'ai toutefois besoin de supprimer le fichier.



9
votes

Vous avez besoin d'une routine récursive puisque votre répertoire distant peut avoir des sous-répertoires.

def rmtree(sftp, remotepath, level=0):
    for f in sftp.listdir_attr(remotepath):
        rpath = posixpath.join(remotepath, f.filename)
        if stat.S_ISDIR(f.st_mode):
            rmtree(sftp, rpath, level=(level + 1))
        else:
            rpath = posixpath.join(remotepath, f.filename)
            print('removing %s%s' % ('    ' * level, rpath))
            sftp.remove(rpath)
    print('removing %s%s' % ('    ' * level, remotepath))
    sftp.rmdir(remotepath)

ssh = paramiko.SSHClient()
ssh.load_host_keys(os.path.expanduser(os.path.join("~", ".ssh", "known_hosts")))
ssh.connect(server, username=username, pkey=mykey)
sftp = ssh.open_sftp()
rmtree(sftp, remoteArtifactPath)

# Close to end
stfp.close()
ssh.close()


0 commentaires

1
votes

Pour @Markolopa Réponse, vous avez besoin de 2 importations pour le faire fonctionner:

import posixpath
from stat import S_ISDIR


0 commentaires

2
votes

J'ai trouvé une solution, en utilisant Python3.7 fort> E Spur 0.3.20 strong>. Il est également très possible que cela fonctionne aussi avec d'autres versions.

import spur

shell = spur.SshShell( hostname="ssh_host", username="ssh_usr", password="ssh_pwd")
ssh_session = shell._connect_ssh()

ssh_session.exec_command('rm -rf  /dir1/dir2/dir3')

ssh_session.close()


0 commentaires