我正在尝试在FreeBSD上用Python 2.7编写一个系统管理脚本,并且我一直试图在添加时尝试以编程方式设置用户的密码。我正在使用FreeBSD pw命令,它有一个-h标志,它接受一个文件描述符作为参数。
我所采用的路线是使用Python的子进程模块,但是我 似乎陷入困境,因为Python将所有东西视为字符串 并且pw -h选项期望返回fd(文件描述符) 我正在尝试运行的命令是:
/usr/sbin/pw useradd foobar2 -C /usr/local/etc/bsdmanage/etc/pw.conf -m -c "BSDmanage foobar2 user" -G foobar2-www -h
我这样做是通过:
objTempPassFile = open(strTempDir + 'foobar.txt', 'w+')
objTempPassFile.write(strTempPass)
objTempPassFile.seek(0)
listCmdArgs = shlex.split(strPwUserCmd)
processUser = subprocess.Popen(listCmdArgs,stdin=objTempPassFile.fileno(),stdout=subprocess.PIPE,stderr=subprocess.PIPE)
strOutPut, strErrorValue = processUser.communicate()
其中strPwUserCmd
是上面的pw命令而strTempPass
只是一个字符串。
我还尝试将密码字符串作为选项传递给Popen.communicate()
并将标准输入更改为stdin=subprocess.PIPE
我也尝试过使用StringIO对象。但是,传递它会导致错误,它不是有效的I / O对象或pw命令失败,并且看不到传递给-h开关的任何参数。
有什么想法吗?感谢。
答案 0 :(得分:0)
因此,如果您使用-h 0标志来提示stdin管道,那么您只需使用process.communicate(string)来传递密码。
所以,就像这样:
/usr/sbin/pw useradd foobar2 -C /usr/local/etc/bsdmanage/etc/pw.conf -m -c "BSDmanage foobar2 user" -G foobar2-www -h 0
作为命令字符串。然后通过以下方式调用:
listCmdArgs = shlex.split(strPwUserCmd)
processUser = subprocess.Popen(listCmdArgs,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
strOutPut, strErrorValue = processUser.communicate(strTempPass)
并且strTempPass
是密码字符串。 strPwUserCmd
是上面的'pw'命令字符串。