将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

【问题讨论】:

你只是有错字吗? ppwppwd? 您设置了 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命令

如何将 Bash 变量传递给 Python?

将变量传递给Linux bash命令参数

在bash中将包含空格的变量传递给命令[重复]

如何告诉python在将命令传递给bash时忽略一个字符(Python到bash命令SyntaxError:因为{而无效的语法)

如何将变量传递给连接到按钮pyqt5 python的函数[关闭]