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で検索する方法がわかりません。結果が悪く、誤検知が多く発生します。

/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実行権限を付与しましたが、実際には代わりにsudo使用しているので、追加の実行権限を付与しません。 (単にファイルに項目を入れるだけでは、アプリケーションに追加の権限は付与されません。むしろ、コマンドが指定されたアプリケーションに定義された権限を提供できます。)networkmenusudo networkmenusudoerssudo

sudoスクリプトが使用する唯一の場所なので、スクリプト全体sudo wpa_cli ...をから実行するか、から呼び出しをsudo許可する必要があります。wpa_clisudo

オプション1:スクリプト全体をroot権限で実行できるようにする

  • sudoアイテムは変更されていません。
  • PATHルートとして実行されるので、スクリプトの上部に明示的に設定します。
  • sudoスクリプトからfromのすべてのインスタンスを削除する
  • ツールを「sudo networkmenuただ」ではなく「と呼んでください。networkmenu

オプション2:スクリプトを許可されていないユーザーとして実行することを許可しますが、コマンド権限の昇格は許可しますwpa_cli

  • sudoアイテムの変更

    speklap ALL=(ALL) NOPASSWD: /sbin/wpa_cli *
    
  • PATHwpa_cliユーザー設定からPATHしばしば省略されるディレクトリにあるので、スクリプトの上部に明示的に設定します(/sbin)。

関連情報