Como executar um comando com uma senha oculta

2

Eu preciso executar um comando curl que acessa um site para o qual outra pessoa tem a senha.

por exemplo. curl --basic --user myfriendsname:friendspassword http://www.updateinfo.com

Eu preciso de uma maneira de lançar esse script sem poder ver a senha do meu amigo.

    
por Joshua Robison 20.05.2014 / 00:48

2 respostas

5

De man curl :

-u, --user <user:password>
  ...
  If you just give the user name (without entering a colon) curl will prompt
  for a password.
  ...

Basta passar o teclado para eles (ou um screen / tmux share) para que eles digitem.

    
por 20.05.2014 / 01:06
3

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()
    
por 20.05.2014 / 01:08