我需要运行一个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 中意外查看密码变得非常容易。您的朋友可以通过更改加密机制和函数来强化这一点,然后将文件存储在您的用户帐户没有读取权限但具有执行权限的位置,并且由另一个用户和组拥有,假设您没有或访问主机。secretfile
openssl
sha512sum
cat
quicklook
token()
sudoers
root
创建后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()