서버에 업로드 된 큰 zip 파일이 있고 필요한 것이 있다면 그 중 일부는 내용이고, 여는 방법이 있습니까? 다운로드 할 파일을 선택하십시오.
서버에 업로드 된 큰 zip 파일이 있고 필요한 것이 있다면 그 중 일부는 내용이고, 여는 방법이 있습니까? 다운로드 할 파일을 선택하십시오.
답변:
나는 파이썬 스크립트를 썼다. list_remote_zip.py
HTTP를 통해 액세스 할 수있는 zip 파일의 파일을 나열 할 수 있습니다.
import urllib2, struct, sys
def open_remote_zip(url, offset=0):
return urllib2.urlopen(urllib2.Request(url, headers={'Range': 'bytes={}-'.format(offset)}))
offset = 0
zipfile = open_remote_zip(sys.argv[1])
header = zipfile.read(30)
while header[:4] == 'PK\x03\x04':
compressed_len, uncompressed_len = struct.unpack('<II', header[18:26])
filename_len, extra_len = struct.unpack('<HH', header[26:30])
header_len = 30 + filename_len + extra_len
total_len = header_len + compressed_len
print('{}\n offset: {}\n length: {}\n header: {}\n payload: {}\n uncompressed length: {}'.format(zipfile.read(filename_len), offset, total_len, header_len, compressed_len, uncompressed_len))
zipfile.close()
offset += total_len
zipfile = open_remote_zip(sys.argv[1], offset)
header = zipfile.read(30)
zipfile.close()
파일의 끝 부분에있는 zip 파일의 중앙 디렉토리를 사용하지 않습니다. 대신, 처음부터 시작하여 개별 로컬 헤더를 구문 분석하고 페이로드를 건너 뛰고 다른 헤더에 착륙하기를 원합니다. 오프셋으로 건너 뛸 때마다 새로운 요청을 보냅니다. 물론 이것은 서버를 지원하는 서버에서만 작동합니다. Range
HTTP 헤더.
명령 줄 인수로 URL을 zip 파일로 전달하면됩니다. 사용 예제와 출력은 다음과 같이 보일 것입니다 :
$ python list_remote_zip.py http://dl.xonotic.org/xonotic-0.8.1.zip
Xonotic/Makefile
offset: 0
length: 1074
header: 46
payload: 1028
uncompressed length: 5019
Xonotic/source/darkplaces/
offset: 1074
length: 56
header: 56
payload: 0
uncompressed length: 0
Xonotic/source/darkplaces/bih.h
offset: 1130
length: 1166
header: 61
payload: 1105
uncompressed length: 2508
Xonotic/source/darkplaces/portals.h
offset: 2296
length: 334
header: 65
payload: 269
uncompressed length: 648
...
파일 중 하나를 다운로드하려면, 나는 더 끔찍한 글을 썼다. get_file_from_remote_zip.sh
주위에 그것을 사용하는 bash 스크립트 wget
:
info=$(python list_remote_zip.py "$1" | grep -m 1 -A 5 "^$2\$" | tail -n +2)
tmpfile=$(mktemp)
wget --start-pos $(echo "$info" | grep offset | grep -o '[[:digit:]]*') -O - "$1" | head -c $(echo "$info" | grep -m 1 length | grep -o '[[:digit:]]*') >"$tmpfile"
printf '\x1f\x8b' # gzip magic
tail -c +9 <"$tmpfile" | head -c 1 # copy compression method
printf '\0\0\0\0\0\0\x03' # some flags and mtime
tail -c "+$(expr 1 + $(echo "$info" | grep header | grep -o '[[:digit:]]*'))" <"$tmpfile"
tail -c +15 <"$tmpfile" | head -c 4 # The CRCs seem to be compatible.
tail -c +23 <"$tmpfile" | head -c 4
rm "$tmpfile"
2 개의 인수가 필요합니다. 첫 번째 파일은 압축 파일의 URL이고 두 번째 파일은 추출 할 파일입니다. 추출 할 파일의 이름은 이전의 파일에 표시된대로 완전해야하며 정확하게 입력해야합니다. list_remote_zip.py
Python 스크립트는 파일에 대한 정보를 얻기 위해 사용합니다. 그런 다음 wget
적절한 길이로 오른쪽 오프셋에서 다운로드하십시오. 이 zip "슬라이스"를 임시 파일에 저장 한 다음 임시 파일에 gzip
-formatted 파일은 다음에 파이프되어 압축 해제 될 수 있습니다. gzip
. "슬라이스"자체는 끝에 중앙 디렉토리가 없기 때문에 유효한 zip 파일이 아닙니다. 수정 가능 zip
'에스 -FF
옵션을 사용했지만 헤더를 조금 변경하고 gzip 파일로 변환하기로 결정했습니다. 모두 (PK) zip과 gzip은 같은 것을 사용합니다. 꺾다 압축 알고리즘 및 CRC-32 체크섬조차도 호환되는 것처럼 보입니다.
다음은 Xonotic의 아카이브에서 무작위 파일을 다운로드하는 방법의 예입니다. http://dl.xonotic.org/xonotic-0.8.1.zip 압축을 풀고 로컬 파일에 저장합니다.
bash get_file_from_remote_zip.sh http://dl.xonotic.org/xonotic-0.8.1.zip Xonotic/source/darkplaces/mprogdefs.h | gzip -d >mprogdefs.h
list_remote_zip.py
. 그래서 파이썬을 설치했다면 그것을 실행할 수 있고 URL을 zip 파일에 다음과 같이 커맨드 라인 인자로 넘겨 줄 수 있습니다 : python list_remote_zip.py http://dl.xonotic.org/xonotic-0.8.1.zip
서버가 다시 시작된 다운로드를 지원한다고 가정하면 이론적으로이 작업을 수행하는 클라이언트를 작성할 수 있습니다. 디렉토리를 확보하기 위해 충분히 큰 블록을 잡고 그 정보를 사용하여 실제로 데이터를 가져 오기 위해 필요한 것을 파악합니다 - 데이터가 충분할 때만 해당 위치에서 다운로드를 시작하고 중지하십시오. 내가 주변을 샅샅이 뒤 졌을 때부터 너무 오랜 세월이 지났습니다. 무차별 공격이 아닌 디렉토리의 시작을 찾는 방법이 있다는 것을 상기하지 않습니다.
나는 그런 클라이언트의 결코 전해 듣지 않으며 왜 사람이 개발 될지 상상할 수 없다 - 합리적으로 조각에서 다운로드되고 그 후에 웹 마스터가 1 개의 큰 zip 파일로 그것을 저장하는 왜 인 경우에 ???
rar x --kb myincompletefile.rar
. 에 대한7zip
이 대답조차 보아라. . 어떤 종류의 서버입니까? 당신이 사용하고 있습니까?zip
그냥 압축을하거나 엄격히 말하면됩니다.zip
파일?