Linux에서 이 명령을 실행하려고 합니다.
tar zcvf ABCD.tar.gz -T Files.txt
다음 오류가 발생합니다.
Error: tar: Removing leading `/' from member names
기반으로찾기/SED crontab의 한 줄 tar 문에서 절대 경로를 상대 경로로 변환, 다음 명령을 시도했습니다.
tar -C / -zcvf ABCD.tar.gz -T Files.txt
하지만 여전히 같은 오류 메시지가 나타납니다.
답변1
이것은 특징입니다!
압축 및 추출 중에 아카이브에 슬래시 접두사가 포함되어 있으면 /
공격자가 중요한 파일(예: /etc/shadow
)을 추출하도록 유도하여 해당 파일을 덮어쓸 수 있다는 의미입니다.
실제로는 오류 메시지가 아니라 메시지입니다.
실제로 비활성화하려면 디렉터리를 상위 디렉터리로 변경하고 상대 이름을 사용하십시오.
cd /
tar -zcvf path/to/files
대신에
tar -zcvf /path/to/files
귀하의 경우에는 파일 이름이 -T Files.txt
절대 위치라고 생각합니다.
답변2
GNU tar에서 파일 이름의 선행 슬래시를 유지하려면 필요한 옵션은 다음과 같습니다.
-P, --absolute-names
Don't strip leading slashes from file names when creating archives.
그래서, tar zcvf ABCD.tar.gz -P -T Files.txt
.
물론 슬래시를 사용하지 않는 한 아카이브를 추출할 때 슬래시가 제거될 수 있습니다 -P
.
반면, 슬래시를 제거하고 싶지만 tar가 불평하는 것을 원하지 않으면 비슷한 작업을 수행해야 합니다 sed s,^/,, files.txt | tar czf foo.tar.gz -C / -T -
.
답변3
또 다른 가능한 대답은 아카이브가 안전하게 추출할 수 있는 경로 이름을 갖기를 원하고 파일 목록에서 선행 슬래시를 제거하기를 원한다는 것입니다.
이 경우 옵션은 없지만 호환 파일 tar
생성을 사용할 수 있습니다 .tar
pax
pax -s '#^/##' -wz < Files.txt > ABCD.tar.gz
-s '#^/##'
파일이 아카이브에 기록될 때 파일 이름에 대체 패턴이 적용됩니다. 이것은 선도적인 것을 빼앗는다 /
.