import struct BSIZE = 4096 IPG = 8192 def read_block(f, block_num): f.seek(block_num * BSIZE) return f.read(BSIZE) def get_extents(inode_data): blocks = [] if struct.unpack_from(' 0 and name_len > 0: name = blk_data[off+8:off+8+name_len].decode('utf-8',errors='replace') if name not in ('.','..'): entries.append((ino, name, ftype)) off += rec_len return entries with open('/dev/nbd0','rb') as f: # /var = inode 1310721 print('=== /var (inode 1310721) ===') for ino, name, ftype in list_dir(f, 1310721): tname = {1:'file',2:'dir',7:'link'}.get(ftype,'?') print(f' {tname:4s} {name:30s} inode={ino}') # Find /var/lib print() for ino, name, ftype in list_dir(f, 1310721): if name == 'lib': print(f'=== /var/lib (inode {ino}) ===') for i2, n2, f2 in list_dir(f, ino): tname = {1:'file',2:'dir',7:'link'}.get(f2,'?') print(f' {tname:4s} {n2:30s} inode={i2}') # Find pterodactyl for i2, n2, f2 in list_dir(f, ino): if n2 == 'pterodactyl': print(f'\n=== /var/lib/pterodactyl (inode {i2}) ===') for i3, n3, f3 in list_dir(f, i2): tname = {1:'file',2:'dir',7:'link'}.get(f3,'?') print(f' {tname:4s} {n3:30s} inode={i3}')