将bash变量传递给python命令[关闭]
Posted
技术标签:
【中文标题】将bash变量传递给python命令[关闭]【英文标题】:Pass bash variable to python command [closed] 【发布时间】:2019-06-22 01:10:07 【问题描述】:我正在尝试使用两个参数做一个基本的密码加密脚本,但我无法让它工作:
#!/usr/bin/bash
set -x
trap read debug
export ppwd=$2;
export usr=$1;
pwd=$(python -c 'import crypt, os,base64; print crypt.crypt("str(os.environ['ppwd'])", "$6$"+base64.b64encode(os.urandom(24))+"$")');
echo $ppwd;
echo $usr:$pwd|chpasswd -ec
我尝试使用常规 bash 脚本变量,打印 os.environ['ppwd'] 而不是 str(os.environ['ppwd']。 该脚本应该更改 AIX 环境的密码,但它不起作用。 如果我使用 python 命令和 chpasswd 手动执行它,它会起作用。我的猜测是它不会将变量传递给 python 命令.. 调试:
./sc.sh testuser MyPass134
+ trap read debug
++ read
+ export ppwd=MyPass134
+ ppwd=MyPass134
++ read
+ export usr=testuser
+ usr=testuser
++ read
++ python -c 'import crypt, os,base64; print
crypt.crypt("str(os.environ[ppwd]", "$6$"+base64.b64encode(os.urandom(24))+"$")'
+ pwd=bbdf5picgZM4.
++ read
+ echo
++ read
+ echo testuser:bbdf5picgZM4.
++ read
+ chpasswd -ec
【问题讨论】:
你只是有错字吗?ppw
与 ppwd
?
您设置了 ppw 变量,但您调用了 os.environ['ppwd']
。是不是打错字了?
当您输入 python -c 'import crypt ... "str(os.environ['ppwd'])"
时。这与您键入python -c 'import crypt ... "str(os.environ[ppwd])"
完全相同,因为ppwd
之前的第一个单引号关闭了-c
之后的第一个单引号开始的引号,并且两个字符串连接在一起。
对不起,这是一个错字,问题仍未解决:(
我做了更多测试,在脚本中注释了 python 命令,单独运行命令,在脚本中手动替换 $ppwd 并使用用户名作为输入,并且运行良好。所以这个问题,就像我怀疑的那样,它没有在 python 命令中正确替换 $ppwd
【参考方案1】:
"str(os.environ['ppwd'])"
只是一个字符串。如果你想传入os.environ['ppwd']
,那么这就是你必须说的。
python -c 'import crypt, os,base64; print
crypt.crypt(os.environ["ppwd"], "$6$"+base64.b64encode(os.urandom(24))+"$")'
根据定义,环境变量已经是一个字符串,所以str()
完全是多余的。
此外,您不能嵌套单引号字符串。我简单地切换到双引号来解决这个问题。
使用export
将变量放入环境中是一种将字符串传递给Python 的相当迂回的方式。最好的方法可能是一个临时管道,但确保它的安全是一项重大任务。这是传递字符串的一种更简单的方法:
python -c 'import crypt, os, base64, sys;
print(crypt.crypt(sys.argv[1], "$6$"+base64.b64encode(os.urandom(24))+"$"))' "password"
最后,在shell脚本中,你真的应该quote your variables.
echo "$ppwd"
echo "$usr:$pwd"|chpasswd -ec
【讨论】:
你是对的,@tripleee,我添加了答案,但不知何故没有保存......这是正确的答案。我用过 sys.argv[1]以上是关于将bash变量传递给python命令[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何告诉python在将命令传递给bash时忽略一个字符(Python到bash命令SyntaxError:因为{而无效的语法)