在测试用户命名空间功能时,有时需要将 UID 更改为任意值。
目前,我做了类似的事情:
useradd -u <uid> testuser
su testuser
userdel testuser
我首先需要添加用户su
,因为su
不接受任意 UID,但只接受在/etc/passwd
?中找到的有效用户名。
是否有任何常见的 Linux 实用程序允许更改给定的任意 UID CAP_SETUID
?
注意:我知道我可以编译一个小型setuid(2)
应用程序,但是每次我想测试用户命名空间功能时将其传输到例如容器中是很麻烦的。
答案1
目前还不清楚您到底想要实现什么目标。从你的问题来看你可能是:
- 尝试以不同用户身份执行某些操作以进行测试,而无需每次都创建该用户的开销
- 尝试以不存在的用户身份运行进程(与 中的条目不匹配
/etc/passwd
或更准确地说与getent passwd
) - 试图测试的行为
CAP_SETUID
如果是前两者之一,那么您只需创建一个设置了位的可执行文件setuid
,setgid
并将可执行用户和组设置为任意数字。您甚至不需要编译自己的可执行文件,只需复制现有的可执行文件即可。
作为根用户:
mkdir test_dir
# Secure the directory to prevent tampering by other users
chmod go-rx test_dir
cd test_dir
cp $(which bash) .
# arbitrary user 1997 group 1998
chown 1997:1998 ./bash
chmod ug+s ./bash
chmod go+rx ./bash
# Run touch as an arbitrary user
./bash -p -c `touch /tmp/test_file`
# Check the result
ls -lh /tmp/test_file
-rw-r----- 1 1997 1998 0 Jan 11 08:22 /tmp/test_file
此外,Python(一种脚本编程语言)可在许多平台上使用。您可以编写一个非常短的 python 脚本来在调用 setuid 和 setgid 后运行某些内容:
例如uid.py:
import os
import sys
import subprocess
# Set uid and gid
os.setuid(int(sys.argv[1]))
os.setgid(int(sys.argv[2]))
# Run the given command, passing in remaining arguments.
subprocess.run(*sys.argv[3:])
然后,CAP_SETUID
使用 python 你可以:
python setuid.py 1997 1998 touch /tmp/test_file
touch
这将具有与使用 uid 1997 和 gid 1998运行相同的效果。
请注意,Python 脚本不需要创建为文件,它们可以内联传递: https://stackoverflow.com/a/16938013/453851
答案2
是否有任何常见的 Linux 实用程序允许更改为任意
UID
给定CAP_SETUID
?
不,他们没有。
我知道我可以编译一个小型
setuid(2)
应用程序,但是每次我想测试用户名称空间功能时将其传输到例如容器中是很麻烦的。
如果您计划在 bash 中进行测试框架,一切至少可以说,这将是“麻烦的”。