请问全志R329如何于Tina下支持多用户呢?
本回答来源全志R329如何于Tina下支持多用户?
新增用户
Linux 系统是一个多用户多任务的分时操作系统,多个用户可以在同一时间内登录同一个系统执行各自不同的任务,而互不影响。
不同的用户具有不同的权限,每个用户在权限允许的范围内完成不同的任务。Linux 通过这种权限的划分与管理,实现多用户的运行机制。
每个用户都用一个唯一的用户名和用户口令,在登录系统时,只有正确输入了用户名和密码,才能进入系统和自己的主目录。
Tina SDK默认只有一个用户,root。 支持多用户的话,首先需要新增用户。
Tina 中 busybox 中包含了 adduser 命令,执行 make menuconfig,使能“CONFIG_BUSYBOX_CONFIG_ADDUSER”即可加入该命令。使用命令 adduser 来新建一个用户,需要输入密码。生成完之后可以在 /etc/passwd 和 /etc/shadow 文件中看到相关信息。
root@TinaLinux:~# adduser test
addgroup: number 3 is not in 0..0 range
adduser: /home/test: No such file or directory
Changing password for test
New password:
Bad password: too short
Retype password:
passwd: password for test changed by root
root@TinaLinux:~# cat /etc/passwd | grep test
test:x:3:3:Linux User,,,:/home/test:/bin/ash
root@TinaLinux:~# cat /etc/shadow | grep test
test:$1$hzP6ufas$E3sHJb8pYA3/jSGNfLqk2/:0:0:99999:7:::
root@TinaLinux:~# openssl passwd -1 -salt 'hzP6ufas' 'test'
$1$hzP6ufas$E3sHJb8pYA3/jSGNfLqk2/
如上面例子,新建了一个 test 用户,密码是 test。从 passwd 中可看到其 id 为 3。 从/etc/shadow 中可看到其密码的相信息,其中1表示的是采用 MD5 算法,hzP6ufas表示salt,后面的$E3sHJb8pYA3/jSGNfLqk2/就是对密码 “test” 进行哈希运算的结果。
同理,我们可以猜测出 root 的密码为 tina。
root@TinaLinux:~# cat /etc/shadow /etc/passwd | grep root
root:91rMiZzGliXHM:1:0:99999:7:::
root:x:0:0:root:/root:/bin/ash
root@TinaLinux:~# openssl passwd -salt 91 tina
91rMiZzGliXHM
如果希望固件中就包含 “non-root user”,可以首先在小机端执行 adduser,然后将/etc/passwd与/etc/shadow 中的相关行加入到“tina/package/base-files/files/etc/”或“tina/target/allwinner/${BOARD}/base-files/etc”等目录下对应的文件中,同时在 rootfs 的 home 目录下新增一个 “non-root user” 对应的目录。
通常还需要修改/etc/group,方法类似。
如果希望开机直接进入 test 用户,可以修改 rootfs 中的/etc/inittab 文件,删除所有的 askfirst与 askconsole 行,加入“::askconsole:/bin/su - test”行。
如果希望开机后动态选择用户登录,可以修改 rootfs 中的/etc/inittab 文件,删除所有的 askfirst 与 askconsole 行,加入“::askconsole:/bin/login”行。
切换用户
可以通过 su 命令来在不同的用户间进行切换。Tina 执行 make menuconfig,使能 “CONFIG_BUSYBOX_CONFIG_SU” 即可加入 su 命令。
test@TinaLinux:~$ su - root
su: must be suid to work properly
test@TinaLinux:~$ ll /bin/busybox /bin/su
-rwxr-xr-x 1 root root 412024 Oct 15 2020 /bin/busybox
lrwxrwxrwx 1 root root 7 Oct 15 2020 /bin/su -> busybox
test@TinaLinux:~$ reboot
reboot: Operation not permitted
test@TinaLinux:~$ date -s "2020-10-16 00:00:00"
date: can't set date: Operation not permitted
Fri Oct 16 00:00:00 UTC 2020
如上面例子所示,在 test 用户下,执行 su 命令,提示出错。对于一些二进制文件,虽然 o 中包含了可执行权限,但是执行时,仍然会失败。因为这些二进制程序运行后,owner 是 test,如果此进程有写文件或执行其他程序等,会因为权限不足而出错。如果将此二进制文件加上 suid,就可以正确执行。类似的命令还有 date、reboot 等。
对于 busybox,除了加上 suid,还需要在/etc/busybox.conf 文件中加入对应命令的 suid 配置。 执行make menuconfig,使能 “CONFIG_BUSYBOX_CONFIG_FEATURE_SUID”、“CONFIG_BUSYBOX_CONFIG_FEATURE_SUID_CONFIG” 加入对/etc/busybox.conf的支持。
root@TinaLinux:~# ll /bin/busybox
-rwxr-xr-x 1 root root 412024 Oct 15 07:11 /bin/busybox
root@TinaLinux:~# chmod u+s /bin/busybox ; ll /bin/busybox
-rwsr-xr-x 1 root root 412024 Oct 15 07:11 /bin/busybox
root@TinaLinux:~# cat /etc/busybox.conf
[SUID]
reboot = ssx root.root
date = ssx root.root
root@TinaLinux:~# exit
test@TinaLinux:~$ date -s "2020-10-16 10:00:00"
Fri Oct 16 10:00:00 UTC 2020
test@TinaLinux:~$ reboot
实际在使用过程中,可以根据需要,对二进制文件加入 suid/sgid 权限。
当切换用户后,后续在控制台执行的命令都是属于当前用户的。可以使用如下命令开启一个属于其他用户的进程:
su <user name> -c "command"
test@TinaLinux:~$ su root -c "sleep 1000 &"
Password:
test@TinaLinux:~$ su root
Password:
root@TinaLinux:/home/test# su test -c "sleep 2000 &"
root@TinaLinux:/home/test# su test
test@TinaLinux:~$ ps | grep sleep
2409 root 3016 S sleep 1000
2412 test 3272 S sleep 2000
2415 test 3272 R grep sleep
如上面例子所示,在 test 用户下,以 root 用户开启了一个sleep 1000的进程;在 root 用户下,以 test 用户开启了一个sleep 2000的进程。