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ù aucune idée de la façon dont je peux y parvenir ? p> p> remotereartigactpath code> est quelque chose comme
/ opt / foo / * code> p>
5 Réponses :
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()
Je suggère d'utiliser os.path.join (RemoTearTIFactPath, fichier) code> au lieu de
sftp.remove (RemoTeartFactPath + fichier) code>, 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?
a Tissu routine pourrait être aussi simple que ceci:
+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.
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()
Pour @Markolopa Réponse, vous avez besoin de 2 importations pour le faire fonctionner:
import posixpath from stat import S_ISDIR
J'ai trouvé une solution, en utilisant 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()