bash 스크립트 환경/결과 모호성

bash 스크립트 환경/결과 모호성

저는 i3wm을 사용하여 Arch Linux를 실행하고 있습니다.

$ uname -a
Linux lappie 5.3.1-arch1-1-ARCH #1 SMP PREEMPT Sat Sep 21 11:33:49 UTC 2019 x86_64 GNU/Linux
$ i3 --version
i3 version 4.17.1 (2019-08-30) © 2009 Michael Stapelberg and contributors

function.sh사용할 수 있는 스크립트 파일이 있습니다 wpa_cli. 이 파일은 반환 결과를 확인 > scan하고 스캔이 성공하면 결과를 반환합니다.

#!/bin/bash

logfile=/$HOME/.logfile

echo "function" >> $logfile
echo "" >> $logfile

interface="wlp2s0"

function scan_wifi {


    scan=$(sudo wpa_cli -i $interface scan)
    echo "scan: $scan" >> $logfile

        case "$scan" in
        "OK")
            echo "Scanning wifi" >> $logfile
            scan_res=$(sudo wpa_cli -i $interface scan_results | awk 'NR>1 {OFS="\n>>"; print $NF}')
            echo "results: $scan_res" >> $logfile
            echo $scan_res
            ;;
        "FAIL")
            echo "FAILED TO SCAN" >> $logfile
            echo "FAILED TO SCAN"
            ;;
        *)
            echo "ERROR: empty or undefined event for $interface" >> $logfile
            exit 1
            ;;
    esac

}

echo "return: $(scan_wifi)" >> $logfile
echo "" >> $logfile
echo "" >> $logfile

function.sh$HOME디렉토리에 있습니다. /usr/local/bin/networkmenu다음 내용이 포함된 파일 도 있습니다 .

#!/bin/sh

bash /home/speklap/function.sh

여태까지는 그런대로 잘됐다. /user/local/bin/networkmenu비밀번호 없이 실행할 수 있도록 sudoers 파일에 추가했습니다 .

speklap ALL=(ALL) NOPASSWD: /usr/local/bin/networkmenu

터미널에서 사용자로:

$ networkmenu

.logfile:

function

scan: OK
Scanning wifi
results: thuis
return: thuis

하지만 i3을 통해 바로가기를 사용하여 실행하면 작동하지 않습니다.

.config/i3/config:

bindsym $mod+n exec networkmenu

결과는 다음과 같습니다 .logfile.

function

scan: 
ERROR: empty or undefined event for wlp2s0
return: 

왜 그렇습니까? i3이 터미널에서 할 수 있는 것처럼 스크립트를 호출할 수 없는 이유는 무엇입니까? 내가 뭘 잘못했나요?

편집: 더 나은 제목이 생각나는 경우 자유롭게 변경하세요. Google에서 검색하는 방법을 모르겠습니다. 결과가 좋지 않고 오탐(false positive)이 많이 발생합니다.

/tmp/nm.log편집: @cas의 댓글 출력에 이어

+ logfile=//home/speklap/.logfile
+ echo functions
+ echo ''
+ interface=wlp2s0
++ scan_wifi
+++ sudo wpa_cli -i wlp2s0 scan
sudo: no tty present and no askpass program specified
++ scan=
++ echo 'scan: '
++ case "$scan" in
++ echo 'ERROR: empty or undefined event for wlp2s0'
++ exit 1
+ echo 'return: '
+ echo ''
+ echo ''

이제 문제가 무엇인지 알았으니 sudoers 파일에 추가하여 문제를 해결할 sudo: no tty present and no askpass program specified 수 있나요 ? wpa_cli아니면 더 나은 해결책이 있습니다. 예를 들어, ? networkmenu로 변경합니다.sudo bash /$HOME/function.sh

답변1

당신의 sudo정의가 잘못되었습니다. networkmenurun 사용 권한을 부여했지만 실제로는 대신 sudo사용하고 있으므로 추가 실행 권한을 부여하지 않습니다. (단순히 파일 에 항목을 넣는 것만으로는 응용 프로그램에 추가 권한이 부여되지 않습니다. 오히려 명령이 지정된 응용 프로그램에 정의된 권한을 제공할 수 있습니다.)networkmenusudo networkmenusudoerssudo

sudo스크립트에서 사용하는 유일한 위치는 이므로 sudo wpa_cli ...전체 스크립트를 에서 실행 하거나 에서 호출을 sudo허용해야 합니다 .wpa_clisudo

옵션 1: 전체 스크립트가 루트 권한으로 실행되도록 허용

  • sudo항목이 변경되지 않았습니다.
  • PATH루트로 실행되므로 스크립트 상단에 명시적으로 설정합니다.
  • sudo스크립트에서 from의 모든 인스턴스 삭제
  • 도구를 " sudo networkmenu그냥"이 아니라 "라고 부르세요.networkmenu

옵션 2: 스크립트가 권한 없는 사용자로 실행되도록 허용하지만 명령 권한 상승은 허용합니다 wpa_cli.

  • sudo항목 변경

    speklap ALL=(ALL) NOPASSWD: /sbin/wpa_cli *
    
  • PATHwpa_cli사용자 설정에서 PATH종종 생략되는 디렉터리 에 있으므로 스크립트 상단에 명시적으로 설정합니다 ( /sbin).

관련 정보