我想删除我已使用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()
知道如何实现这个目标吗?
由于
答案 0 :(得分:10)
我找到了一个解决方案:迭代远程位置的所有文件,然后在每个文件上调用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()
答案 1 :(得分:8)
Fabric例程可以这么简单:
with cd(remoteArtifactPath):
run("rm *")
Fabric非常适合在远程服务器上执行shell命令。 Fabric实际上在下面使用了Paramiko,因此如果需要,你可以使用它们。
答案 2 :(得分:5)
您需要一个递归例程,因为您的远程目录可能包含子目录。
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()
答案 3 :(得分:1)
对于@markolopa答案,您需要两次导入才能使其正常工作:
import posixpath
from stat import S_ISDIR
答案 4 :(得分:0)
我找到了使用 python3.7 和 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()