1 votes

Trouver un offset de fichier dans un zip sans le dézipper en utilisant Shell ?

Existe-t-il un moyen d'utiliser la commande Shell pour trouver l'offset d'un fichier à l'intérieur d'un zip sans extraire réellement le zip ?

J'ai essayé zipinfo XXX.zip qui fournit les tailles, mais j'ai dû additionner les tailles pour trouver le fichier.

Y a-t-il un meilleur moyen de le faire ?

2voto

pmqs Points 216

Essayez d'exécuter Détails du zip sur le fichier. [Divulgation complète - je suis l'auteur de zipdetails].

Dans l'exemple ci-dessous, le décalage pour le fichier abc.txt est inscrit sur la liste des PAYLOAD ligne. La valeur dans ce cas est 41 hex

$ echo abc >abc.txt
$ zip test.zip abc.txt
  adding: abc.txt (stored 0%)

$ zipdetails test.zip
0000 LOCAL HEADER #1       04034B50
0004 Extract Zip Spec      0A '1.0'
0005 Extract OS            00 'MS-DOS'
0006 General Purpose Flag  0000
0008 Compression Method    0000 'Stored'
000A Last Mod Time         52984C29 'Sat Apr 24 09:33:18 2021'
000E CRC                   4788814E
0012 Compressed Length     00000004
0016 Uncompressed Length   00000004
001A Filename Length       0007
001C Extra Length          001C
001E Filename              'abc.txt'
0025 Extra ID #0001        5455 'UT: Extended Timestamp'
0027   Length              0009
0029   Flags               '03 mod access'
002A   Mod Time            6083D7CE 'Sat Apr 24 09:33:18 2021'
002E   Access Time         6083D7CE 'Sat Apr 24 09:33:18 2021'
0032 Extra ID #0002        7875 'ux: Unix Extra Type 3'
0034   Length              000B
0036   Version             01
0037   UID Size            04
0038   UID                 000003E8
003C   GID Size            04
003D   GID                 000003E8
0041 PAYLOAD               abc.

0045 CENTRAL HEADER #1     02014B50
0049 Created Zip Spec      1E '3.0'
004A Created OS            03 'Unix'
004B Extract Zip Spec      0A '1.0'
004C Extract OS            00 'MS-DOS'
004D General Purpose Flag  0000
004F Compression Method    0000 'Stored'
0051 Last Mod Time         52984C29 'Sat Apr 24 09:33:18 2021'
0055 CRC                   4788814E
0059 Compressed Length     00000004
005D Uncompressed Length   00000004
0061 Filename Length       0007
0063 Extra Length          0018
0065 Comment Length        0000
0067 Disk Start            0000
0069 Int File Attributes   0001
     [Bit 0]               1 Text Data
006B Ext File Attributes   81B40000
006F Local Header Offset   00000000
0073 Filename              'abc.txt'
007A Extra ID #0001        5455 'UT: Extended Timestamp'
007C   Length              0005
007E   Flags               '03 mod access'
007F   Mod Time            6083D7CE 'Sat Apr 24 09:33:18 2021'
0083 Extra ID #0002        7875 'ux: Unix Extra Type 3'
0085   Length              000B
0087   Version             01
0088   UID Size            04
0089   UID                 000003E8
008D   GID Size            04
008E   GID                 000003E8

0092 END CENTRAL HEADER    06054B50
0096 Number of this disk   0000
0098 Central Dir Disk no   0000
009A Entries in this disk  0001
009C Total Entries         0001
009E Size of Central Dir   0000004D
00A2 Offset to Central Dir 00000045
00A6 Comment Length        0000
Done

L'extraction du nom du fichier et du décalage de la charge utile peut être effectuée comme suit

$ zipdetails  test.zip | perl -00 -ne 'print "$1,$2\n" if /^\S+\s+Filename\s+'"'"'(.*?)'"'"'.*?^(\S+?)\s+PAYLOAD/ms'
abc.txt,0041

Il y a un tas d'échappement Shell qui se passe là-dedans, donc voici l'instruction perl sans échappement

print "$1,$2\n"
    if /^\S+\s+Filename\s+'(.*?)'.*?^(\S+?)\s+PAYLOAD/ms;

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X