A forma geral de um comando curl no CMD que funciona é:
curl -o latest.dump -L " link "
Mas a URL é gerada dinamicamente para que eu coloque isso em um script .bat. OK, não há problema, então aqui está 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 se aplica porque no primeiro '&' Como você pode esperar. O eco de this_url
mostra a string completa com aspas. Como posso acrescentar ou forçar a encapsular essa string com 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 do OS X. Então, deveria funcionar no CYGWIN? Bem, eu recebo o mesmo tipo de erros.
Eu tentei incorporar um script Perl usando a biblioteca uri_escape
e inseri-lo. Mas o URL que ele passa não é reconhecido por curl.
Forçar a saída entre aspas simples munges a URL em que ele começa correto, mas a aspa simples de fechamento é colocada dentro dos últimos caracteres da URL que torna inútil para enrolar.
A saída de heroku pgbackups:url
no console do CMD é:
"https://s3.amazonaws.com/hkpgbackups/[email protected]/b080.dump?AWSAccess
KeyId=AKIAJSCBEZJRDOTGNGZQ&Expires=1411657655&Signature=MqzqBitAN7MADiLAsdAN4ZQk
RH0%3D"
A saída do arquivo .bat acima é:
https://s3.amazonaws.com/hkpgbackups/[email protected]/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/[email protected]/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 removido, mas, caso contrário, ele passou ou eu teria recebido um erro 400. Por algum motivo no script, o "&" são redirecionados porque são interpretados no script.
Se você fosse eu, como você executaria esse comando dinamicamente passasse essa URL para que ela não fosse interpretada por CMD, bash, etc? thanx, sam