Linux通过wpa_supplicant命令行连接wifi(Ubuntu server16.04)

通过wpa_supplicant来连接wifi,需要安装wpa_supplicant工具,命令如下:

sudo apt install wpa_supplicant

如果使用桌面版的ubuntu,需要通过以下命令停掉网络管理器,否则在使用wpa_supplicant时会导致连接问题。

sudo systemctl stop NetworkManager

您还需要通过执行以下命令来禁用 NeworkManager 在引导时启动。

sudo systemctl disable NetworkManager

通过iwconfig命令查找无线接口名称:(使用该命令前需要apt-get install wireless-tools安装无线网工具),如下图:

从上图可以看出接口名称wlx00120ee4ef6b,并且该网卡接口已经接入到热点。如果Access point显示如下图,说明没有与任何接入点关联。

如果未显示接口,可以通过ifconfig -a命令查看所有接口(包括没有启动的接口),通过ifconfig查看已开启的接口,如果发现网卡没有启动,通过ifconfig <interface> up启动该接口,例如

sudo ifconfig wlx00120ee4ef6b up

然后使用以下命令扫描附近的网络,找到您的无线网络名称。将wlx00120ee4ef6b替换为您自己的接口名称。ESSID 表示网络名称。

sudo iwlist wlx00120ee4ef6b scan | grep ESSID

或者

sudo iwlist wlx00120ee4ef6b scan | grep -i essid(grep -i忽略大小写)

如下图:

接着创建配置文件命令如下:

wpa_passphrase your-ESSID your-passphrase | sudo tee /etc/wpa_supplicant.conf

your-ESSID your-passphrase分别替换成密码和账号,对于有空格的情况,请使用双引号概括。通过管道,利用tee将标准输出出入到配置文件。


Linux tee命令用于读取标准输入的数据,并将其内容输出成文件。

tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。

tee [-ai][–help][–version][文件…]

参数

  • -a或–append  附加到既有文件的后面,而非覆盖它.
  • -i或–ignore-interrupts  忽略中断信号。
  • –help  在线帮助。
  • –version  显示版本信息。

例如tee txt 将会将输入写入到txt,如果不存在则创建


配置好配置文件后,利用下面命令连接:

sudo wpa_supplicant -c /etc/wpa_supplicant.conf -i wlx00120ee4ef6b

由于默认情况wpa_supplicant是在前台运行的,可以通过CTRL+C来终止该命令,当然为了方便我们把他改为后台运行,命令如下:

sudo wpa_supplicant -B -c /etc/wpa_supplicant.conf -i wlx00120ee4ef6b

再次使用iwconfig命令查看可以看到Access point后出现接入点名称,连接成功,但是通过ifconfig查看并没有获取到ip地址,利用以下命令来获取ip地址:

sudo dhclient wlx00120ee4ef6b

如果不使用了,可以通过sudo dhclient wlx00120ee4ef6b -r来释放ip,但此时仍处于连接状态。

连接隐藏的无线网络时,只需要在配置文件中加入,scan_ssid=1;如下图:(下图为连接不带密码的隐藏的wifi,若是连接WPA2加密方式wifi,则将key_mgmt=NONE替换成psk=”密码”)。

设置启动时连接:(关于下面步骤的操作,可以看本站ubuntu中systemctl和service了解)

sudo cp /lib/systemd/system/wpa_supplicant.service /etc/systemd/system/wpa_supplicant.service

sudo vim /etc/systemd/system/wpa_supplicant.service

改成下图:(注意接口名称改成自己的网卡名称)

原来的设置如下:

然后保存设置开机自启:

sudo systemctl enable wpa_supplicant.service

然后还需要在启动时,从DHCP服务器来获取ip地址,可以通过创建服务单元来实现dhclient wlx00120ee4ef6b操作。

sudo vim /etc/systemd/system/dhclient.service

将下面文本放入:

[Unit]

Description= DHCP Client

Before=network.target(或者Before=wpa_supplicant.service)

[Service]

Type=forking

ExecStart=/sbin/dhclient wlp3s0 -v

ExecStop=/sbin/dhclient wlp3s0 -r

Restart=always

[Install]

WantedBy=multi-user.target

保存该文件,然后设置开机自启:

Sudo systemctl enable dhclient.service

到此,设置结束,下面为设置静态ip地址,只做了解,不建议使用。

设置获取静态ip地址。

编辑dhclient的配置文件:

sudo vim /etc/dhcp/dhclient.service

在文中添加如下:

Interface “wlx00120ee4ef6b”{

Send dhcp-requested-address 10.151.34.43

}

注意设置静态ip时,根据自己的ip段来设置,否则会导致无法联网。

保存文件,重启dhclient服务。

sudo systemctl restart dhclient

并不建议通过上面的设置来获取静态IP地址,因为在某些情况下可能会导致ip冲突,最好能通过路由层面绑定MAC地址和ip地址。

参考Using WPA_Supplicant to Connect to WPA2 Wi-fi from Terminal on Ubuntu 16.04 Server

ubuntu中systemctl和service

service 命令

service命令是Redhat Linux兼容的发行版中用来控制系统服务的实用工具,它以启动、停止、重新启动和关闭系统服务,还可以显示所有系统服务的当前状态。

语法: service < option > | –status-all | [ service_name [ command | –full-restart ] ]

option的值如下:

-h:显示 service 的帮助信息

-status:显示所服务的状态

– -status-all:查看所有服务的状态

service_name:服务名,即 /etc/init.d 目录下的脚本文件名

command:系统服务脚本支持的控制命令,如:start、stop 和 restart

– -full-restart:重启所有服务

[+] 代表服务是在启动运行的状态

[-] 代表服务是在关闭停止的状态systemctl 命令

[?] 这个状态标识服务在初始化或者启动时没有输出有效的状态

systemctl详细理解

查看服务配置:

cat /lib/systemd/system/ssh.service

如果有特定的描述,比如:

Restart=always

RestartSec=2

那么当前这个服务就有始终处于start状态的特性

启动服务:systemctl start vsftpd.service

关闭服务:systemctl stop vsftpd.service

重启服务:systemctl restart vsftpd.service

显示服务的状态:systemctl status vsftpd.service

在开机时启用服务:systemctl enable vsftpd.service

在开机时禁用服务:systemctl disable vsftpd.service

使用systemctl命令来杀死服务:systemctl kill service

查看服务是否开机启动:systemctl is-enabled vsftpd.service

查看服务是否激活:systemctl is-active vsftpd.service

查看已启动的服务列表:systemctl list-unit-files|grep enabled或者systemctl list-units

查看启动失败的服务列表:systemctl –failed

重启系统: systemctl reboot

关闭系统,切断电源:systemctl poweroff

CPU停止工作:systemctl halt

暂停系统: systemctl suspend

让系统进入冬眠状态: systemctl hibernate

让系统进入交互式休眠状态: systemctl hybrid-sleep

启动进入救援状态(单用户状态): systemctl rescue

service和systemctl区别:

历史上,Linux 的启动一直采用init进程。下面的命令用来启动服务。

sudo /etc/init.d/apache2 start

或者

service apache2 start

这种方法有两个缺点:

一、是启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。

二、是启动脚本复杂。init 进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。

systemd 就是为了解决上面问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案。根据 Linux 惯例,字母 d 是守护进程(daemon)的缩写。 systemd 这个名字的含义,就是它要守护整个系统。使用了 systemd,就不需要再用 init 了。systemd 取代了 initd,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。systemctl基本上是的更强大的版本service。随着service你只能做相关的服务命令(即status,reload,restart),而与systemctl可以使用更高级的命令,如:

systemctl is-failed name.service # check if service failed to load

或掩蔽服务:

systemctl mask name.service

检查systemd和systemctl的二进制文件和库的安装位置。

whereis systemd (which用来查找命令位置)

systemd: /usr/lib/systemd /etc/systemd /usr/share/systemd /usr/share/man/man1/systemd.1.gz

whereis systemctl

systemctl: /usr/bin/systemctl /usr/share/man/man1/systemctl.1.gz

/lib/systemd/system/与/etc/systemd/system/的区别

1、区别:

/usr/lib/systemd/system/ 软件包安装的单元

/etc/systemd/system/ 系统管理员安装的单元, 优先级更高

2、优先级:
systemd的使用大幅提高了系统服务的运行效率, 而unit的文件位置一般主要有三个目录:

/etc/systemd/system

/run/systemd/system

/lib/systemd/system

这三个目录的配置文件优先级依次从高到低,如果同一选项三个地方都配置了,优先级高的会覆盖优先级低的。

系统安装时,默认会将unit文件放在/lib/systemd/system目录。如果我们想要修改系统默认的配置,比如nginx.service,一般有两种方法:

1)在/etc/systemd/system目录下创建nginx.service文件,里面写上我们自己的配置。

2)在/etc/systemd/system下面创建nginx.service.d目录,在这个目录里面新建任何以.conf结尾的文件,然后写入我们自己的配置。推荐这种做法。
/run/systemd/system这个目录一般是进程在运行时动态创建unit文件的目录,一般很少修改,除非是修改程序运行时的一些参数时,即session级别的,才在这里做修改。

更多相关systemctl详细理解及常用命令

Linux 自启动服务配置

系统服务配置服务参数(Service)-详细版

ubuntu server apt 显示E: Could not get lock /var/lib/dpkg/lock ……

使用 apt-get 命令的时候,遇到如下错误:

E: Could not get lock /var/lib/dpkg/lock – open (11: Resource temporarily unavailable)

E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?

1、找出并杀掉所有的apt或apt-get进程

ps -aux|grep apt

2、删除锁定的文件
锁定的文件会阻止 Linux 系统中某些文件或者数据的访问,这个概念也存在于windows或者其他的操作系统中。一旦你运行了apt-get或者apt命令,锁定文件将会创建于

/var/lib/apt/lists/、/var/lib/dpkg/、/var /cache/apt/archieves/

中。这有助于运行中的apt或者apt-get进程能够避免被其他需要使用相同文件的用户或者系统进程所打断。当该进程执行完毕后,锁定文件将会被删除。

提醒:万一你在没有看到 apt-get 或者 apt 进程的情况下在上面两个不同的文件夹中看到了锁定文件,这是因为进程由于某个原因被杀掉了,因此你需要删除锁定文件来避免该错误。首先运行下面的命令来移除 /var/lib/dpkg/ 文件夹下的锁定文件:

sudo rm /var/lib/dpkg/lock

之后强制重新配置软件包:

sudo dpkg --configure -a

如下问题:

E: 无法获得锁 /var/lib/apt/lists/lock – open (11: 资源暂时不可用)

E: 无法对目录 /var/lib/apt/lists/ 加锁

根据上面提示处理方法如下(上一次未更新完导致)

sudo rm /var/lib/apt/lists/lock

ubuntu无法安装或移除软件显示:No priority (or zero) specified for pin

当我尝试在ubuntu server 16.04安装或卸载软件包时,一直显示如下:

Reading package lists…..Done

E: No priority (or zero) specified for pin

这是因为/etc/apt/preferences.d/中有一个ubuntu-esm-infra-trusty的文件,通过vim打开后如下:

#Written by ubuntu-advantage-tools

Package:*

Pin: release o=UbuntuESM, n=xenial

Pin-priority: never

包含了一个没有优先级Pin,我们可以将never改成任意一个数字,然后保存就发现可以正常安装移除包了,同时,因为此文件适用于 Ubuntu 14.04 Trusty ESM,但由于我运行的是 Ubuntu 16.04 LTS,因此不需要此文件,所以也可以通过删除该文件来解决问题。

注:如果没有在/etc/apt/preferences.d/中发现ubuntu-esm-infra-trusty文件,可以运行一下apt-get policy 然后所有的pins将被列举出来,接着就可以查看/etc/apt/preferences.d文件夹下是否有ubuntu-esm-infra-trusty文件。

无法apt安装包显示E: Sub-process /usr/bin/dpkg returned an error code 

描述:

今天在用ubuntu server 16.04安装包时出现

dpkg: error processing package libapache2-mod-svn

…………….

……………..

……………..

E: Sub-process /usr/bin/dpkg returned an error code

解决办法:

现将info文件夹更名。

阅读更多

linux中的挂载

挂载:
Liunx采用树形的文件管理系统,也就是在Linux系统中,可以说已经没有分区的概念了。分区在Linux和其他设备一样都只是一个文件。要使用一个分区必须把它加载到文件系统中。
Linux中树形的文件结构,最顶层是/目录。在安装系统时,你必须选择把一个主分区挂载在/目录下,因为系统需要安装在/挂载的主分区下。否则系统会提示你。这里又一次提到了挂载。所以挂载就是把目录和分区连接起来,和上面说的WINDOWS下的映射关系是一样的。不同的是WINDOWS是把分区映射到一个盘符,而LINUX下是映射到一个目录。 这是理解他们不同最重要的地方,而导致不同的是因为文件系统结构不同。
上面说了Linux的文件系统是树形的,安装的系统必须是在/目录下,因为/目录下挂载了一个主分区。/目录是树形的根,其他所有目录都是他的子节点。我们安装系统的时候已经把分区1挂载到 /目录下了,而这个时候没有挂载其他任何分区,所以/ 目录下的所有其他目录都在这个分区下,也就是说,我在任何目录下读写操作实际都是操作的这个1号分区。如果我们想使用其他分区,就必须把这个分区挂载到一个目录下,这个目录可以是已经存在的目录,比如/home,也可以是我们自己建立的目录,比如/oracle。当然有些目录比如/lib, /dev, /etc, /usr这些都不能挂载其他分区,因为他们都存放着系统需要的文件,一旦被挂载其他分区,那没OS就无法找到所需的文件,系统就会崩溃。比如我们把分区2挂载到/usr/X11目录下时,系统就无法通过X11目录找到分区1上的文件,这个时候系统图形界面就无法使用了,虽然文件还在硬盘上。前面说过,目录 — 分区是通过挂载把他们联系起来。你更换了分区,也就破坏了联系,就无法在找到之前的文件了。我们在看分区5和分区6,我们把它挂载到/home/ftp 和 /oracle目录下,这个时候我们在操作这两个目录就是操作对应的分区了。
而WINDOWS就没这么复杂,她不是采用树形的结构,每个分区对应一个盘符,一旦建立映射关系就无法在修改。实际上,LINUX的每个挂载了分区的目录就相当于WINDOWS系统中的盘符,比如上面的,/home/ftp 和 /oracle目录我们就可以把她看做一个盘符和一个分区关联,只是因为LINUX文件系统,使得她更加灵活,所以也更复杂和难以理解。
df 命令可以查看分区挂载情况, fdisk 命令可以查看系统分区情况。
LINUX下所有设备都被认为是文件,而/dev目录存放所有系统设备文件的,而一个分区就是一个文件,名字就是分区的名字。

阅读更多