我尝试自动设置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。
答案 0 :(得分:7)
尝试以下代码,这将按照您的要求进行自动化
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
语句是可选的。
答案 1 :(得分:6)
communicate
的文档说,如果您通过stdin=PIPE
参数向标准输入发送数据,则需要添加communicate
:
http://docs.python.org/release/2.6/library/subprocess.html#subprocess.Popen.communicate
我很欣赏这只是骨架代码,但这里还有其他一些小评论,如果它们有用的话:
useradd
命令的输出不感兴趣,除了它是否失败,您可能最好使用subprocess.check_call
,如果命令返回非零。process.returncode
后检查communicate('test:password')
是否为0 答案 2 :(得分:1)
你忘了这个:
stdin=subprocess.PIPE
要将数据发送到流程,您需要stdin
。
所以完整的陈述是:
process = subprocess.Popen(['sudo', 'chpasswd'], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
然后拨打communicate('password')
。
答案 3 :(得分: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
答案 4 :(得分:1)
我想问题是你忘记了sudo的-S选项。