我有一个使用网络命名空间(netns)的架构。我想允许普通用户在这些网络中进行一些操作。
我可以写一个脚本netns-exec.sh
,灵感来自这个帖子,用 执行sudo
,包含:
ip netns exec $1 su $USER -c "$2"
并添加到我的 sudoer 文件中:
user ALL=(ALL) /path/to/netns-exec.sh
但我觉得它太丑了,我完全可以做噩梦。有没有更好的解决方案来允许普通用户使用命名空间?是否可以将用户放入一些有用的组中?我搜索了一下,但一无所获。
答案1
答案2
解决方案1
只需添加一个名为“netns”的组,将所有想要的用户添加到其中。然后将所有权授予 root:netns 并授予该组读取/执行能力。
换句话说:
# New group netns
sudo groupadd --system netns
# Add root to "netns", not sure if needed
sudo usermod -aG netns root
# Do this for every needed user
sudo usermod -aG netns $UserName
# Change ownership to root, grant rw acces to group netns
sudo chown root:netns /path/to/netns-exec.sh
sudo chmod 633 /path/to/netns-exec.sh
解决方案2
这个解决方案更简单,您必须编辑 sudoers 文件,如下所示这个例子。
user ALL=(ALL) /bin/ip netns
答案3
不是脚本,但我编写了一个超简约且希望足够偏执的 C 程序,它允许非 root 用户在 Linux 网络命名空间内执行进程。
源代码在这里:netns-exec.c
答案4
就我个人而言,我不知道是否有可能允许普通用户在不同的网络命名空间中运行命令,但是这个带注释的 shell 脚本可能更适合您的需求:
#!/bin/bash
# ip netns wrapper script, nns.
# Usage: nns nsname cmdline
case "${1}" in
do)
shift # remove "do"
NSNAME="${1}" # remember nsname
shift # remove nsname to get argument list for su -c
[ -z "${NSNAME}" -o -z "${1}" ] && exit 1 # if either nsname or arglist is empty - error out
echo ip netns exec "${NSNAME}" su "${SUDO_USER}" -c "${*}" # execute, ${*} merges separate arguments into single word for su/sh -c parsing. See with strace.
;;
*)
SCRIPTNAME="${0}" # remember script full path
exec sudo "${SCRIPTNAME}" do "${@}" # run it through sudo with elevated privileges
;;
esac
将其安装在某个位置/usr/bin
并允许您的用户执行它。