这只是我刚才想到的一个坏主意。
有没有办法即时创建用户帐户?
假设我创建了一个 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
作业运行,以确保用户名被自动添加。