![bash 脚本环境/结果歧义](https://linux22.com/image/161732/bash%20%E8%84%9A%E6%9C%AC%E7%8E%AF%E5%A2%83%2F%E7%BB%93%E6%9E%9C%E6%AD%A7%E4%B9%89.png)
我正在使用 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 不能像我在终端中那样调用脚本?我究竟做错了什么?
编辑:如果有人能想出更好的标题,请随意更改。我不知道如何谷歌这个,我的结果很差并且有很多误报
/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
?
答案1
你的sudo
定义是错误的。您已允许networkmenu
使用 运行sudo
,但实际上您使用的networkmenu
是而不是sudo networkmenu
,因此没有授予它额外的运行权限。 (简单地将条目放入sudoers
文件中并不授予该应用程序任何额外的权限;相反,它允许命令sudo
为指定的应用程序提供那些定义的权限。)
sudo
您在脚本中使用的唯一位置是 for sudo wpa_cli ...
,因此您需要在下运行整个脚本sudo
,或者需要允许wpa_cli
从 调用sudo
。
选项 1:允许整个脚本以 root 权限运行
sudo
条目没有变化PATH
在脚本顶部显式设置,因为它将以 root 身份运行sudo
删除脚本中 from的所有实例- 将该工具称为“
sudo networkmenu
而不是仅仅”networkmenu
选项 2:允许脚本以非特权用户身份运行,但允许命令提升wpa_cli
:
更改
sudo
条目speklap ALL=(ALL) NOPASSWD: /sbin/wpa_cli *
PATH
在脚本顶部显式设置,因为wpa_cli
位于用户PATH
设置中经常省略的目录 (/sbin
)