Resolve nome do arquivo de um URL remoto sem fazer download de um arquivo

5

Estou criando um script, que deve baixar a versão mais recente de um aplicativo do repositório e implantar o aplicativo.

A questão principal: existem vários repositórios e eu preciso verificar qual deles tem a versão mais recente.

Por exemplo,

http://repo1/xyz/LATEST -> (redirects to) -> http://repo1/xyz/app-1.0.0.0.zip
http://repo2/xyz/LATEST -> (redirects to) -> http://repo1/xyz/app-1.1.0.0.zip

Por isso, preciso fazer uma iteração dos repositórios disponíveis e obter apenas um nome de arquivo - não é necessário fazer o download de versões obsoletas do software.

    
por user1065145 24.04.2014 / 09:21

2 respostas

6

Algo parecido com isso pode funcionar para você:

curl -sIkL http://repo1/xyz/LATEST | sed -r '/filename=/!d;s/.*filename=(.*)$//'

Dê uma olhada na página de manual curl(1) para as opções. O interessante é -I, --head .

Explicação conforme solicitado por comentários:

A ideia é solicitar apenas o cabeçalho de resposta HTTP.

Portanto, as opções -I são usadas. -s silents ondulam para não imprimir nada além do cabeçalho. -k permite conexões SSL "inseguras" (o curl rejeitaria os certificados autoassinados de outra forma). E -L para seguir redirecionamentos de localização HTTP (S).

Em seguida, sed(1) é usado para obter o nome do arquivo do cabeçalho de resposta. Estamos pesquisando o campo filename= , portanto, a parte /filename=/!d remove qualquer coisa sem esse campo da saída. Finalmente, a parte s/.*filename=(.*)$// imprime o nome do arquivo apenas se o campo for encontrado.

    
por 24.04.2014 / 09:46
4

Eu saí com essa solução, bastante semelhante à da @FloHeself.

curl -L --head http://repo1/xyz/LATEST 2>/dev/null | grep Location: | tail -n1 | cut -d' ' -f2
  • -L deixa curl seguir o redirecionamento
  • --head faz com que ele busque apenas os cabeçalhos e não o conteúdo das páginas.
  • grep Location: procura o cabeçalho Location: em 30x respostas HTTP pelo servidor
  • tail -n1 seleciona o último
  • cut -d' ' -f2 seleciona o segundo campo (o URL)

O mesmo, mas deixando curl fazer todo o trabalho:

curl -L --head -w '%{url_effective}' http://repo1/xyz/LATEST  2>/dev/null | tail -n1

Esta solução usa a opção -w, --write-out para solicitar curl para uma saída específica. man curl fornece as variáveis disponíveis.

    
por 24.04.2014 / 10:00