私は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
使用しているので、追加の実行権限を付与しません。 (単にファイルに項目を入れるだけでは、アプリケーションに追加の権限は付与されません。むしろ、コマンドが指定されたアプリケーションに定義された権限を提供できます。)networkmenu
sudo networkmenu
sudoers
sudo
sudo
スクリプトが使用する唯一の場所なので、スクリプト全体sudo wpa_cli ...
をから実行するか、から呼び出しをsudo
許可する必要があります。wpa_cli
sudo
オプション1:スクリプト全体をroot権限で実行できるようにする
sudo
アイテムは変更されていません。PATH
ルートとして実行されるので、スクリプトの上部に明示的に設定します。sudo
スクリプトからfromのすべてのインスタンスを削除する- ツールを「
sudo networkmenu
ただ」ではなく「と呼んでください。networkmenu
オプション2:スクリプトを許可されていないユーザーとして実行することを許可しますが、コマンド権限の昇格は許可しますwpa_cli
。
sudo
アイテムの変更speklap ALL=(ALL) NOPASSWD: /sbin/wpa_cli *
PATH
wpa_cli
ユーザー設定からPATH
しばしば省略されるディレクトリにあるので、スクリプトの上部に明示的に設定します(/sbin
)。