更新:一步一步的完整解决方案

更新:一步一步的完整解决方案

我需要运行一个curl 命令来访问另一个人拥有密码的网站。

例如 curl --basic --user myfriendsname:friendspassword http://www.updateinfo.com

我需要一种方法来启动这个脚本而无法看到我朋友的密码。

答案1

man curl

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

只需将键盘(或screen/tmux共享)交给他们并让他们输入即可。

答案2

如果您检查过man curl卷曲常见问题解答,您会知道curl--config/-K参数:

指定从哪个配置文件读取curl参数。配置文件是一个文本文件,可以在其中写入命令行参数,然后将像在实际命令行上写入它们一样使用它们。 ...(男子卷曲

例如,您可以使用 存储和解密密码gpg。解密参数为-d

更新:一步一步的完整解决方案

最初我没有提供完整的解决方案,因为那将是给你一条鱼, 当你学习自己钓鱼更有价值。

但由于您似乎真的不确定如何继续,这里有一个Python 3.3 中用于管理 HTTP 密码秘密的快速而肮脏的脚本

只需下载该脚本(或使用 git 克隆存储库),chmod u+x ./curling-with-secrets.py然后使用 运行它./curling-with-secrets --help,您将看到以下内容:

❯ ./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

该脚本通过使用文件路径的加盐哈希值作为密码来加密该文件,从而在其目录中创建secret.enc由变量 给定的文件。这并不能提供高级别的安全性,但任何人都需要花费一些精力才能查看密码,而以明文形式存储密码则使得使用OS X或在 OS X 中意外查看密码变得非常容易。您的朋友可以通过更改加密机制和函数来强化这一点,然后将文件存储在您的用户帐户没有读取权限但具有执行权限的位置,并且由另一个用户和组拥有,假设您没有或访问主机。secretfileopensslsha512sumcatquicklooktoken()sudoersroot

创建后secretfile,脚本将curl使用命令行上传递的指定用户身份验证和 url 来运行。这些选项将传递给STDIN使用curl选项-K -(从 读取配置文件STDIN),格式为curl配置文件。您可以轻松扩展它以满足您的以下需求man curl。 :)

我不太喜欢 Python,所以这个脚本中可能存在一些问题,但这对您来说可能是一个很好的起点。你绝对应该彻底测试它。

这是脚本的完整来源:

#!/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()

相关内容