6

我正在尝试自动设置 SFTP 访问。此脚本以具有 sudo 权限且没有密码的用户身份运行。

我可以像这样创建一个用户:

>>> import subprocess
>>> process = subprocess.Popen(['sudo', 'useradd', 'test'], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> process.communicate()
('', '')

接下来我需要设置用户的密码,但我不知道如何设置。这是我尝试过的。

>>> process = subprocess.Popen(['sudo', 'chpasswd'], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> process.communicate('test:password')

在我的 python 程序中它没有效果,在交互式解释器中它在第一行之后锁定。

最好的方法是什么?

我在 Ubuntu lucid 上运行 python 2.6。

4

5 回答 5

8

尝试下面的代码,这将按照您的要求进行自动化

from subprocess import Popen, PIPE, check_call  
check_call(['useradd', 'test'])   
proc=Popen(['passwd', 'test'],stdin=PIPE,stdout=PIPE,stderr=PIPE)  
proc.stdin.write('password\n')  
proc.stdin.write('password')  
proc.stdin.flush()  
stdout,stderr = proc.communicate()  
print stdout  
print stderr

print语句是可选的。

于 2012-12-04T06:31:08.903 回答
6

的文档说,如果您通过参数将数据发送到标准输入,则communicate需要添加:stdin=PIPEcommunicate

http://docs.python.org/release/2.6/library/subprocess.html#subprocess.Popen.communicate

我很欣赏这只是框架代码,但这里还有另外几个小注释,以防它们有用:

  • 如果您对useradd命令的输出不感兴趣,而不是它是否失败,那么subprocess.check_call如果命令返回非零,您最好使用 which 将引发异常。
  • 在第二种情况下,您应该process.returncode在调用后检查是否为 0communicate('test:password')
于 2011-01-14T06:32:38.820 回答
1

你忘了这个:

stdin=subprocess.PIPE

要将数据发送到进程,您需要一个stdin.

所以完整的声明是:

process = subprocess.Popen(['sudo', 'chpasswd'], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)

然后调用communicate('password').

于 2011-01-14T06:32:17.173 回答
1

在 Ubuntu 上,使用 usermod

class SomeClass
    def userPasswd(self, login, password):
        encPass = crypt.crypt(password)
        command = "usermod -p '{0:s}' {1:s}".format(encPass, login)
        result = os.system(command)
        if result != 0:
            logging.error(command)
        return result
于 2015-08-05T13:30:29.463 回答
1

我想问题是你忘记了 sudo 的 -S 选项。

于 2015-09-27T12:24:45.667 回答