저는 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
정의가 잘못되었습니다. networkmenu
run 사용 권한을 부여했지만 실제로는 대신 sudo
사용하고 있으므로 추가 실행 권한을 부여하지 않습니다. (단순히 파일 에 항목을 넣는 것만으로는 응용 프로그램에 추가 권한이 부여되지 않습니다. 오히려 명령이 지정된 응용 프로그램에 정의된 권한을 제공할 수 있습니다.)networkmenu
sudo networkmenu
sudoers
sudo
sudo
스크립트에서 사용하는 유일한 위치는 이므로 sudo wpa_cli ...
전체 스크립트를 에서 실행 하거나 에서 호출을 sudo
허용해야 합니다 .wpa_cli
sudo
옵션 1: 전체 스크립트가 루트 권한으로 실행되도록 허용
sudo
항목이 변경되지 않았습니다.PATH
루트로 실행되므로 스크립트 상단에 명시적으로 설정합니다.sudo
스크립트에서 from의 모든 인스턴스 삭제- 도구를 "
sudo networkmenu
그냥"이 아니라 "라고 부르세요.networkmenu
옵션 2: 스크립트가 권한 없는 사용자로 실행되도록 허용하지만 명령 권한 상승은 허용합니다 wpa_cli
.
sudo
항목 변경speklap ALL=(ALL) NOPASSWD: /sbin/wpa_cli *
PATH
wpa_cli
사용자 설정에서PATH
종종 생략되는 디렉터리 에 있으므로 스크립트 상단에 명시적으로 설정합니다 (/sbin
).