2010-08-04 11 views
5

Ich möchte alle Dateien in einem bestimmten Verzeichnis auf einem Remote-Server löschen, mit dem ich bereits über paramiko verbunden bin. Ich kann die Dateinamen jedoch nicht explizit angeben, da diese davon abhängen, welche Version der Datei ich vorher dort abgelegt habe.Wie lösche ich alle Dateien im Verzeichnis auf dem Remote-Server in Python?

Hier ist, was ich versuche, die Zeile unter dem #TODO zu tun ... ist der Anruf Ich versuche, wo remoteArtifactPath so etwas wie „/ opt/foo/*“ Jede Idee

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() 

# TODO: Need to somehow delete all files in remoteArtifactPath remotely 
sftp.remove(remoteArtifactPath+"*") 

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

ist Wie kann ich das erreichen?

Dank

Antwort

7

ich eine Lösung gefunden: iterieren alle Dateien in der entfernten Stelle, dann remove von ihnen auf jeden Anruf:

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() 
+3

Ich schlage vor, mit '' 'os.path.join (remoteArtifactPath, Datei)' '' statt '' 'sftp.remove (remoteArtifactPath + Datei)' '', weil '' 'os.path. join() '' 'ist plattformunabhängig. Zeilentrennzeichen können sich je nach Plattform unterscheiden und os.path.join stellt sicher, dass Pfade unabhängig von der Plattform korrekt generiert werden. – 9monkeys

8

A Fabric Routine, da dies könnte so einfach sein:

with cd(remoteArtifactPath): 
    run("rm *") 

Fabric eignet sich hervorragend zum Ausführen von Shell-Befehlen auf Remote-Servern. Stoff verwendet tatsächlich Paramiko darunter, so dass Sie beide verwenden können, wenn Sie müssen.

+0

danke, ich werde in die – Cuga

+0

+1 schauen, weil in EC2 unsere OS-Bilder standardmäßig mit SFTP deaktiviert. (Ich bin mir nicht sicher, ob dies der Standard von Amazon oder meine Firma ist, aber die Frage ist irrelevant, weil ich das nicht ändern kann. Ich musste die Datei jedoch trotzdem entfernen. –

2

Sie benötigen eine rekursive Routine, da Ihr Remote-Verzeichnis Unterverzeichnisse haben kann.

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() 
Verwandte Themen