Я хочу написать скрипт, который загружает архив с URL (используя wget
) и извлекает этот архив (например, используя atool
, см. здесь ).
К сожалению, я не знаю, куда wget
сохраняет загруженный файл. Мой сценарий параметризован по URL, поэтому я не знаю URL, когда пишу сценарий .
Как я могу извлечь файл, загруженный wget
, если я не знаю местоположение, которое wget
сохраняет в ? Обратите внимание, что я хочу извлечь загруженный файл, поэтому расширение файла может быть важным.
В общем, трудно / невозможно предсказать местоположение, в которое wget
сохраняет. В качестве нескольких примеров,
wget example.com
создает файл index.html
wget example.com
во второй раз создает файл index.html.2
wget http://dis.images.s3.amazonaws.com/105024.jpeg
создает файл 105024.jpeg
wget "https://go.microsoft.com/fwlink/?LinkID=760868"
создает файл index.html?LinkID=760868
wget --content-disposition "https://go.microsoft.com/fwlink/?LinkID=760868"
создает файл code_1.19.1-1513676564_amd64.deb
Сначала сделайте wget
вывод во временный файл. Взгляните на mktemp
, который позволяет Вам сделать временный файл безопасным способом:
[~]$ filename=$(mktemp)
[~]$ echo $filename
/tmp/tmp.DglaA1x2Z0
[~]$ wget -O $filename www.example.com
--2017-12-29 22:15:28-- http://www.example.com/
Resolving www.example.com (www.example.com)... 93.184.216.34, 2606:2800:220:1:248:1893:25c8:1946
Connecting to www.example.com (www.example.com)|93.184.216.34|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1270 (1.2K) [text/html]
Saving to: ‘/tmp/tmp.DglaA1x2Z0’
100%[======================================>] 1,270 --.-K/s in 0s
2017-12-29 22:15:30 (156 MB/s) - ‘/tmp/tmp.DglaA1x2Z0’ saved [1270/1270]
mktemp
гарантии, что имя файла уникально, и что полномочия обрабатываются так, чтобы мы не заканчивали тем, что писали в файл, который принадлежит некоторому другому пользователю. Файл создается mktemp
с безопасными полномочиями:
[~]$ ls -la $filename
-rw------- 1 vidarlo users 1270 Aug 10 2013 /tmp/tmp.DglaA1x2Z0
Таким образом, у Вас будет имя файла, которое, как гарантируют, не будет использоваться для чего-либо, и Вы уверены, что не подвергнетесь условиям состязания, потому что другой пользователь обманывает Вас в запись в файл с катастрофическими результатами.
Теперь, когда у Вас есть файл с решительным именем файла, можно работать file
для определения, какой архив это:
[/tmp]$ file -i foo.tar
foo.tar: application/x-tar; charset=binary
[/tmp]$ file -i foo.7z
foo.7z: application/x-7z-compressed; charset=binary
Это не полагается на то, что удаленный сервер говорит нам. Сервер мог сказать Вам расширение - или нет. Сценарий PHP может служить совершенно допустимому архиву tar, никогда не говоря Вам, что это - архив tar.
Кроме того, мы сохраняем содержание к безопасному месту, избегая условий состязания.
Поддержка большого количества форматов архива может стать громоздким использованием этого подхода, но это, конечно, лучше, чем использование просто расширения файла от веб-сервера, дающего нам архив.
Обратите внимание, что Вы никогда не должны анализировать ls, поскольку он может иметь очень много непреднамеренных последствий.
По умолчанию wget
сохраняется в каталог .
. Однако вы можете переопределить это, используя опцию -P
или --directory-prefix
. Итак, чтобы сохранить файлы в /tmp/some_folder
, вы должны использовать wget ... -P tmp/some_folder ...
. «Хитрость» заключается в понимании правильной используемой терминологии (префикс не кажется особенно интуитивным).
Подробности использования wget
можно найти локально по команде man wget
, или онлайн здесь .