Se você tivesse verificado man curl
ou o curl FAQ , você saberia que curl
tem o parâmetro --config
/ -K
para:
Specify which config file to read curl arguments from. The config file
is a text file in which command line arguments can be written
which then will be used as if they were written on the actual command
line.
... (man curl)
Por exemplo, você pode armazenar e descriptografar a senha com gpg
. O parâmetro de decodificação é -d
.
Atualização: uma solução completa passo-a-passo
Inicialmente, não forneci uma solução completa, porque isso seria dar-lhe um peixe , quando você aprender a pescar-se é mais valioso.
Mas, como você parece não ter certeza sobre como proceder, veja um script rápido e sujo no Python 3.3 para gerenciar o segredo da senha HTTP .
Basta fazer o download desse script (ou clone repo com git), chmod u+x ./curling-with-secrets.py
e, em seguida, executá-lo com ./curling-with-secrets --help
, e você verá isso:
❯ ./curling-with-secrets.py --help
usage: curling-with-secrets.py [-h] [--secretfile [SECRETFILE]] user url
This is curling-with-secrets by Guy Hughes.
positional arguments:
user the username to pass to curl
url the url to pass to curl
optional arguments:
-h, --help show this help message and exit
--secretfile [SECRETFILE]
specify an alternative secret file
O script cria um arquivo, secret.enc
fornecido pela variável secretfile
, em seu diretório usando openssl
para criptografar o arquivo usando o hash sha512sum
salted do caminho do arquivo como a frase secreta. Isso não fornece um alto nível de segurança, mas seria necessário um pouco de esforço para que qualquer pessoa visualizasse a senha, enquanto armazená-la em texto não criptografado torna a exibição da senha acidentalmente fácil com cat
ou quicklook
no OS X. Seu amigo poderia endurecer isso alterando o mecanismo de criptografia e a função token()
e, em seguida, armazenando o arquivo em um local em que sua conta de usuário não possui permissões de leitura, mas possui permissões de execução e de outro usuário e grupo, supondo não tem sudoers
ou root
de acesso ao host.
Depois que o secretfile
for criado, o script executará curl
com a autenticação de usuário especificada e a URL passada na linha de comando. Essas opções são passadas para STDIN
to curl
usando a opção -K -
(que lê um arquivo de configuração de STDIN
), formatada como um arquivo de configuração curl
. Você pode estender isso facilmente para atender às suas necessidades seguindo man curl
. :)
Eu não sou muito de uma pessoa Python, então provavelmente há alguns problemas neste script, mas pode ser um bom ponto de partida para você. Você deve definitivamente testá-lo completamente.
Aqui está a fonte completa do script:
#!/usr/bin/env python3.3
# Guy Hughes, 2014
# GNU General Public License Version 3, 29 June 2007
from sys import stdin
from sys import stdout
import os
import argparse
#from sys import os.environ
#from sys import os.access
#from sys import os.mkdirs
#from sys import os.path
import subprocess
import errno
import getpass
def init():
global args
global secretfile
global secretfiledir
# parse args
parser = argparse.ArgumentParser(description='This is curling-with-secrets by Guy Hughes.')
parser.add_argument('--secretfile',nargs='?',help='specify an alternative secret file',type=str)
parser.add_argument('user', help='the username to pass to curl',type=str)
parser.add_argument('url', help='the url to pass to curl',type=str)
args=parser.parse_args()
#secretfile=os.path.abspath(os.environ.get('XDG_CONFIG_HOME',os.environ.get('HOME') + "/.config") + "/secretcurl/secret.enc")
if args.secretfile:
secretfile = os.path.abspath(args.secretfile)
else:
secretfile=os.path.abspath('./secret.enc')
secretfiledir=os.path.dirname(secretfile)
if check():
curl()
def check():
if os.path.isfile(secretfile) and os.access(secretfile, os.R_OK):
print("I found secretfile at %s. [OK]" % secretfile)
return True
else:
print("I did not find the secretfile at %s. We'll now create it..." % secretfile)
return createfile()
def token():
echop=subprocess.Popen(["echo", secretfile], stdout=subprocess.PIPE)
shap=subprocess.Popen(['sha512sum'],stdout=subprocess.PIPE,stdin=echop.stdout)
grepp=subprocess.Popen(['grep', '-Eo','\'^.{40}\''],stdout=subprocess.PIPE,stdin=shap.stdout)
echop.stdout.close()
shap.stdout.close()
result=grepp.communicate()[0]
return result
def createfile():
# safety check
if os.path.isfile(secretfile):
print("FATAL: secretfile exists at %s" % secretfile)
print("Stopping, to prevent secretfile from being overriden.")
print("If you wish to overwrite the secretfile, first delete it yourself this run this command again.")
exit(1)
print("Creating the secretfile at %s" % secretfile)
print("Remember: Once the secret file is created, this script"
" will only be able to decrypt while it is in the same directory and filename."
"If you ever wish to rename the secretfile, you'd need to modify this script "
"or recreate the secretfile using this script.")
print("Checking for directory %s" % secretfiledir)
if not os.path.exists(secretfiledir):
sys.stdout.write("Making directories...")
os.makedirs(secretfiledir, exist_ok=True)
else:
print("Parent directories are OK")
print("Please enter the secret password to be passed to curl:")
password=getpass.getpass()
thetoken = token()
echop=subprocess.Popen(['echo',password],stdout=subprocess.PIPE)
opensslp=subprocess.Popen(['openssl', 'enc', '-aes-256-cbc',
'-salt', '-a',
'-k', thetoken,
'-out', secretfile
], stdin=echop.stdout)
echop.stdout.close()
del password
del thetoken
print("Createfile done.")
return True
def curl():
print("Decrypting the password...")
thetoken=token()
opensslp=subprocess.Popen(['openssl','enc','-aes-256-cbc','-d', '-a','-k',thetoken,
'-in', secretfile],stdout=subprocess.PIPE)
password=opensslp.communicate()[0].decode('utf-8')
print(args)
print(args.url)
print(password)
curlconfig="user = " + args.user + "\:" + password + "\nurl = " + args.url
curlp=subprocess.Popen(['curl','--basic', '-K', '-'],
stdin=subprocess.PIPE,stderr=subprocess.STDOUT,shell=False)
result=curlp.communicate(input=bytes(curlconfig, 'UTF-8'))
print(result)
del password
init()