Hi all, please find the current state of my attempts at running the ping-localhost.sh test without requiring root privileges.
When using the Linux kernel, ping can use the CAP_NET_RAW capability instead of root privileges. Similarly to the suid file permission bit, capabilities can be given to executables. I plan to look into checking for capabilities instead of root privileges, in a later version of this. Br, Erik --- diff --git a/tests/ping-localhost.sh b/tests/ping-localhost.sh index 65802810..9920850f 100755 --- a/tests/ping-localhost.sh +++ b/tests/ping-localhost.sh @@ -21,7 +21,7 @@ # # * Shell: SVR3 Bourne shell, or newer. # -# * id(1). +# * cut(1), id(1), uname(1). . ./tools.sh @@ -56,11 +56,34 @@ if test "$TEST_IPV4" = "no" && test "$TEST_IPV6" = "no"; then exit 77 fi -if test `func_id_uid` != 0; then - echo "ping needs to run as root" +have_privs="no" +test `func_id_uid` = 0 && have_privs="yes" + +need_privs="yes" +PING_GROUP_RANGE=/proc/sys/net/ipv4/ping_group_range +if test `uname -s` = "Linux" && test -f "$PING_GROUP_RANGE" +then + low=`cut -f1 "$PING_GROUP_RANGE"` + high=`cut -f2 "$PING_GROUP_RANGE"` + for grp_id in `id -G`; do + test "$low" -le "$grp_id" && test "$high" -ge "$grp_id" && + need_privs="no" && break + done +fi + +if test "$need_privs" = "yes" && test "$have_privs" = "no"; then + echo >&2 "ping needs to run as root" exit 77 fi +# ping6 requires privileges +test "$need_privs" = "no" && test "$have_privs" = "no" && + test "$TEST_IPV6" != "no" && TEST_IPV6="no" && + echo >&2 "ping6 needs to run as root, skipping IPv6 test" && + test "$TEST_IPV4" = "no" && + echo >&2 "Not testing IPv4 either. Skipping test." && + exit 77 + errno=0 errno2=0