将bash变量传递给python命令

时间:2019-01-29 00:00:25

标签: python bash aix

我正在尝试使用两个参数来制作基本的密码加密脚本,但是我无法使其工作:

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

1 个答案:

答案 0 :(得分:0)

"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的一种round回的方式。最好的方法可能是使用临时管道,但要使其正确固定是一项艰巨的任务。这是一种传递字符串的简单方法:

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