如何改变从蟒蛇一个Linux用户密码(How to change a Linux user pass

2019-07-03 11:48发布

我在与蟒蛇改变一个Linux用户的密码问题。 我试过这么多东西,但我不能设法解决这个问题,这里是我已经尝试过的事情的示例:

sudo_password是sudo的密码,sudo_command是我想要的系统运行的命令,用户从列表中获得,是谁,我想更改密码的用户,并newpass是我要分配给“用户”的通

    user = list.get(ANCHOR)
    sudo_command = 'passwd'
    f = open("passwordusu.tmp", "w")
    f.write("%s\n%s" % (newpass, newpass))
    f.close()
    A=os.system('echo -e %s|sudo -S %s < %s %s' % (sudo_password, sudo_command,'passwordusu.tmp', user))
    print A
    windowpass.destroy()

“A”是用于使用os.system的执行返回值,在这种情况下256我也尝试

    A=os.system('echo  %s|sudo -S %s < %s %s' % (sudo_password, sudo_command,'passwordusu.tmp', user))

但它返回相同的错误代码。 我试着用“passwd文件”命令,但内部消除更迭其他几个方面。 随着“chpasswd的”命令我已经试过这样:

    user = list.get(ANCHOR)
    sudo_command = 'chpasswd'
    f = open("passwordusu.tmp", "w")
    f.write("%s:%s" % (user, newpass))
    f.close()
    A=os.system('echo %s|sudo -S %s < %s %s' % (sudo_password, sudo_command,'passwordusu.tmp', user))
    print A
    windowpass.destroy()

也:

    A=os.system('echo %s|sudo -S %s:%s|%s' % (sudo_password, user, newpass, sudo_command))
    @;which returns 32512
    A=os.system("echo %s | sudo -S %s < \"%s\"" % (sudo_password, sudo_command,  "passwordusu.tmp"))
    @;which returns 256

我尝试“mkpasswd”和“usermod命令”太像这样:

    user = list.get(ANCHOR)
    sudo_command = 'mkpasswd -m sha-512'
    os.system("echo %s | sudo -S %s %s > passwd.tmp" % (sudo_password,sudo_command, newpass))
    sudo_command="usermod -p"
    f = open('passwd.tmp', 'r')
    for line in f.readlines():
        newpassencryp=line
    f.close()
    A=os.system("echo %s | sudo -S %s %s %s" % (sudo_password, sudo_command, newpassencryp, user))
    @;which returns 32512

但是,如果你去https://www.mkpasswd.net ,哈希“newpass”和替代“newpassencryp”,则返回0,这理论上意味着它已经正确的,但到目前为止,并没有更改密码。

我搜索互联网和计算器对这个问题或类似,并试图暴露了什么解决方案,但再一次,没有成功。

我真的apreciate任何帮助,当然,如果你需要更多的信息,我会很乐意提供它!

提前致谢。

Answer 1:

尝试使用“--stdin”选项,在你的水管passwd命令。 从man页面引用:

    --stdin
      This option is used to indicate that passwd should read the new
      password from standard input, which can be a pipe.

另一种选择,如果你的Linux有usermod命令,作为根(或通过sudo),你可以明确地设置使用“-p”选项(加密)密码。



Answer 2:

今天我翻过了同样的问题跑,我写了一个简单的包装围绕subprocess调用passwd命令和饲料stdin新的密码。 这段代码也不是省油的证明,及作为根本不提示输入旧密码运行的时候才起作用。

import subprocess
from time import sleep

PASSWD_CMD='/usr/bin/passwd'

def set_password(user, password):
    cmd = [PASSWD_CMD, user]
    p = subprocess.Popen(cmd, stdin=subprocess.PIPE)
    p.stdin.write(u'%(p)s\n%(p)s\n' % { 'p': password })
    p.stdin.flush()
    # Give `passwd` cmd 1 second to finish and kill it otherwise.
    for x in range(0, 10):
        if p.poll() is not None:
            break
        sleep(0.1)
    else:
        p.terminate()
        sleep(1)
        p.kill()
        raise RuntimeError('Setting password failed. '
                '`passwd` process did not terminate.')
    if p.returncode != 0:
        raise RuntimeError('`passwd` failed: %d' % p.returncode)

如果您需要passwd文件的输出,您也可以通过stdout=subprocess.PIPEPopen呼叫并从中读取。 在我来说,我只是当操作成功与否,所以我干脆跳过这部分感兴趣。

安全考虑:不要使用类似echo -n 'password\npassword\n | passwd username' echo -n 'password\npassword\n | passwd username' ,因为这将使密码在进程列表中可见。

SUDO

既然你缝要使用sudo passwd <username>我会建议增加一个新的生产线,以你/etc/sudoers (使用visudo对于这一点!)

some_user ALL = NOPASSWD: /usr/bin/passwd

须藤不会要求输入密码的some_user和脚本会按预期运行。

或者简单地增加一个额外的p.stdin.write(u'%s\n' % SUDO_PASSWORD)线。 这样, sudo将首先获得用户密码,然后passwd接收新的用户密码。



Answer 3:

usermod基础的版本:

#!/usr/bin/env python
from crypt      import crypt
from getpass    import getpass
from subprocess import Popen, PIPE

sudo_password_callback = lambda: sudo_password # getpass("[sudo] password: ")
username, username_newpassword = 'testaccount', '$2&J|5ty)*X?9+KqODA)7'

# passwd has no `--stdin` on my system, so `usermod` is used instead
# hash password for `usermod`
try:
    hashed = crypt(username_newpassword) # use the strongest available method
except TypeError: # Python < 3.3
    p = Popen(["mkpasswd", "-m", "sha-512", "-s"], stdin=PIPE, stdout=PIPE,
              universal_newlines=True)
    hashed = p.communicate(username_newpassword)[0][:-1] # chop '\n'
    assert p.wait() == 0
assert hashed == crypt(username_newpassword, hashed)

# change password
p = Popen(['sudo', '-S',  # read sudo password from the pipe
           # XXX: hashed is visible to other users
           'usermod',  '-p', hashed, username],
          stdin=PIPE, universal_newlines=True)
p.communicate(sudo_password_callback() + '\n')
assert p.wait() == 0


Answer 4:

运行此作为用户必须具有sudo的权限运行passwd没有密码的命令。

>>> from subprocess import Popen
>>> proc = Popen(['/usr/bin/sudo', '/usr/bin/passwd', 'test', '--stdin'])
>>> proc.communicate('newpassword')


Answer 5:

由于通过密码在命令行上前面提到是不是很安全很遗憾。 另外像“ --stdin ”为passwd不适用于所有的passwd执行。 为此下面是一个使用更安全的版本chpasswd

def setPassword(userName:str, password:str):
    p = subprocess.Popen([ "/usr/sbin/chpasswd" ], universal_newlines=True, shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    (stdout, stderr) = p.communicate(userName + ":" + password + "\n")
    assert p.wait() == 0
    if stdout or stderr:
        raise Exception("Error encountered changing the password!")

说明:

随着subprocess.Popen我们推出的一个实例chpasswd 。 我们管的用户名和密码的实例chpasswdchpasswd那么将改变使用当前操作系统定义的设置密码。 chpasswd ,如果没有发生错误将保持完全沉默。 为此上面的代码将引发异常,如果发生了任何类型的错误(而不必细看实际误差)。



文章来源: How to change a Linux user password from python