A forma geral de um comando curl no CMD que funciona é:
curl -o latest.dump -L " https://s3.amazonaws.com/hkpgbackups/[email protected]/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_url
mostra 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_escape
biblioteca 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: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/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
fonte
Respostas:
Olhando para o seu script publicado originalmente:
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:Você pode modificar o comando para fazê-lo funcionar, independentemente de
%this_url%
conter aspas, removendo as aspas existentes e adicionando explicitamente as suas:O outro comando que você lista parece completamente errado para mim:
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.fonte