저는 여기에 처음이고 bash/linux를 처음 접했습니다.
선생님은 sudo를 사용할 때가 아니라 "실제" 루트일 때만 스크립트가 실행되도록 하는 과제를 주셨습니다. 두 시간 동안 검색하고 노력한 후에 나는 그가 바람을 피우고 있다고 생각하기 시작했습니다. 루트만 허용하면 쉬운데 sudo로 실행하는 사용자는 어떻게 제외하나요?
이것이 내가 가진 것입니다:
if [[ $EUID -ne 0 ]]; then
echo "You must be root to run this script."
exit
fi
답변1
내가 생각할 수 있는 유일한 방법은 SUDO_*
sudo가 설정한 환경 변수 중 하나를 확인하는 것입니다.
#!/usr/bin/env sh
if [ "$(id -u)" -eq 0 ]
then
if [ -n "$SUDO_USER" ]
then
printf "This script has to run as root (not sudo)\n" >&2
exit 1
fi
printf "OK, script run as root (not sudo)\n"
else
printf "This script has to run as root\n" >&2
exit 1
fi
물론 이 솔루션은 스크립트를 실행하기 전에 다른 사람이 변수를 설정하는 것을 막을 수 없으므로 미래에도 사용할 수 없습니다.
$ su
Password:
# SUDO_USER=whatever ./root.sh
This script has to run as root (not sudo)
# ./root.sh
OK, script run as root (not sudo)
답변2
또 다른 옵션은 상위 프로세스 이름이 "sudo"인지 확인하는 것입니다.
#!/bin/sh
if [ "$(id -u)" -eq 0 ]
then
if [ $(ps -o comm= -p $(ps -o ppid= -p $$)) = "sudo" ]
then
echo Running under sudo
else
echo Running as root and not via sudo
fi
else
echo Not running as root
fi
답변3
어떤 사용자가 로그인했는지에 대한 정보는 에서 확인할 수 있습니다 /proc/self/loginuid
.편집하다 설명: 이 파일은 모든 시스템에 존재하지 않는 것 같습니다. 테스트한 결과 Centos 6, Fedora 32, Fedora 33 및 Ubuntu 20.04에서 모두 표준 x86_64 설정으로 작동합니다.
사용자로 로그인하여 루트를 사용 sudo
하거나 su
루트가 되어도 이는 변경되지 않으며 /proc/self/loginuid
0이 아닌 값이 됩니다. 루트로 직접 로그인하면 cat /proc/self/loginuid
이것이 반환됩니다 0
. 이 파일은 루트 사용자라도 수정할 수 없습니다. 편집하다 Stéphane Chazelas의 의견에 감사드립니다. 루트를 사용할 수 있지만 echo 0 > /proc/self/loginuid
설정을 통해 이를 방지할 수 있습니다 auditctl --loginuid-immutable
.
실제 루트 디렉터리( auditctl --loginuid-immutable
설정된 경우)를 확인하는 스크립트는 다음과 같습니다.
#!/bin/bash
loginuid=$(cat /proc/self/loginuid)
echo $loginuid
if [[ $loginuid -ne 0 ]]; then
echo "You did not log in as root."
exit
fi
답변4
프로세스 목록 문자열을 확인하고 사용자가 사용하고 있는지 확인하는 것이 좋습니다.sudo
contype=`tty | cut -d '/' -f 3`
tty="$contype/`tty | cut -d '/' -f 4`"
if [ "$(id -u)" -eq 0 ]
then
res=`ps ax | grep "$tty" | grep "$0" | grep "sudo"`
if [ $? == 0 ]
then
echo "You should not run the script using sudo!"
exit 2
else
echo "Done."
fi
else
echo "You are not root. Run this script as root."
exit 2
fi
res
결과를 다시 필터링하고 싶다면 이 변수가 적합합니다.
Arkadusz 코드는 좋지만 안타깝게도 쉽게 우회할 수 있습니다...