Como posso aplicar aspas a um URL em um script .bat?


0

A forma geral de um comando curl no CMD que funciona é:

curl -o latest.dump -L " https://s3.amazonaws.com/hkpgbackups/app28197640@heroku.com/xxxx.dump?AWSAccessKeyId=AKIAJSCBEZJRDOTGNGZQ&Expires=1411489500&Signature=%2F5zwQNZNNNNB03 "

Mas o URL é gerado dinamicamente, para que eu coloque isso em um script .bat. OK, não há problema, então aqui está o meu script .bat que, no papel, deve funcionar.

@echo off

for /f "delims=" %%a in ('heroku pgbackups:url') do @set this_url=%%a
ECHO %this_url%
curl -v -o latest.dump -L %this_url%

Mas a saída falha porque no primeiro 'e' como você poderia esperar. O eco de this_urlmostra a cadeia completa entre aspas. Como posso acrescentar, ou forçar, a encapsular essa seqüência de caracteres entre aspas?

Eu tentei, mas ele retorna o mesmo tipo de erro:

cmd /k ""curl -v -o latest.dump -l" "('heroku pgbackups:url')""

Alguns podem perguntar por que não fazer isso no Unix ou no CYGWIN? Eu fiz isso primeiro. O comando funciona perfeitamente na minha máquina pessoal OS X. Por isso, deve funcionar no CYGWIN? Bem, eu recebo o mesmo tipo de erros.

Eu tentei incorporar um script Perl usando a uri_escapebiblioteca e o inseri. Mas o URL que ele passa não é reconhecido por curl.

Forçar a saída entre aspas simples altera o URL no início correto, mas a aspas simples de fechamento é colocada nos últimos caracteres do URL, o que torna inútil o enrolamento.

A saída de heroku pgbackups:urlno console do CMD é:

"https://s3.amazonaws.com/hkpgbackups/app28197640@heroku.com/b080.dump?AWSAccess
KeyId=AKIAJSCBEZJRDOTGNGZQ&Expires=1411657655&Signature=MqzqBitAN7MADiLAsdAN4ZQk
RH0%3D"

A saída do arquivo .bat acima é:

https://s3.amazonaws.com/hkpgbackups/app28197640@heroku.com/b080.dump?AWSAccessK
eyId=AKIAJSCBEZJRDOTGNGZQ
'Expires' is not recognized as an internal or external command,
operable program or batch file.
'Signature' is not recognized as an internal or external command,
operable program or batch file.
* About to connect() to s3.amazonaws.com port 443 (#0)
*   Trying 205.251.243.66...   % Total    % Received % Xferd  Average Speed   Ti
me    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0co
nnected
* Connected to s3.amazonaws.com (205.251.243.66) port 443 (#0)
* SSLv3, TLS handshake, Client hello (1):
} [data not shown]
* SSLv3, TLS handshake, Server hello (2):
{ [data not shown]
* SSLv3, TLS handshake, CERT (11):
{ [data not shown]
* SSLv3, TLS handshake, Server finished (14):
{ [data not shown]
* SSLv3, TLS handshake, Client key exchange (16):
} [data not shown]
* SSLv3, TLS change cipher, Client hello (1):
} [data not shown]
* SSLv3, TLS handshake, Finished (20):
} [data not shown]
* SSLv3, TLS change cipher, Client hello (1):
{ [data not shown]
* SSLv3, TLS handshake, Finished (20):
{ [data not shown]
* SSL connection using AES128-SHA
* Server certificate:
*        subject: C=US; ST=Washington; L=Seattle; O=Amazon.com Inc.; CN=s3.amazo
naws.com
*        start date: 2014-04-12 00:00:00 GMT
*        expire date: 2015-04-13 23:59:59 GMT
*        subjectAltName: s3.amazonaws.com matched
*        issuer: C=US; O=VeriSign, Inc.; OU=VeriSign Trust Network; OU=Terms of
use at https://www.verisign.com/rpa (c)10; CN=VeriSign Class 3 Secure Server CA
- G3
*        SSL certificate verify result: unable to get local issuer certificate (
20), continuing anyway.
> GET /hkpgbackups/app28197640@heroku.com/b080.dump?AWSAccessKeyId=AKIAJSCBEZJRD
OTGNGZQ HTTP/1.1
> User-Agent: curl/7.21.7 (amd64-pc-win32) libcurl/7.21.7 OpenSSL/0.9.8r zlib/1.
2.5
> Host: s3.amazonaws.com
> Accept: */*
>
< HTTP/1.1 403 Forbidden
< x-amz-request-id: 4566C5AB208C1248
< x-amz-id-2: zF/zr+fbR/pE7nvF7vvUmOdZQeMzjSBI6SPLKH14LGAI5JAb2xyoLhuuDGBDhqcq
< Content-Type: application/xml
< Transfer-Encoding: chunked
< Date: Thu, 25 Sep 2014 14:51:46 GMT
< Server: AmazonS3
<
{ [data not shown]
100   231    0   231    0     0    592      0 --:--:-- --:--:-- --:--:--   704
* Connection #0 to host s3.amazonaws.com left intact
* Closing connection #0
* SSLv3, TLS alert, Client hello (1):
} [data not shown]
'Expires' is not recognized as an internal or external command,
operable program or batch file.
'Signature' is not recognized as an internal or external command,
operable program or batch file.

O erro 403 indica que o URL foi bloqueado, mas, caso contrário, ele passou ou eu teria recebido um erro 400. Por alguma razão no script, o "&" é redirecionado porque é interpretado no script.

Se você fosse eu, como você executaria esse comando passar dinamicamente esse URL para que não seja interpretado pelo CMD, bash, etc? thanx, sam


Você pode mostrar o resultado do comando ECHO que parece bom, mas o valor falha quando usado com curl? Algo não faz sentido. Se você puder ECO o valor, e ele estiver entre aspas, ele também funcionará com curvatura.
dbenham

Sim, algo não faz sentido. O ECHO% this_url% retorna " s3.amazonaws.com/hkpgbackups/app28197640@heroku.com/… ".
sam452 24/09/14

Não entendo como "A saída da opção curl --verbose é: ..." está relacionada ao seu código postado. Qual é a saída exata do seu script em lote publicado originalmente?
precisa saber é o seguinte

Respostas:


0

Olhando para o seu script publicado originalmente:

@echo off

for /f "delims=" %%a in ('heroku pgbackups:url') do @set this_url=%%a
ECHO %this_url%
curl -v -o latest.dump -L %this_url%

Se a saída de ECHO %this_url%for exatamente como você postou, com aspas, o script em lote existente deverá funcionar.

Se o valor de %this_url%não tiver aspas, você deve adicionar aspas ao comando curl:

curl -v -o latest.dump -L "%this_url%"

Você pode modificar o comando para fazê-lo funcionar, independentemente de %this_url%conter aspas, removendo as aspas existentes e adicionando explicitamente as suas:

curl -v -o latest.dump -L "%this_url:"=%"

O outro comando que você lista parece completamente errado para mim:

cmd /k ""curl -v -o latest.dump -l" "('heroku pgbackups:url')""

As aspas externas não devem ser necessárias, nem as aspas ao redor "curl -v -o latest.dump -l". Você pode colocar aspas apenas no arquivo exe "curl", mas isso não deve ser necessário, a menos que você inclua o caminho para enrolar e o caminho inclua espaços ou caracteres suspeitos.

Eu simplesmente não entendo a "('heroku pgbackups:url')"sintaxe.


Sim, obrigado por me orientar nisso. A saída do comando heroku pgbackups: url produz o URL extra longo. Tentei executar seu comando para adicionar explicitamente minhas próprias cotações, obtendo o mesmo resultado acima: para cada "&" no comando, o analisador está lendo cada um como um comando separado e a curvatura falha. Acontece que cada um faz parte da autenticação da Amazon criada na URL. Eu tentei capturar cada uma dessas partes em variáveis ​​separadas e concatená-las no comando, mas por algum motivo, apenas concatenará uma variável.
sam452 29/09/14

O problema é que, para esse URL longo, o Windows está adicionando um retorno de carro que mede o URL, pelo menos no cygwin. Para que eu possa rodar no cygwin canalizando a saída do comando heroku para o dos2unix. Quanto a fazê-lo funcionar no CMD, .BAT provavelmente existe uma resposta, mas agora funciona no cygwin.
precisa saber é
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.