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搜尋,結果很差,而且有很多誤報
編輯:
/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 ''
所以現在我們知道問題是什麼了,
sudo: no tty present and no askpass program specified
我可以通過添加wpa_cli
到 sudoers 文件來解決這個問題嗎?或者有沒有更好的解決方案。如更改networkmenu
為sudo bash /$HOME/function.sh
?
你的
sudo
定義是錯誤的。您已允許networkmenu
使用 執行sudo
,但實際上使用的是networkmenu
代替sudo networkmenu
,因此沒有額外的執行權限。(只是將條目放入sudoers
文件中不會授予該應用程序任何額外的權限;相反,它允許sudo
命令為指定的應用程序提供那些已定義的權限。)您在腳本中使用的唯一位置
sudo
是 forsudo wpa_cli ...
,因此您需要在下執行整個腳本,sudo
或者您需要允許wpa_cli
從sudo
.選項 1:允許整個腳本以 root 權限執行
sudo
條目沒有變化- 在腳本頂部顯式設置
PATH
,因為它將以 root 身份執行sudo
刪除腳本中的所有實例- 呼叫該工具
sudo networkmenu
而不是僅僅networkmenu
選項 2:允許腳本以非特權使用者身份執行,但允許
wpa_cli
命令提升:
- 更改
sudo
條目speklap ALL=(ALL) NOPASSWD: /sbin/wpa_cli *
PATH
在腳本頂部顯式設置,因為它位於使用者設置wpa_cli
中經常省略的目錄中( )PATH``/sbin