0

我正在尝试学习 python 以非交互方式更改用户密码,但似乎没有任何效果。
pexepectpython 的模块似乎很有前途,所以我只是想使用它。
教程很好,但它不起作用。
互联网上有很多关于此的代码,但它们似乎都不起作用。
我的代码也没有:

#!/usr/bin/python
import pexpect
import time
def ChangePassword(user, pass):
    passwd = pexpect.spawn("/usr/bin/passwd %s" % user)

    for x in xrange(2):
        # wait for password: to come out of passwd's stdout
        passwd.expect("password: ")
        # send pass to passwd's stdin
        passwd.sendline(pass)
        time.sleep(0.1)

ChangePassword('rajesh', 'bar') # changes user "foo"'s password to "bar"

错误:

bash-3.00# ./solpas7.py
  File "./solpas7.py", line 4
    def ChangePassword(user, pass):
                                ^
SyntaxError: invalid syntax

编辑:我将 pass 更改为 pa 但不是我得到了很多并且密码没有更改。

bash-3.00# ./solpas7.py
Traceback (most recent call last):
  File "./solpas7.py", line 14, in ?
    ChangePassword('rajesh', 'bar') # changes user "foo"'s password to "bar"
  File "./solpas7.py", line 9, in ChangePassword
    passwd.expect("password: ")
  File "/usr/lib/python2.4/site-packages/pexpect.py", line 1311, in expect
    return self.expect_list(compiled_pattern_list, timeout, searchwindowsize)
  File "/usr/lib/python2.4/site-packages/pexpect.py", line 1325, in expect_list
    return self.expect_loop(searcher_re(pattern_list), timeout, searchwindowsize                                              )
  File "/usr/lib/python2.4/site-packages/pexpect.py", line 1409, in expect_loop
    raise TIMEOUT (str(e) + '\n' + str(self))
pexpect.TIMEOUT: Timeout exceeded in read_nonblocking().
<pexpect.spawn object at 0x80e306c>
version: 2.3 ($Revision: 399 $)
command: /usr/bin/passwd
args: ['/usr/bin/passwd', 'rajesh']
searcher: searcher_re:
    0: re.compile("password: ")
buffer (last 100 chars): New Password:
before (last 100 chars): New Password:
after: pexpect.TIMEOUT
match: None
match_index: None
exitstatus: None
flag_eof: False
pid: 4683
child_fd: 3
closed: False
timeout: 30
delimiter: pexpect.EOF
logfile: None
logfile_read: None
logfile_send: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.05
delayafterclose: 0.1
delayafterterminate: 0.1
4

2 回答 2

3

不能pass用作变量名。这是一个保留关键字。

编辑:pexpect 正在等待字符串"password: ",但正如您可以从系统上的错误消息passwd输出"New Password: "(注意大写 p)中看出的那样。

buffer (last 100 chars): New Password:
before (last 100 chars): New Password:

而不是passwd.expect("password: ")你需要使用passwd.expect("Password: ").

于 2013-01-30T11:43:52.803 回答
0

您还可以使用它来使您的搜索不区分大小写:

passwd.expect('(?i)password:')    
于 2018-11-13T18:11:25.060 回答