【问题标题】:freebsd pw adduser command and python file descriptorsfreebsd pw adduser 命令和 python 文件描述符
【发布时间】:2015-03-27 01:17:44
【问题描述】:

我正在尝试在 FreeBSD 上使用 Python 2.7 编写系统管理脚本,但在添加用户密码时,我一直在尝试以编程方式设置用户密码。我正在使用 FreeBSD pw 命令,它有一个 -h 标志,它接受文件描述符作为参数。

我采取的路线是使用 Python 的 subprocess 模块,但我 似乎被困在 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

有什么想法吗?谢谢。

【问题讨论】:

  • 像往常一样。戳它,重新阅读文档并走上正轨。

标签: python freebsd


【解决方案1】:

所以,如果你使用 -h 0 标志来 pw,它会提示输入标准输入管道,然后你只需使用 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' 命令字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    相关资源
    最近更新 更多