Bash

bash 腳本環境/結果歧義

  • October 5, 2019

我正在使用 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/networkmenusudoers 文件添加到無需密碼即可執行。

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 文件來解決這個問題嗎?或者有沒有更好的解決方案。如更改networkmenusudo bash /$HOME/function.sh?

你的sudo定義是錯誤的。您已允許networkmenu使用 執行sudo,但實際上使用的是networkmenu代替sudo networkmenu,因此沒有額外的執行權限。(只是將條目放入sudoers文件中不會授予該應用程序任何額外的權限;相反,它允許sudo命令為指定的應用程序提供那些已定義的權限。)

您在腳本中使用的唯一位置sudo是 for sudo wpa_cli ...,因此您需要在下執行整個腳本,sudo或者您需要允許wpa_clisudo.

選項 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

引用自:https://unix.stackexchange.com/questions/545173