如何动态创建用户

如何动态创建用户

这只是我刚才想到的一个坏主意。

有没有办法即时创建用户帐户?

假设我创建了一个 Ubuntu 虚拟机,我想给一群人访问权限。但无论出于什么原因,我并不特别关心他们用它做什么。

我该如何设置,当用户 A 通过 ssh 进入虚拟机时,会自动创建用户帐户?

是的,我知道从理论上讲,我可以创建一个访客帐户并与需要访问权限的人共享。但随后会有许多人共享该帐户,而且我也想记录每个人所做的事情,因此让他们使用同一个帐户会使事情变得非常困难。

是的,这是一个非常糟糕的想法。

答案1

我喜欢挑战。是的,你可以这样做,只要你愿意让第一个 ssh 失败。以下脚本(我实际测试过)跟踪 sshd 日志,默认情况下(在我的系统上)在 ssh 登录失败时会生成如下行:

Jun 20 21:06:35 home sshd[18163]: Invalid user dummy from ::1

当匹配到这样的行时,将提取用户 ID(本例中为 dummy),并使用与用户 ID(dummy)相同的加密密码创建一个用户帐户。现在可以进行第二次登录尝试。

# encrypt a cleartext password given as arg
cryptpw(){
        perl -e '
        my $pw = "'"$1"'";
        my $salt = join("",("a".."z")[rand 26,rand 26]);
        printf "%s\n", crypt($pw,$salt);'
}

sudo journalctl --no-pager -lfu sshd | 
while read line
do    if [[ "$line" =~ "Invalid user "([^ ]*) ]]
      then  newuser=${BASH_REMATCH[1]}
            pw=$(cryptpw "$newuser")
            sudo useradd "$newuser" -p "$pw"
      fi
done

用户可能希望将他们的密钥复制到遥控器:

ssh-copy-id dummy@host

如果他们还没有钥匙,首先执行以下操作:

ssh-keygen -t rsa -f ~/.ssh/id_rsa -q -N ''

答案2

使用python

#!/usr/bin/env python2
import re, crypt, subprocess

with open('/var/log/auth.log') as logfile, open('/etc/passwd') as passfile:
    given_usernames = []
    for line in logfile:
        name = re.search(r'(?<= Invalid user ).*?(?= from)', line)
        if name:
            given_usernames.append(name.group())

    current_usernames = []
    for line in passfile:
         current_usernames.append(re.search(r'^[^:]+', line).group())

    for i in given_usernames:
        if i not in current_usernames:
            password = crypt.crypt(i + str(123), 'foobar12')
            subprocess.call('sudo useradd -m -p {0} {1}'.format(password, i).split())
  • 当用户尝试通过ssh没有现有帐户登录计算机时,将被拒绝登录,并且此事件将记录在文件中,/var/log/auth.log例如:

    Jun 21 01:11:03 my_hostname sshd[17763]: Invalid user foobar from 192.168.4.2
    
  • 我们将利用此行来提取提供的用户名,为该用户创建一个帐户,以便用户下次登录时不会出现任何问题

  • 我们使用密码作为给定的用户名加上123(盐是foobar12),即如果用户名是spamegg密码将是spamegg123。你可以将它和盐更改为你想要的任何值,当然用户必须在第一次登录后更改密码

  • 在这种方法中,文件中的所有用户名/var/log/auth.log都会被放入一个列表中,同样,所有用户名/etc/passwd也会被放入一个列表中。

  • 然后我们检查输入的用户名是否已经存在,如果不存在,则使用前面提到的密码创建用户。

  • 您可以将其作为一项cron作业运行,以确保用户名被自动添加。

相关内容