Shell

Shell学习(定期不更新

Posted on
前言:
    这学期自己去选了大三的Linux课,因为用了一年多的Linux,感觉到了瓶颈,就是那种日常使用已经
基本没有问题,但总觉得只能写一些小东西,想进一步深入也不知道从何下手,本着去试试学校的课程的心
态选了这门选修课。然而今天第一次上机实验看了一下全部实验内容,感觉………一时语塞…………就当是给自己
一个学习的氛围和平台好了,并以此记录学习过程。
    其实说到shell,以前是学过的,但没有系统学,自己瞎学之后写了几个脚本就过去了。趁这个机会就
把自己当前不熟的命令都记录下来。

Table of contents

stdio

  1. echo

    echo默认输出是有换行的,不换行只要在后面加个\c即可

    echo "Key\c";echo " is handsome"

    Key is handsome

  2. printf

    printf 是shell的格式化输出,其用法除了括号与逗号外基本和C语言一致

    printf "%s is a %s man\n" "Key" "handsome"

    Key is a handsome man

    Note : 并非所有shell的printf都支持浮点输出,若不支持可用 awk 自带的 printf

string

  1. expr

    expr常被用于shell中的算术计算,但它也具有字符串操作的能力

    • 字符查找

      expr index "Key is a handsome man" "hand"

      8

      他的结果是 8 如果你仔细数一下 hand是第10位置,而第8是a。没错,这个命令只能查找单个字符,
      匹配并返回第一个 所要索引的字符串中第一个匹配的字符。

    • 选取子串

      expr substr "Key is a handsome man" 1 3

      Key

    Note : expr命令的字符串位置是从1开始的

  2. 自带命令

    str="abbc,def,ghi,abcjkl"

    Note : 自带命令的匹配都必须从头(尾)开始匹配,无法直接匹配中间子串

命令结果补充说明
echo

*** QuickLaTeX cannot compile formula:
{str#a*c}</td>
  <td>,def,ghi,abcjkl</td>
  <td>一个井号(#) 表示从左边截取掉最短的匹配</td>
</tr>
<tr>
  <td><code>echo

*** Error message:
You can't use `macro parameter character #' in math mode.
leading text: ${str#

{str##a*c}

jkl,两个井号(##) 表示从左边截取掉最长的匹配
echo

*** QuickLaTeX cannot compile formula:
{str#"a*c"}</code></td>
  <td><code>abbc,def,ghi,abcjkl</code></td>
  <td>因为str中没有"a*c"子串</td>
</tr>
<tr>
  <td><code>echo

*** Error message:
You can't use `macro parameter character #' in math mode.
leading text: ${str#

{str##"a*c"}

abbc,def,ghi,abcjkl同理
echo

*** QuickLaTeX cannot compile formula:
{str#*a*c*}</code></td>
  <td></td>
  <td>全部删除</td>
</tr>
<tr>
  <td><code>echo

*** Error message:
You can't use `macro parameter character #' in math mode.
leading text: ${str#

{str##*a*c*}

全部删除
echo

*** QuickLaTeX cannot compile formula:
{str#d*f)</code></td>
  <td><code>abbc,def,ghi,abcjkl,</code></td>
  <td></td>
</tr>
<tr>
  <td><code>echo

*** Error message:
You can't use `macro parameter character #' in math mode.
leading text: ${str#

{str#*d*f}

,ghi,abcjkl
echo

*** QuickLaTeX cannot compile formula:
{str%a*l}</code></td>
  <td><code>abbc,def,ghi</code></td>
  <td>一个百分号(%)表示从右边截取最短的匹配</td>
</tr>
<tr>
  <td><code>echo

*** Error message:
Missing } inserted.
leading text:   <td><code>echo$

{str%%b*l}

a两个百分号(%%)表示从右边截取最长匹配
echo ${str%a*c}abbc,def,ghi,abcjkl|

Updated Time: 3.23 0:51

Linux

如何在linux下手动连接无线网络

Posted on

无线网的连接在linux中总是会出现这样那样的问题(个人经历是这样的)。
尤其是学校的校园网,掉的真是恶心,一掉就再也连不上。
我曾经试过NetworkManager,connman,netctl等自动连接工具,但效果不佳。
非常无奈地我只能去学手动连接,发现居然十分稳定,只要连上去之后根本不会掉线。

以下是手动连接的步骤

0. 配置准备

0.1 我们所需要的工具有

  1. iw
  2. ip
  3. wpa_supplicant
  4. dhcpcd

这几个工具请读者自行安装,不同发行版软件包有所不同,我这里不详细阐述

0.2 关闭所有自动连接服务

这里必须强调一下自动连接服务的运行将导致手动连接无法起作用
另一方面,我也說一下,不同的自动连接服务同时打开从而导致无法自动连接也是常见的问题
所以如果读者决定以后要尝试手动连接的话,请先把自动连接服务关闭

关闭的方法

首先介绍一下管理服务的进程

Linux系统中,init有以下三种主要的实现版本:
1. System V init:传统的顺序init(Sys V, 读作"sys-five"),为Red Hat Enterprise Linux 和其他发行版使用
2. systemd 新出现的init。很多Linux发行版已经或者正在计划转向 systemd。
3. Ubuntu 上的init。不过在本书编写是,Ubuntu 也计划转向systemd

(选自《精通LInux》)

主要就是以上三个,那我就以systemd介绍一下怎么关闭 (会的读者可以自行跳过

  • systemctl status 查看所有的服务
  • sytemctl stop <Tab> 可以查看正在运行的服务(我这里用的是zsh,不知道bash可不可以
  • systemctl start/stop 服务名 开启/关闭 该服务
  • systemctl enable/disable 服务名 开机 自启/禁自启 该服务

至于哪些是自动连接服务,还请读者自行判断(因为太多了……

1 获取相关信息

  • 首先获取接口名 iw dev
    在interface后的就是你的主机借口名,我这里是wlp4s0
  • 激活内核接口 iw dev set wlp4s0 up
  • 获取接口状态 iw dev show wlp4s0
    3: wlp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group defalt qlen 1000 link/ether b8:86:87:da:68:ba brd ff:ff:ff:ff:ff:ff
  

其中 <BROADCAST,MULTICAST,UP,LOWER_UP>中的 UP显示借口已经打开

  • 查看接入点
    iw dev wlp4s0 scan | less

需要关注的信息:

  • SSID: 网络的名称
  • Signal: 用 dbm (-100 to 0) 报告的无线信号强度。数值越接近零,信号越好。
  • Security: 没有直接报告, 检查 capability 开头的行,如果有 Privacy 信息,例如 capability: ESS Privacy ShortSlotTime (0x0411), 表示网络具有某种程度的保护.

如果有 RSN 信息,网络被 Robust Security Network(WPA2) 协议保护。
如果有 WPA 信息,网络被 Wi-Fi Protected Access 协议保护。
在 RSN 和 WPA 信息块中,可能看到如下信息:
Group cipher: 数值包括 TKIP, CCMP, both, others.
Pairwise ciphers: 数值包括 TKIP, CCMP, both, others. 可能和 Group cipher 数值不同.
Authentication suites: 数值包括 PSK, 802.1x, others. 家用路由器通常可以看到 PSK (i.e. 密码). 在大学中,通常会链接到需要登录名和密码的 802.1x 网络。需要知道其使用的密码管理方式(例如 EAP), 封装方法 (例如 PEAP). 详情请参考 这里 和 这里. 如果没有看到 RSN 或 WPA,但是看到了 Privacy, 表示使用的是 WEP.

(选自archwiki)

2. 关联

假设我要连接的wifi ssid为 myssid

  • 无加密
    iw wlp4s0 connect myssid
  • WEP
    使用十六进制或 ASCII 密码(格式是自动识别出来的,因为 WEP 密码长度是固定的):
    iw dev wlan0 connect your_essid key 0:your_key
    使用十六进制或 ASCII 密码,第三个是默认 (从0计数,共四个):
    iw dev wlan0 connect your_essid key d:2:your_key
  • WPA/WPA2
    wpa_supplicant -B -i wlp4s0 -c <(wpa_passphrase your_SSID your_key)

最后可以通过 iw dev wlp4s0 link确认是否已经连接成功

3. 获取ip

这里我使用dhcp

dhcpcd wlp4s0

其实还可以使用静态ip分配,但是我没用过,这里是archwiki的写法

ip addr add 192.168.0.2/24 dev wlp4s0

ip route add default via 192.168.0.1


现在我以学校校园网为例,简单示范一下,其实只需要三行命令

  • ip link set wlp4s0
  • iw wlp4s0 connect WUST_Wireless
  • dhcpcd wlp4s0

最后再随便开个网页登陆即可

最后,假如这样连接又断了怎么办呢,说实话,我用到现在还没有断过,如果真的断了,那就先kill进程,再同样的方法重新连接就好了。

额外的,我们可以将这些代码写入shell脚本中

echo 'ip link set wlp4s0 up\niw wlp4s0 connect WUST_Wireless\ndhcpcd wlp4s0' > connect.sh && chmod +x connect.sh

然后每次开机之后只需输入命令 sudo ./connect.sh 即可