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 不能像我在终端中那样调用脚本?我究竟做错了什么?

编辑:如果有人能想出更好的标题,请随意更改。我不知道如何谷歌这个,我的结果很差并且有很多误报

/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

答案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)

相关内容