Как удалить все файлы в каталоге на удаленном сервере в Python? - PullRequest
8 голосов
/ 04 августа 2010

Я хотел бы удалить все файлы в данном каталоге на удаленном сервере, к которому я уже подключен с помощью paramiko.Я не могу явно указать имена файлов, потому что они будут различаться в зависимости от того, какую версию файла я там ранее поместил.

Вот что я пытаюсь сделать ... строка под #TODO:вызов, который я пытаюсь, где remoteArtifactPath что-то вроде "/ 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()

Есть идеи, как мне этого добиться?

Спасибо

Ответы [ 5 ]

10 голосов
/ 04 августа 2010

Я нашел решение: перебрать все файлы в удаленном местоположении, затем вызвать remove для каждого из них:

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()
8 голосов
/ 04 августа 2010
Подпрограмма

A Fabric может быть простой:

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

Fabric отлично подходит для выполнения команд оболочки на удаленных серверах.Ткань фактически использует Paramiko внизу, так что вы можете использовать оба, если вам нужно.

5 голосов
/ 27 февраля 2014

Вам нужна рекурсивная процедура, поскольку в вашем удаленном каталоге могут быть подкаталоги.

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()
1 голос
/ 18 апреля 2019

Я нашел решение, используя python3.7 e spur 0.3.20 . Вполне возможно, что это работает и с другими версиями.

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()
1 голос
/ 18 декабря 2018

Для ответа @markolopa вам нужно 2 импорта, чтобы он заработал:

import posixpath
from stat import S_ISDIR
...