내 스크립트가 Ubuntu 22.04에서 루트로 실행되지 않는 이유가 궁금합니다. 나는 어떤 종류의 인증도 요구하지 않고 이를 실행하는 사용자와 관계없이 이 작업을 수행하고 싶습니다. 스크립트는 루트인 것처럼 모든 명령을 실행해야 하지만 실제 루트 사용자만 읽거나 쓸 수 있습니다. 이를 달성하기 위해 나는 이 게시물의 지침을 따랐습니다.
쉘 스크립트를 항상 루트로 실행하도록 하는 방법이 있습니까?
그래서 제가 한 일은 다음과 같습니다.
1) 다음 내용(및 chmod +x)이 포함된 check-nvidia-audio.desktop이라는 데스크톱 파일을 /etc/xdg/autostart에 배치했습니다.
[Desktop Entry]
Version=1.0
Type=Application
Name=check_kernel
GenericName=Check the kernel version and unbind the NVIDIA audio driver
Comment=Check the kernel version and unbind the NVIDIA audio driver
Exec=sudo check-kernel
Icon=applications-biology
Path=/usr/sbin
Terminal=false
StartupNotify=false
2) /usr/sbin에서 다음 내용(및 chmod +x)을 포함하는 check-kernel이라는 스크립트:
if [ "`id -u`" -ne 0 ]; then
echo "Switching from `id -un` to root"
exec sudo "$0"
exit 99
fi
# Lets check the kernel version
function kernel-check() {
CURRENT_KERNEL_VERSION=$(uname --kernel-release | cut --delimiter="-" --fields=3-4)
echo CURRENT_KERNEL_VERSION = $CURRENT_KERNEL_VERSION
if [ "${CURRENT_KERNEL_VERSION}" = "liquorix-amd64" ]; then
echo "Kernel in use is already patched with the ACS patch and each NVIDIA audio device works great"
exit
else
echo "Kernel in use is not patched with the ACS patch so I have to unbind each NVIDIA audio device from its driver"
audio_device_list=( $(/usr/bin/iommu_viewer.sh | grep "Audio device.*: NVIDIA" | awk '{ print $3 }' ) )
audio_group_list=( $(/usr/bin/iommu_viewer.sh | grep "Audio device.*: NVIDIA" | awk '{ print $2 }' ) )
echo "audio nvidia gpu n. 1 =" ${audio_device_list[0]}
echo "audio nvidia gpu n. 2 =" ${audio_device_list[1]}
echo "iommu group nvidia gpu n. 1 =" ${audio_group_list[0]}
echo "iommu group nvidia gpu n. 2 =" ${audio_group_list[1]}
# Lets check the audio of the nvidia gpu
if [ ${audio_group_list[0]} -eq ${audio_group_list[1]} ]; then
for audio_device in "${audio_device_list[@]}"
do echo "$audio_device" > "/sys/bus/pci/devices/$audio_device/driver/unbind"
done
fi
fi
}
kernel-check
3) 이것은 내 /etc/sudoers 파일의 모습입니다:
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
Defaults use_pty
# Cmnd alias specification
ALL ALL = NOPASSWD: /usr/sbin/check-kernel
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "@include" directives:
@includedir /etc/sudoers.d
컴퓨터를 다시 시작하면 아무 일도 일어나지 않으며, 스크립트를 수동으로 실행하려고 하면 다음과 같은 일이 발생합니다.
:~$ check-kernel
Switching from ziomario to root
[sudo] password di ziomario:
or
:~$ sudo check-kernel
[sudo] password di ziomario:
이는 예상된 동작이 아닙니다. sudoers 파일에 다음과 같이 지정했기 때문에 비밀번호를 요구해서는 안 됩니다.
모두 모두 = NOPASSWD:/usr/sbin/check-kernel
완전히 무시하는 것 같습니다. 게다가 이 행동은 여기서 말한 내용을 무시합니다.
쉘 스크립트를 항상 루트로 실행하도록 하는 방법이 있습니까?
구체적으로 다음과 같은 가정을 합니다.
옵션 B: sudo를 통해 스크립트를 실행하세요.
ALL ALL = NOPASSWD: /usr/local/bin/reset-swap
그런 다음 재설정-스왑 대신 sudo 재설정-스왑을 호출할 수 있습니다.
관심이 있는 경우 스크립트가 루트로 실행되지 않는 경우 sudo 접두사를 지정하지 않고 실행되도록 자체 권한을 높일 수 있습니다.
#!/bin/sh
if [ "`id -u`" -ne 0 ]; then
echo "Switching from `id -un` to root"
exec sudo "$0"
exit 99
fi
swapoff /dev/sdb
shred -n0 -z /dev/sdb
mkswap /dev/sdb
swapon /dev/sdb
무엇이 잘못될 수 있는지 상상할 수 있나요? 감사해요.
NB1: 제공된 링크는 다음과 같이 제안하는 데 도움이 되지 않았습니다.
myusername ALL = (root) NOPASSWD: /path/to/my/program
불행하게도 내 프로젝트에서는 내 사용자 이름을 입력할 수 없습니다. 그 이유는 그것이 무엇인지 모르기 때문입니다. 나는 그것을 설치한 사용자만이 사용자 이름이 무엇인지 알 수 있는 사용자 정의 배포판을 만들고 있습니다. 나는 성공하지 못한 채 이런 일을 시도했습니다.
echo $USER ALL = (root) NOPASSWD: /usr/sbin/check-kernel
NB2: 작동하는 것 같습니다.
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
Defaults use_pty
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "@include" directives:
ALL ALL = NOPASSWD: /usr/sbin/check-kernel
@includedir /etc/sudoers.d