将 bash 变量传递给 python 命令

Pass bash variable to python command

我正在尝试用两个参数做一个基本的密码加密脚本,但我不能让它工作:

#!/usr/bin/bash
set -x
trap read debug
export ppwd=;
export usr=;

pwd=$(python -c 'import crypt, os,base64; print crypt.crypt("str(os.environ['ppwd'])", "$"+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]", "$"+base64.b64encode(os.urandom(24))+"$")'
+ pwd=bbdf5picgZM4.
++ read
+ echo
++ read
+ echo testuser:bbdf5picgZM4.
++ read
+ chpasswd -ec

"str(os.environ['ppwd'])" 只是一个字符串。如果你想传入 os.environ['ppwd'] 那就是你必须说的。

python -c 'import crypt, os,base64; print 
crypt.crypt(os.environ["ppwd"], "$"+base64.b64encode(os.urandom(24))+"$")'

根据定义,环境变量已经是字符串,因此 str() 完全是多余的。

此外,您不能嵌套单引号字符串。我简单地切换到双引号来解决这个问题。

使用 export 将变量放入环境中是将字符串传递给 Python 的一种相当迂回的方式。最好的方法可能是一个临时管道,但要确保它的安全是一项艰巨的任务。这里有一个更简单的方法来传递一个字符串:

python -c 'import crypt, os, base64, sys; 
    print(crypt.crypt(sys.argv[1], "$"+base64.b64encode(os.urandom(24))+"$"))' "password"

最后,在 shell 脚本中,你真的应该 quote your variables.

echo "$ppwd"
echo "$usr:$pwd"|chpasswd -ec