我需要一个可以帮助我锻炼的人。我只能使用 shell 脚本和awk
去做吧:
您有一个名为 users.txt 的文本文件,其中包含以下信息:
users.txt
:
彼得:7777:/home/store;
奎因:7777:/home/accounts;
大卫:7777:/home/secondstore;
丹尼尔:7777:/home/address;
该脚本应使用每行的第一个单词创建一个用户,每行的第二个单词将用作密码,第三个单词作为主目录。
如果有人能指出我正确的方向,我将不胜感激
答案1
awk -F: '{print $1}' users.txt
将允许您访问用户名字段
awk -F: '{print $2}' users.txt
--> 密码字段
awk -F: '{print $3}' users.txt
--> 主目录字段
你可以做类似的事情:
user=`awk -F: '{print $1}' users.txt`;
path=`awk -F: '{print $3}' users.txt`;
useradd -d $path -m $user;
答案2
while 循环中的两个命令都需要以 root 身份运行,因此要么添加sudo
s,要么将其保存为 bash 脚本并运行该脚本sudo
(可能更可取)。
awk -F ':| ' '{print $1, $2, $3}' users.txt |
while read user password homedir; do
adduser --home "$homedir" "$user"
echo "$password" | passwd "$user" --stdin
done
或者,正如您所指出的,您可以在里面做更多的事情awk
。我们可以让它打印整个命令:
$ awk -F ':| ' '{ print("adduser --home", $3, $1"; echo", $2 " | passwd", $1) }' users.txt
adduser --home /home/almacen1 Jperez; echo 1234 | passwd Jperez
adduser --home /home/contabilidad1 Lgomez; echo 1234 | passwd Lgomez
adduser --home /home/almacen2 Pfernandez; echo 1234 | passwd Pfernandez
adduser --home /home/direccion1 Mramos; echo 1234 | passwd Mramos
然后让它把所有这些输入到 shell 中(运行时):
$ awk -F ':| ' '{ print("adduser --home", $3, $1"; echo", $2 " | passwd", $1) | "/bin/bash" }' users.txt
adduser: Only root may add a user or group to the system.
passwd: user 'Jperez' does not exist
adduser: Only root may add a user or group to the system.
passwd: user 'Lgomez' does not exist
adduser: Only root may add a user or group to the system.
passwd: user 'Pfernandez' does not exist
adduser: Only root may add a user or group to the system.
passwd: user 'Mramos' does not exist
显然,您需要使用sudo
(或以 root 身份)运行上述命令才能运行(这就是它出现错误的原因)。您可以使用awk
的system()
命令,但您必须花费更多时间来连接字符串。print()
这非常简单,所以我选择了它。
只是为了澄清一下,我的意思是运行sudo awk -F ':| ' '{ print("adduser --home", $3, $1"; echo", $2 " | passwd", $1) | "/bin/bash" }' users.txt
答案3
将内部字段分隔符设置为:,然后简单地忽略;的最后一个字符,用任何方法...使用子字符串或将其切碎。
这段代码应该能为您指明正确的方向。
这是 IFS var 使用的随机示例
#!/bin/bash
IFS=$','
vals='/mnt,/var/lib/vmware/Virtual Machines,/dev,/proc,/sys,/tmp,/usr/portage,/var/tmp'
for i in $vals; do echo $i; done
unset IFS
在您的情况下,您需要设置 IFS=: 并在每一行运行该类型的代码。
对于这些问题,我建议使用搜索引擎或在更适合编程的网站上发帖。