【问题标题】:Changing an AIX password via script?通过脚本更改 AIX 密码?
【发布时间】:2015-03-06 10:09:05
【问题描述】:

我正在尝试通过脚本更改用户的密码。我不能使用 sudo,因为有一个功能要求用户在另一个用户更改密码时再次更改密码。

AIX 正在系统上运行。

很遗憾,chpasswd 不可用。

我已经安装好了,但我也遇到了麻烦。

这是我认为可行的方法

echo "oldpassword\nnewpasswd123\nnewpasswd123" | passwd user

但是一旦运行脚本,我就会收到please enter user's old password 的提示 他们不应该都被呼应吗?

我是 shell 脚本的初学者,对此感到困惑。

【问题讨论】:

  • 请注意,AIX 不是 Linux;您应该更新您的问题以澄清您在问什么。
  • @rakslice - 更改了标题。

标签: bash shell ssh passwords aix


【解决方案1】:

你可以试试:

echo -e "newpasswd123\nnnewpasswd123" |密码用户

【讨论】:

  • 我在 bash 脚本中有以下代码,它工作正常:useradd -s /bin/bash -g www-data -d /var/www/$vhost $Name; echo -e "$sshPasswd\n$sshPasswd" | passwd $Name; id $Name
【解决方案2】:

使用 GNU passwd stdin 标志。

来自man 页面:

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

注意:仅适用于 root 用户。

示例

$ adduser foo 
$ echo "NewPass" |passwd foo --stdin
Changing password for user foo.
passwd: all authentication tokens updated successfully.

您也可以使用expect,这个简单的代码就可以解决问题:

#!/usr/bin/expect
spawn passwd foo
expect "password:"
send "Xcv15kl\r"
expect "Retype new password:"
send "Xcv15kl\r"
interact

结果

$ ./passwd.xp 
spawn passwd foo
Changing password for user foo.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

【讨论】:

  • 是的,我也试过了:"echo oldpassword\nnewpasswd123\nnewpasswd123" | passwd --stdin user 我得到密码:非法选项 -- -
  • 我需要 root 并且我得到了相同的“非法选项 -- -”
  • 好像是这样,很多人的建议看起来应该可行,但没有。
  • 不适用于 Ubuntu 16.04:passwd: unrecognized option '--stdin'
  • 较新的版本不支持 --stdin(例如 openSUSE Leap 42.1;它在 12.1 中工作,但不再工作)。
【解决方案3】:
Here is the script... 

#!/bin/bash
echo "Please enter username:"
read username
echo "Please enter the new password:"
read -s password1
echo "Please repeat the new password:"
read -s password2

# Check both passwords match
if [ $password1 != $password2 ]; then
echo "Passwords do not match"
 exit    
fi

# Does User exist?
id $username &> /dev/null
if [ $? -eq 0 ]; then
echo "$username exists... changing password."
else
echo "$username does not exist - Password could not be updated for $username"; exit 
fi

# Change password
echo -e "$password1\n$password1" | passwd $username

也请参考下面的链接...

http://www.putorius.net/2013/04/bash-script-to-change-users-password.html

【讨论】:

  • 谢谢,但我的系统不喜欢这行echo -e "$password1\n$password1" | passwd $username
  • 您是否在此处提供了新密码? echo -e "$password1\n$password1" | passwd $用户名
【解决方案4】:

你可以试试:

echo "USERNAME:NEWPASSWORD" | chpasswd

【讨论】:

  • 为了让它对我有用,我必须将它更改为:echo "USERNAME:NEWPASSWORD" | sudo chpasswd,当通过非 sudo 父脚本执行时
  • chpasswd 对我来说似乎是正确的答案。为我设置 Docker 映像工作。我喜欢以下(在 bash 中)以避免“回声”噪音:chpasswd <<<"$USERNAME:$PASSWORD"
【解决方案5】:

来自:Script to change password on linux servers over ssh

下面的脚本需要保存为文件(例如./passwdWrapper)并使其可执行(chmod u+x ./passwdWrapper)

#!/usr/bin/expect -f
#wrapper to make passwd(1) be non-interactive
#username is passed as 1st arg, passwd as 2nd

set username [lindex $argv 0]
set password [lindex $argv 1]
set serverid [lindex $argv 2]
set newpassword [lindex $argv 3]

spawn ssh $serverid passwd
expect "assword:"
send "$password\r"
expect "UNIX password:"
send "$password\r"
expect "password:"
send "$newpassword\r"
expect "password:"
send "$newpassword\r"
expect eof

然后你可以运行./passwdWrapper $user $password $server $newpassword,它实际上会更改密码。

注意:这要求您在运行命令的机器上安装expect。 (sudo apt-get install expect) 该脚本适用于 CentOS 5/6 和 Ubuntu 14.04,但如果 passwd 中的提示发生变化,您可能需要调整 expect 行。

【讨论】:

    【解决方案6】:

    你可以试试

    Linux

    回显密码 | passwd 用户名--stdin

    UNIX

    echo 用户名:密码 | chpasswd -c

    如果不使用“-c”参数,下次需要修改密码。

    【讨论】:

    • echo username:password | chpasswd -c 抛出错误
    【解决方案7】:

    除了其他建议外,您还可以使用HEREDOC 实现此目的。

    在您当前的情况下,这可能如下所示:

    $ /usr/bin/passwd root <<EOF
    test
    test
    EOF
    

    【讨论】:

      【解决方案8】:
      printf "oldpassword/nnewpassword/nnewpassword" | passwd user
      

      【讨论】:

        【解决方案9】:
        #!/usr/bin/python
        
        import random
        import string
        import smtplib
        import sys
        import os
        from subprocess import call
        import socket
        
        user = sys.argv[1]
        receivers = ["%s@domain.com" %user]
        
        '''This will generate a 30 character random password'''
        def genrandpwd():
                return  ''.join(random.SystemRandom().choice(string.ascii_lowercase + string.digits + string.ascii_uppercase + string.punctuation) for _ in range(30))
        
        def change_passwd(user, password):
                p = os.popen("/usr/bin/passwd %s" %user, "w")
                p.write(password)
                p.write("\n")
                p.write(password)
            p.close()
        
        def chage(user):
                agepasswd = call(["/usr/bin/chage", "-d", "0", "%s" %user])
        
        def mailpwd(user, password):
                sender = "admin@%s" %socket.gethostname()
                subj = "!!!IMPORTANT!!!, Unix password changed for user %s" %user
                text = "The password for the %s user has changed, the new password is:\n\n %s \n\n Note: The system will force to change the password upon initial login. Please use the password provided in the mail as your current password and type the password of your choice as the New password" %(user, password)
                message = message = 'Subject: %s\n\n%s' % (subj, text)
                smtpObj = smtplib.SMTP('mailrelay-server.domain.com')
                smtpObj.sendmail(sender, receivers, message)
                smtpObj.quit()
        
        def main():
                newpwd = genrandpwd()
                change_passwd(user, newpwd)
                chage(user)
                mailpwd(user, newpwd)
        
        if __name__ == "__main__":
                main()
        

        【讨论】:

        • 这个脚本可以在linux机器上运行。您可以根据您的环境修改某些内容,例如邮件中继服务器或更改密码字符的限制等。
        【解决方案10】:

        你需要 echo -e 让换行符生效

        你写的

        echo "oldpassword\nnewpasswd123\nnewpasswd123" | passwd user
        

        你应该试试

        echo -e "oldpassword\nnewpasswd123\nnewpasswd123" | passwd user
        

        很可能,您不需要该命令的旧密码\n 部分,您只需要两个新密码。不要忘记在感叹号周围使用单引号!

        echo -e "new"'!'"passwd123\nnew"'!'"passwd123" | passwd user
        

        【讨论】:

        • 如果密码中包含“\n”怎么办?如my@secret\npasword123?
        • 很好的答案!在 Ubuntu 上对我来说工作得很好。我有类似的要求,但第一次设置(而不是更改)用户密码。提到 \n 字符以及 -e 选项来分隔对 2 个密码提示的回复确实对我很有帮助。
        【解决方案11】:

        对我来说,这在一个流浪的虚拟机中工作:

        sudo /usr/bin/passwd root <<EOF
        12345678
        12345678
        EOF
        

        【讨论】:

        • 如果你能克服sudo这个词并在一行中添加旧密码,这仍然是一个简单的答案。
        【解决方案12】:

        如果你可以使用 ansible,并在其中设置 sudo 权限,那么你就可以轻松使用这个脚本了。如果您想编写这样的脚本,则意味着您需要在多个系统上执行此操作。因此,您也应该尝试将其自动化。

        【讨论】:

          【解决方案13】:

          就这个

          passwd <<EOF
          oldpassword
          newpassword
          newpassword
          EOF
          

          ubuntu 机器的实际输出(抱歉没有可用的 AIX):

          user@host:~$ passwd <<EOF
          oldpassword
          newpassword
          newpassword
          EOF
          
          Changing password for user.
          (current) UNIX password: Enter new UNIX password: Retype new UNIX password: 
          passwd: password updated successfully
          user@host:~$
          

          【讨论】:

            猜你喜欢
            • 2013-08-25
            • 2014-12-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-04
            • 2012-06-29
            • 2018-08-06
            • 2011-10-25
            相关资源
            最近更新 更多