Pytsk - 从磁盘映像发送文件到服务器
问题描述:
我想从磁盘映像发送到使用paramiko远程服务器的每个文件。Pytsk - 从磁盘映像发送文件到服务器
class Server:
def __init__(self):
self.ssh = paramiko.SSHClient()
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.ssh.connect('xxx', username='xxx', password='xxx')
def send_file(self, i_node, name):
sftp = self.ssh.open_sftp()
serverpath = '/home/paul/Testing/'
try:
sftp.chdir(serverpath)
except IOError:
sftp.mkdir(serverpath)
sftp.chdir(serverpath)
serverpath = '/home/Testing/' + name
sftp.putfo(fs.open_meta(inode = i_node), serverpath)
但是,当我运行这个时,我得到一个错误,说“pytsk.File没有读取属性”。
是否有任何其他方式发送此文件到服务器?
答
经过快速调查,我想我找到了你的问题。 Paramiko的sftp.putfo需要一个Python文件对象作为第一个参数。 Pytsk3的文件对象是完全不同的东西。您的sftp对象试图对此执行“读取”,但Pytsk3文件对象没有“读取”方法,因此出现错误。
你可能理论上试着扩展Pytsk3.File类并添加这个方法,但我不会屏住呼吸,它实际上工作。
我只是将文件读取到临时文件并发送该文件。像这样的东西(你需要做临时文件名的处理更聪明,然后删除该文件,但你的想法):
serverpath = '/home/Testing/' + name
tmp_path = "/tmp/xyzzy"
file_obj = fs.open_meta(inode = i_node)
# Add here tests to confirm this is actually a file, not a directory
tha = open(tmp_path, "wb")
tha.write(file_obj.read_random(0, file_obj.info.meta.size))
tha.close()
rha = open(tmp_path, "rb")
sftp.putfo(rha, serverpath)
rha.close()
# Delete temp file here
希望这有助于。这将从fs映像读取内存中的整个文件以写入临时文件,因此如果文件很大,则会导致内存不足。
要解决这个问题,你应该用适当的块(参数是起始偏移量和读取的数据量)以read_random循环读取文件,允许你构建一个临时文件块例如几兆字节。
这只是一个简单的例子来说明你的问题。
Hannu
请修改您的代码片段以包含您的依赖关系/导入。您可能会以这种方式获得更多帮助,因为这依赖于大多数论坛用户可能不熟悉的特定Python模块。你的“fs”变量只是出现在某个地方,我们不知道你是如何初始化它以及可能在后面的文件系统。 – Hannu
Paramiko部分和用于发送文件的机制可能没有问题。这可能只是使用pytsk的一个问题,并且要了解在这种情况下知道什么是“fs”是至关重要的。 – Hannu