Я хочу написать сценарий, который загружает архив из URL (используя wget) и извлекает этот архив (например, используя atool, см. здесь).
К сожалению, я не знаю где wget сохраняет загруженный файл. Мой скрипт параметризуется URL-адресом, поэтому я не знаю URL-адреса во время написания сценария.
Я не знаю URL-адреса, когда пишу скрипт ? Обратите внимание, что я хочу извлечь загруженный файл, поэтому расширение файла может быть важным.
В общем, трудно / невозможно предсказать местоположение, которое 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 гарантирует, что имя файла уникально и что разрешения обрабатываются так, что мы надеваем 't заканчивает запись в файл, который принадлежит другому пользователю. Файл создается с помощью mktemp с безопасными разрешениями:
[~]$ ls -la $filename
-rw------- 1 vidarlo users 1270 Aug 10 2013 /tmp/tmp.DglaA1x2Z0
Таким образом у вас будет имя файла, которое, как гарантируется, не будет использоваться ни для чего, и вы уверены, что не будете в зависимости от условий гонки, потому что другой пользователь заставляет вас писать в файл с катастрофическими результатами.
Теперь, когда у вас есть файл с определенным именем файла, вы можете запустить file, чтобы определить, какой архив он is:
[/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 во временный файл. Посмотрите на 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 гарантирует, что имя файла уникально и что разрешения обрабатываются так, что мы надеваем 't заканчивает запись в файл, который принадлежит другому пользователю. Файл создается с помощью mktemp с безопасными разрешениями:
[~]$ ls -la $filename
-rw------- 1 vidarlo users 1270 Aug 10 2013 /tmp/tmp.DglaA1x2Z0
Таким образом у вас будет имя файла, которое, как гарантируется, не будет использоваться ни для чего, и вы уверены, что не будете в зависимости от условий гонки, потому что другой пользователь заставляет вас писать в файл с катастрофическими результатами.
Теперь, когда у вас есть файл с определенным именем файла, вы можете запустить file, чтобы определить, какой архив он is:
[/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 во временный файл. Посмотрите на 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 гарантирует, что имя файла уникально и что разрешения обрабатываются так, что мы надеваем 't заканчивает запись в файл, который принадлежит другому пользователю. Файл создается с помощью mktemp с безопасными разрешениями:
[~]$ ls -la $filename
-rw------- 1 vidarlo users 1270 Aug 10 2013 /tmp/tmp.DglaA1x2Z0
Таким образом у вас будет имя файла, которое, как гарантируется, не будет использоваться ни для чего, и вы уверены, что не будете в зависимости от условий гонки, потому что другой пользователь заставляет вас писать в файл с катастрофическими результатами.
Теперь, когда у вас есть файл с определенным именем файла, вы можете запустить file, чтобы определить, какой архив он is:
[/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 или здесь.
По умолчанию wget сохраняет каталог .. Однако вы можете переопределить это, используя опцию -P или --directory-prefix. Итак, чтобы сохранить файлы в /tmp/some_folder, вы должны использовать wget ... -P tmp/some_folder ....
Подробности для использования wget можно найти локально в команде man wget или здесь.
По умолчанию wget сохраняет каталог .. Однако вы можете переопределить это, используя опцию -P или --directory-prefix. Итак, чтобы сохранить файлы в /tmp/some_folder, вы должны использовать wget ... -P tmp/some_folder ....
Подробности для использования wget можно найти локально в команде man wget или здесь.