0

给定下表

$ connmanctl services
*AO MyNetwork               wifi_dc85de828967_68756773616d_managed_psk
    OtherNET                wifi_dc85de828967_38303944616e69656c73_managed_psk 
    AnotherOne              wifi_dc85de828967_3257495245363836_managed_wep
    FourthNetwork           wifi_dc85de828967_4d7572706879_managed_wep
    AnOpenNetwork           wifi_dc85de828967_4d6568657272696e_managed_none

我希望能够连接到网络,例如OtherNET,使用 stringOtherNET而不是 long wifi_dc85de828967_38303944616e69656c73_managed_psk,因为我不想计算我按下的次数Tab和/或检查wifi_提示中的行是否对应于预期的网络.

只有 connman可以做到这一点吗?还是我真的必须自己写一个包装器?

包含的man页面connmanctl

   services
          Shows a list of all available services. This  includes  the
          nearby wifi networks, the wired ethernet connections, blue‐
          tooth devices, etc.  An asterisk in front  of  the  service
          indicates that the service has been connected before.

   connect service
          Connects  to  the  given  service. Some services need a so-
          called provisioning file in order to connect to  them,  see
          connman-service.config(5).

两者都没有说明输出的格式或命令的使用。

类似地,Arch Linux 上的 wiki将最后一列称为以 .开头的第二个字段wifi_

4

1 回答 1

0

由于还没有人回答,所以我找了一些空闲时间来编写以下包装器,它基本上执行以下操作

  • 只要输入不是,就会继续阅读exit
  • 当提供以 开头的输入时connect,以下单词用于对来自 的一行(仅第一个匹配行)进行模式匹配connman services;这一行的最后一个字段(以 开头的那个wifi_)被转发到connmanctl connect
  • 任何其他非空输入按connmanctl原样转发。
  • 一定数量的空输入(通过NOINPUTS_BEFORE_EXIT默认为的变量传递3)导致脚本exit.

脚本如下

#!/usr/bin/env bash
name=$(basename $0)
noinputs_before_exit=${NOINPUTS_BEFORE_EXIT:=3}
while [[ $cmd != 'exit' ]]; do
  echo -n "$name " 1>&2
  read cmd
  if [[ -z "$cmd" ]]; then
    (( --noinputs_before_exit == 0 )) && exit
  else
    noinputs_before_exit=$NOINPUTS_BEFORE_EXIT
    if [[ $cmd =~ ^connect\  ]]; then
      connmanctl connect $(connmanctl services | awk '/'"${cmd#* }"'/ { print $NF; exit }')
    else
      connmanctl $cmd
    fi
  fi
done

脚本限制至少如下:

  • (对我来说不太重要)我不知道它是否符合任何安全要求;
  • 它不允许Tab-完成;
  • (对我来说最重要的是)它不使用readline库,所以行编辑是不可能的。
于 2019-09-29T16:08:35.337 回答