zip을 사용하여 대상 디렉터리 경로를 위조할 수 있습니까?

zip을 사용하여 대상 디렉터리 경로를 위조할 수 있습니까?

현재 디렉토리에 여러 개의 파일이 있는 경우 압축을 풀면 특정 디렉토리에 배치될 수 있도록 압축할 수 있기를 원합니다. 예를 들어, 다음이 있다고 가정해 보겠습니다 $PWD.

ls
fsck
xz
chroot

을 실행하면 unzip foo.zip모두 다음 디렉터리로 추출됩니다.

/bin
/sbin
/usr/bin
/usr/sbin

내가 찾을 수 있는 가장 가까운 것은 파일을 추출하려는 디렉터리 경로( $PWD루트 디렉터리로 사용됨)에 이 파일이 이미 존재해야 한다는 것입니다.

$ zip foo.zip bin/ls sbin/fsck usr/bin/xz usr/sbin/chroot

그런 다음 추출하려는 시스템에서 다음을 수행해야 합니다.

$ cd /
$ sudo unzip foo.zip

답변1

이 명령을 사용하여 이 작업을 수행하는 방법을 찾지 못했지만 zipPython에서는 쉽습니다.

참고하시기 바랍니다,zip 파일 형식 사양, 섹션 4.4.17.1에는 경로 이름이 "/"로 시작할 수 없다고 나와 있으므로 해당 부분에 대해서는 도움을 드릴 수 없습니다.

파이썬압축파일zip 아카이브에 파일을 추가하면 모듈을 사용하여 파일의 경로 이름을 재정의할 수 있습니다. 원하는 이름을 선택적 두 번째 인수로 전달하면 됩니다 ZipFile.write.

ZipFile.write(filename[, arcname[,compress_type]])는
filename이라는 파일을 아카이브에 기록하고 아카이브 이름 arcname을 지정합니다(기본적으로 이는 filename과 동일하지만 드라이브 문자가 없고 선행 경로가 포함됨). 구분 기호가 제거되었습니다). 주어진 경우,compress_type은 새 항목의 생성자에 제공된 압축 인수의 값을 재정의합니다.
참고: 아카이브 이름은 아카이브 루트를 기준으로 해야 합니다. 즉, 경로 구분 기호로 시작하면 안 됩니다.

예는 다음과 같습니다.

$ touch 1 2 3
$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
>>> import zipfile
>>> with zipfile.ZipFile('bundle.zip', 'w') as bundle:
...   bundle.write('1', '/bin/1')
...   bundle.write('2', '/sbin/2')
...   bundle.write('3', '/usr/bin/3')
... 
>>> 
$ unzip -l bundle
Archive:  bundle.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2014-08-11 13:00   bin/1
        0  2014-08-11 13:00   sbin/2
        0  2014-08-11 13:00   usr/bin/3
---------                     -------
        0                     3 files

zipfile.write표준을 준수하기 위해 경로 이름에서 선행 "/"가 제거됩니다 .

관련 정보