freebsd pw adduser命令和python文件描述符

时间:2015-03-27 01:17:44

标签: python freebsd

我正在尝试在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开关的任何参数。

FreeBSD pw manpage

有什么想法吗?感谢。

1 个答案:

答案 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'命令字符串。