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没有读取属性”。

是否有任何其他方式发送此文件到服务器?

+0

请修改您的代码片段以包含您的依赖关系/导入。您可能会以这种方式获得更多帮助,因为这依赖于大多数论坛用户可能不熟悉的特定Python模块。你的“fs”变量只是出现在某个地方,我们不知道你是如何初始化它以及可能在后面的文件系统。 – Hannu

+0

Paramiko部分和用于发送文件的机制可能没有问题。这可能只是使用pytsk的一个问题,并且要了解在这种情况下知道什么是“fs”是至关重要的。 – Hannu

经过快速调查,我想我找到了你的问题。 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

+0

我正在考虑做这样的事情,但我正在使用该程序来执行完整的磁盘获取,我担心这会写入磁盘 – Ledwith94

+0

您可以尝试扩展Pytsk3.File并添加一个read()方法,然后使用self.read_random来读取实际数据。它甚至可能工作,但我没有尝试。但是,如果您选择临时路径驻留在用于启动采集设备的本地文件系统上,我没有看到它将写入目标驱动器的原因。 – Hannu