편집하다

편집하다

이 스레드에서 질문이 있습니다.sudoers에 입력된 경로를 두 번 클릭하여 bash 스크립트를 실행하는 방법은 무엇입니까?. sudo파일에 권한을 부여하는 것은 안전하지 않다는 설명을 들었으므로 파일 자체에 권한을 부여 하지 않고 script.sh파일을 두 번 클릭하는 방법을 찾기로 결정했습니다 .script.shsudo안전을 보장하고.

저는 Debian 12와 KDE Plasma 데스크탑 환경을 사용하고 있습니다. 명령을 실행하려면 sudo sh /path/to/script.sh터미널로 이동하여 을 입력한 sudo sh /path/to/script.sh다음 비밀번호를 입력해야 합니다. 사용자 인터페이스에서 두 번 클릭한 다음 파일을 실행할 수 있는 파일을 원하므로 sudo sh /path/to/script.sh두 번 클릭한 후 암호를 입력하기만 하면 됩니다.

sudo스크립트에는 , ip tuntap add dev또는 에서만 사용할 수 있는 일부 명령이 있습니다 route add. 어떻게 해야 하나요?

감사해요.

답변1

편집하다

더 많은 정보를 제공하기 위해 댓글을 편집하셨으므로 이제 완전한 답변을 드릴 수 있습니다. KDE Plasma를 실행하는 친구에게 확인해 본 결과 기본 동작은 실행 가능 비트가 설정되어 있다는 가정 하에 데스크탑에서 스크립트를 두 번 클릭하면 스크립트가 실행되는 것이라고 말했습니다. 터미널에서 실행되지 않으므로 스크립트는 자체 터미널을 만들어야 합니다. 이를 염두에 두고 지침은 다음과 같습니다.

  1. 스크립트에 shebang을 추가하세요

#!/bin/sh스크립트의 시작 부분에 이 줄을 추가하세요 . 이는 시스템이 파일을 실행하는 데 사용하는 쉘을 알려줍니다.

  1. 파일을 실행 가능하게 만들기

파일을 마우스 오른쪽 버튼으로 클릭 permissions하고 아래 확인란을 선택합니다 executable. 또는 chmod +x /path/to/script.sh.

  1. sudo스크립트 내에서 각 명령에 접두사를 추가합니다(필요한 경우).

  2. 터미널에 스크립트가 열려 있는지 확인하세요.

스크립트 시작 부분(그러나 shebang 뒤에)에 다음 코드 조각을 추가하면 됩니다.

test "$IN_TERM" || {
    export IN_TERM=1
    konsole --hold -e "$0"
    exit 0
} && true

KDE의 기본 터미널인 Konsole을 사용합니다. 이 --hold플래그를 사용하면 스크립트가 완료된 후에도 터미널이 열린 상태로 유지되므로 올바르게 실행되었는지 확인할 수 있습니다.

그게 다입니다. 모든 것이 잘 작동할 것입니다!

모든 것이 어떻게 생겼는지에 대한 대략적인 아이디어를 제공하기 위해 내 시스템에 유사한 스크립트가 있습니다. 네트워크 설정이 변경된 것이 아니라 노트북의 충전 동작이 변경되었지만 일반적인 아이디어는 비슷합니다.

#!/bin/sh

set -x  # Print all commands before running them
set -e  # Exit on first error

test "$IN_TERM" || {
    export IN_TERM=1
    alacritty --hold -e "$0"  # I use alacritty as my terminal.
    exit 0
} && true

sudo -v  # Ask for password, but don't run any command

# Subsequent invocations of `sudo` won't ask for password
sudo tpacpi-bat -s ST 1 0
sudo tpacpi-bat -s SP 1 0

echo 'Done!'

안전

댓글에서 sudo스크립트 자체를 넣는 것에 대해 우려한다고 언급하셨습니다. 저는 보안 연구원은 아니지만 이것이 완전히 정확하고 안전하다고 확신합니다. sudo사용자에게는 비밀번호를 묻는 메시지가 계속 표시됩니다. 시스템의 다른 사용자나 귀하의 사용자 권한으로 실행되는 악성 프로그램은 어떤 방식으로든 귀하의 스크립트를 악용할 수 없습니다. 스크립트를 넣는 sudo것은 눈살을 찌푸리게 할 수 있지만 보안과 전혀 관련이 없는 이유로 인해(예: sudo이 스크립트를 다른 사람에게 배포할 계획이라면 모든 사람이 스크립트를 설치하지 않았기 때문에 스크립트를 넣는 것이 문제가 될 수 있습니다 sudo).

오래된 답변

의견에서 알 수 있듯이 어떤 배포판/데스크톱 환경을 사용하고 있는지 알려주지 않으시기 때문에 실제로 도움을 드릴 수 없습니다.

하지만 몇 가지 조언을 드릴 수 있습니다.

모바일 스크립트 sudo내부

sudo이 경우 호출을 스크립트 자체로 옮기는 것이 더 나을 것이라고 생각합니다 . 스크립트 시작 부분에 다음과 같은 내용을 추가하면 됩니다.

test "$(id -u)" -eq 0 || {
    sudo sh "$0"
    exit 0
}

또 다른 옵션은 첫 번째 스크립트를 시작하는 두 번째 스크립트를 만드는 것입니다 sudo. 세 번째 옵션은 스크립트에 루트 전용 명령을 추가하는 것입니다 sudo. 비밀번호는 한 번만 묻습니다.

실행 가능 비트 설정

터미널에서 를 실행하면 chmod +x /path/to/script.sh파일이 실행 가능해집니다. /path/to/script.sh대신 시작 스크립트를 사용하여 작동하는지 테스트할 수 있습니다 sh /path/to/script.sh. 일부 데스크탑 환경에서는 스크립트를 두 번 클릭하여 GUI를 통해 실행할 수도 있습니다.

올바른 shebang 설정

스크립트가 #!/bin/sh(또는 #!/bin/bash(또는 #!/usr/bin/env bash) 스크립트가 bash 전용 기능을 사용하는 경우) 로 시작하는지 확인하십시오.

배포판의 설정 앱을 더 자세히 살펴보세요.

보안상의 이유로 두 번 클릭 시작 스크립트가 비활성화될 수 있습니다. 파일 관리자나 데스크톱 환경 설정에서 이 옵션을 찾아보세요. 여기

파일 을 만듭니다 .desktop.

위의 방법이 실패하면 myscript.desktop다음 내용을 Type포함 하는 파일을 만들고 Comment및 필드를 편집할 수 있습니다 Exec.

[Desktop Entry]
Version=1.0
Type=Application
Name=your_human_friendly_name
Comment=your_human_friendly_comment
Exec=/path/to/script.sh
Terminal=false
StartupNotify=false
Categories=Application;

이제 파일을 두 번 클릭하여 스크립트를 실행할 수 있습니다. 이것을 sudo스크립트로 옮겨야 한다는 점에 유의하세요 . 터미널 내에서 스크립트를 실행해야 하는 경우 이 Terminal필드를 변경하세요. 이 방법이 작동하려면 스크립트에 실행 가능 비트가 설정되어 있어야 합니다.

파일의 또 다른 이점 은 파일을 또는 .desktop에 넣으면 애플리케이션 실행기를 통해 액세스할 수도 있다는 것입니다./usr/share/applications~/.local/share/applications

gendesk또는 자동으로 .dekstop파일을 생성하는 도구가 있지만 파일을 수동으로 작성하는 것도 가능합니다.

사용gksudo

원하는 동작을 달성하는 방법을 알아냈지만 데스크탑 환경이 터미널 없이 스크립트를 실행하는 경우 sudo. gksudo배포판에 따라 다른 이름을 사용하고 대신 사용합니다 sudo. 동일한 방식으로 작동하지만 터미널을 사용하는 대신 GUI 비밀번호 입력 상자를 만듭니다.

스크립트가 자체 터미널을 시작하도록 허용

대화형 이외의 이유로(예: 사용자에게 출력 표시) 터미널에서 스크립트를 실행해야 하는 경우 sudo이를 스크립트 시작 부분(그러나 shebang 뒤)에 배치하여 항상 스크립트가 실행되도록 할 수 있습니다. 터미널의 터미널:


test "$IN_TERM" || {
    export IN_TERM=1
    alacritty --hold -e "$0"
    exit 0
} && true

위의 코드 조각은 alacritty내가 선호하는 터미널을 사용하고 있습니다. 사용중인 터미널로 변경하십시오. 또한 --hold-e플래그에 주목하십시오. 또한 민첩성에 따라 다릅니다. -e실제로 -c대부분의 다른 터미널에서는 .

사용rofi

이것은 귀하의 질문에 대한 답변은 아니지만 유용하다고 생각합니다. 신속하게 시작할 수 있어야 하는 다양한 스크립트가 있는 경우 이 점을 고려하십시오 rofi. 이를 통해 언제든지 시작할 준비가 된 모든 스크립트에 대한 검색 가능한 메뉴를 가질 수 있습니다. 이런 방식으로 rofi를 사용하려면 먼저 rofi_launch.sh다음과 같은 스크립트를 만들어야 합니다 .

#!/bin/bash

if [ -z "$1" ]; then
    ls /path/to/where/you/store/your/scripts
else
    FILE="/path/to/where/you/store/your/scripts/$1"
    killall rofi
    "$FILE" & disown
fi

그런 다음 rofi를 실행하면 rofi -show RUN:/path/to/rofi_launch.sh(데스크톱 환경 설정에서 키보드 단축키에 바인딩할 수 있음) 스크립트를 실행할 수 있는 메뉴가 표시됩니다.

답변2

저는 조금 늦었습니다. Lenzev는 이미 훌륭한 답변을 제공했습니다. 그러나 완전성을 위해 언급할 필요가 있다고 생각합니다.pkexec. 사용법은 매우 간단합니다 pkexec /path/to/script.sh(스크립트에 실행 가능한 비트가 설정되어 있다고 가정). 게다가 이 방법은 파일과 매우 잘 일치합니다 .desktop.

pkexec(또는 실제로 그것이 속한 메커니즘인 polkit)은 권한을 상승시키는 또 다른 표준 방법이며 그래픽 데스크탑과 더 효과적으로 결합되는 경향이 있습니다. 루트 액세스가 필요한 Gparted와 같은 도구를 사용한 경우 일반적으로 그래픽 비밀번호 프롬프트를 표시하여 이 작업을 수행합니다. 이것이 바로 polkit의 기능입니다.

특정 팝업은 실제로 데스크탑 환경에서 제공되므로 창 관리자 사용자는 명시적으로 팝업을 설치해야 할 수도 있습니다. 플라즈마 사용을 언급하셨기 때문에 이미 플라즈마가 내장되어 있습니다.

관련 정보