2010-08-04 35 views
5

Me gustaría eliminar todos los archivos de un directorio determinado en un servidor remoto al que ya estoy conectado usando paramiko. Sin embargo, no puedo dar explícitamente los nombres de los archivos, porque variarán según la versión del archivo que haya colocado allí anteriormente.¿Cómo eliminar todos los archivos del directorio en el servidor remoto en python?

Aquí es lo que estoy tratando de hacer ... la línea por debajo de la #TODO es la llamada que estoy tratando donde remoteArtifactPath es algo así como "/ opt/foo/*"

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

Cualquier idea ¿Cómo puedo lograr esto?

Gracias

Respuesta

7

he encontrado una solución: iterar sobre todos los archivos en la ubicación remota, a continuación, llamar remove en cada una de ellas:

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

sugiere emplear '' 'os.path.join (remoteArtifactPath, archivo)' '' en lugar de '' 'sftp.remove (+ remoteArtifactPath archivo)' '', porque '' 'os.path. join() '' 'es independiente de la plataforma. Los separadores de línea pueden diferir según la plataforma y usar os.path.join garantiza que las rutas se generen correctamente, independientemente de la plataforma. – 9monkeys

8

Una rutina Fabric podría ser tan simple como esto:

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

Tela es grande para la ejecución de comandos shell en servidores remotos. La tela realmente usa Paramiko debajo, por lo que puede usar ambas si lo necesita.

+0

gracias, voy a ver que – Cuga

+0

+1, porque en EC2 nuestras imágenes del sistema operativo predeterminado con sftp desactivado. (No estoy seguro de si eso es lo predeterminado de Amazon o de mi empresa, pero la pregunta es irrelevante porque no puedo cambiar eso. Sin embargo, aún tenía que eliminar el archivo. –

2

Necesita una rutina recursiva ya que su directorio remoto puede tener subdirectorios.

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