Как я могу скачать и извлечь архив, используя скрипт (как я могу надежно указать файл, который был загружен для последующей команды)?

Я хочу написать скрипт, который загружает архив с 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
0
задан 31 December 2017 в 17:40

2 ответа

Сначала сделайте 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, поскольку он может иметь очень много непреднамеренных последствий.

4
ответ дан 31 December 2017 в 17:40

По умолчанию wget сохраняется в каталог .. Однако вы можете переопределить это, используя опцию -P или --directory-prefix. Итак, чтобы сохранить файлы в /tmp/some_folder, вы должны использовать wget ... -P tmp/some_folder .... «Хитрость» заключается в понимании правильной используемой терминологии (префикс не кажется особенно интуитивным).

Подробности использования wget можно найти локально по команде man wget, или онлайн здесь .

0
ответ дан 31 December 2017 в 17:40

Другие вопросы по тегам:

Похожие вопросы: