
前言Linux是一个可以自由发布的类UNIX内核实现它是一个操作系统的底层核心目前市面上存在着许多不同的Linux版本比如我们在学习网络安全过程中会用到的Kali Linux但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中比如手机、平板电脑、 路由器 、台式计算机。Linux起源Linux 创始人——林纳斯 · 托瓦兹Linux 诞生于1991年作者上大学期间实现的Linux的特点开源、免费、拥有最为庞大的源码贡献者Linux的吉祥物是企鹅因为林纳斯小时候被企鹅咬过印象深刻一、Linux简介与程序开发环境1.1 什么是LinuxLinux是由芬兰赫尔辛基大学的Linus开发期间得到了网上广大UNIX程序员的帮助。它最初是受其教授的Minix一个小型的类UNIX系统启发而开发的程序纯属个人的爱好但是后来它自身逐步发展成为一个完整的系统。要理解什么是Linux首先要了解在Linux之前诞生的系统和应用程序——UNIX和GNU软件。1.1.1 什么是UNIXUNIX操作系统最初是由贝尔实验室开发的当时的贝尔实验室是电信巨头ATT美国电报电话公司旗下的一员。如今它已经成为一种非常流行的多用户、多任务操作系统。UNIX操作系统可以运行在大量不同种类的硬件平台上其适用范围从PC机到多处理器服务器和超级计算机。在UNIX上进行程序开发有些典型的风格和特点1简单性许多很有用的UNIX工具是非常简单的。“小而简单”是一种值得学习的技术。越大、越复杂的系统注定会包含越大、越复杂的错误。2集中性让一个程序很好地执行一项任务好过把所有功能都堆在一起。功能臃肿的程序难于使用和维护单一目标的程序更容易随着更好的算法被开发出来而得到改进。在UNIX中当用户出现新的需求时我们通常是把小工具组合起来完成更复杂的任务而不是试图将一个用户期望的所有功能放在一个大程序里。3可重用的组件将应用程序的核心实现为库。具有简单而灵活的编程接口的库可以帮助其他人开发出同类程序或者把这些技术应用到新的应用领域。1.1.2 GNU项目和自由软件基金会有了操作系统内核还不够Linux能够发展到今天是无数人共同努力的结果。操作系统内核本身仅仅是可用开发系统的一小部分。一般的UNIX系统还包括提供系统服务和工具的应用程序对于Linux系统这些程序是由许多程序员编写并自由发布的。Linux社区支持自由软件的概念即软件本身不应受限它们遵守GNUGNU是GNU’s Not UNIX的递归缩写通用公共许可证GPL。自由软件基金会Free Software Foundation是由Richard Stallman创立其宗旨是试图创建一个与UNIX系统兼容但并不受UNIX名字和源代码私有权限制的操作系统和开发环境。GNU项目已经为软件社区提供了许多UNIX系统上应用程序的仿制品。例如大名鼎鼎的GCCGNU编译器集它包括GNU C编译器。GG编译器是GCC的一部分。GDB源代码级的调试器。GNU makebash命令解释器shell的一种有了这些可用的自由软件再加上Linux内核我们可以说创建一个GNU的、自由的类UNIX系统的目标已经通过Linux系统实现了。由于GNU软件做出的贡献现在许多人通常把Linux系统称为GNU/Linux。1.2 程序开发环境工欲善其事必先利其器想要进行Linux程序开发需要先搭建开发环境。1.2.1 Linux环境安装进行 Linux 开发需要安装一个 linux 系统环境一般使用 VMWare 安装 Ubuntu 系统进行开发。具体安装过程大家可以参考以下帖子 https://zhuanlan.zhihu.com/p/38797088 这里我就不做过多介绍。1.2.2 SSHSecure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。传统的网络服务程序如 FTP、 Pop 和 Telnet 其本质上都是不安全的因为它们在网络上用明文传送数据、用户帐号和用户口令很容易受到中间人攻击方式的攻击。SSH 分为客户端 openssh-client 和服务器 openssh-server我们需要在 ubuntu 系统下安装 ssh 服务器以便使用 ssh 客户端登录到系统。1安装sshsudo apt updatesudo apt install openssh-server2启动sshsudo service ssh start3使用ip addr show命令查看 ubuntu 系统 ip可以看出当前 ubuntu IP 地址为 192.168.176.1484测试 ssh 登录在 Ubuntu 上安装完成 ssh 服务器后接下来在 Windows 系统下使用 MobaXterm 进行连接测试 ssh 服务器是否安装成功。 操作步骤如下 运行 Xterm 软件选择“Session”如下图所示:点击“SSH”并进行设置如下图所示:在该对话框中选择“协议”为“SSH” “主机名”为 ubuntu 的 IP 地址用户名为当前用户名。端口号使用默认值 22。 设置完成后点击OK出现如下命令行终端表示已经连接上虚拟机的ubuntu系统。通过这种方法确定主机和开发板之间网络通讯正常后即可以登录到开发板上。5安装 Visual Studio CodeVisual Studio Code简称 VSCode是微软出的一款免费的编辑器有 Windows、 Linux 和 macOS 三个版本是一款跨平台编辑器。 安装过程大家可以自行搜索这里主要介绍用于C/C程序开发的扩展包安装步骤见下图常用的有如下插件需要安装: C/C。 C/C Snippets即 C/C重用代码块。 C/C Advanced Lint,即 C/C静态检测 。 Code Runner即代码运行。 Include AutoComplete即自动头文件包含。 Rainbow Brackets彩虹花括号有助于阅读代码。 One Dark Pro VSCode 的主题。 GBKtoUTF8将 GBK 转换为 UTF8。 ARM即支持 ARM 汇编语法高亮显示。 Chinese(Simplified)即中文环境。 vscode-icons VSCode 图标插件主要是资源管理器下各个文件夹的图标。 compareit比较插件可以用于比较两个文件的差异 DeviceTree设备树语法插件。 Markdown Preview Enhanced markdown 预览插件。 Maridown pdf将.md 文件转换成其他格式。二、Linux常用命令Linux的命令有几百个对于初学者来说常用的并不多并不需要全部掌握。在平时的学习和工作过程中遇到了陌生的Linux命令多查资料日积月累自然就记住了。下面为大家介绍Linux最基础的17个命令。1、清屏clear2、查看服务器ip地址ip addr3、查看时间date4、目录和文件文件系统像一棵树树干是/根目录树枝是子目录树枝后面还有树枝子目录中还有子目录目录的最后是文件。目录和文件的路径分为绝对路径和相对路径绝对路径是从根/算起例如/usr/etc/readme.txt。相对路径是从当前工作目录算起如果当前工作目录是/usretc/readme.txt等同于/usr/etc/readme.txt。此外需要注意的是一个圆点.表示当前工作目录两个圆点…表示当前工作目录的上一级目录。 下面为大家简单介绍Linux系统目录结构为了避免诸多使用者对 Linux 系统目录结构天马行空Linux 基金会发布了 FHS 标准。多数 Linux 发行版系统都遵循这一标准。注FHSFilesystem Hierarchy Standard文件系统层次化标准该标准规定了 Linux 系统中所有一级目录以及部分二级目录/usr 和 /var的用途。发布此标准的主要目的就是为了让用户清楚地了解每个目录应该存放什么类型的文件。1Linux 根目录/FHS 认为Linux 系统的根目录/最为重要其原因有以下 2 点 1. 所有目录都是由根目录衍生出来的 2. 根目录与系统的开机、修复、还原密切相关 因此根目录必须包含开机软件、核心文件、开机所需程序、函数库、修复系统程序等文件如下表所示。2Linux /usr目录usr注意不是 user全称为 Unix Software Resource此目录用于存储系统软件资源。FHS 建议开发者应把软件产品的数据合理的放置在 /usr 目录下的各子目录中而不是为他们的产品创建单独的目录。 Linux 系统中所有系统默认的软件都存储在 /usr 目录下/usr 目录类似 Windows 系统中 C:\Windows\ C:\Program files\ 两个目录的综合体。 FHS 建议/usr 目录应具备下表所示的子目录。3Linux /var 目录/var 目录用于存储动态数据例如缓存、日志文件、软件运行过程中产生的文件等。通常此目录下建议包含如表 4 所示的这些子目录。5、查看当前目录pwd6、改变当前工作目录cd 目录名示例1进入/tmp目录cd /tmp2进入上一级目录cd ..3进入用户的主目录cd7、列出目录和文件信息ls是list的缩写通过ls命令不仅可以查看目录和文件信息还可以查看目录和文件的权限、大小、主人和组等信息。 选项-l列出目录和文件的详细信息。 示例1列出当前工作目录下全部的目录和 文件名 信息ls2列出当前工作目录下全部的目录和文件名详细的信息ls -l3正则表达式正则表达式又称规则表达式、通配符目录和文件名都支持正则表达式正则表达式的规则比较多在这里我们只需要掌握最常用的两种星号 “*” 。星号 “*” 匹配任意数量的字符。例如ls open*.zip8、创建目录1在当前工作目录下创建aaa目录mkdir aaa2在当前工作目录下创建aaa目录并在aaa目录下创建bbb目录mkdir aaa/bbb -p9、删除目录和文件rm [-rf]目录或文件选项-r可以删除目录如果没有-r只能删除文件。选项-f表示强制删除不需要确认。1删除aaa目录rm aaa -r2强制删除当前工作目录下的ccc.c文件rm -f ccc.c10、移动目录和文件mv 旧目录或文件名 新目录或文件名1把当前工作目录中的 book.c 文件重命名为 book1.cmv book.c book1.c2如果OPC/test3是一个已经存在的目录以下命令将把当前工作目录下的 book.c 文件移动到 OPC/test3 目录中。mv book.c OPC/test33如果 OPC/test3目录不存在以下命令将把当前工作目录下的 book.c 文件改名为 OPC/test3。mv book.c OPC/test311、复制目录和文件cp [-r] 旧目录或文件名 新目录或文件名注-r 是递归的意思英文 recursion选项-r可以复制目录如果没有选项-r只能复制文件。示例1把当前工作目录下的book1.c文件复制为book2.ccp book1.c book2.c2把当前工作目录下的aaa目录复制为bbbcp aaa bbb -r3把当前工作目录下的book1.c文件复制为aaa/book1.ccp book1.c aaa/book1.ccp book1.c aaa/.以上两个命令的效果相同。4把当前工作目录下的aaa目录复制为/tmp/aaacp -r aaa /tmp/aaacp -r aaa /tmp/.以上两个命令的效果相同。12、判断网络是否连通ping -c 包的个数 ip地址或域名ping用于确定本地主机是否能与另一台主机成功交换数据包判断网络是否通畅。1向本地主机127.0.0.1ping五个包ping -c 5 127.0.0.12向百度 www.baidu.com.cn 的服务器ping五个包ping -c 5 www.baidu.com.cn可以看出百度的服务器是可以ping通的。3向谷歌 www.google.com 的服务器ping五个包。ping -c 5 www.google.com可以看出谷歌的服务器是ping不通的。13、显示文本文件的内容显示文本文件的内容有三个命令cat、more和tail。1cat 命令cat 文件名cat命令一次显示整个文件的内容。cat main.cpp2more 命令more 文件名为了方便阅读more命令分页显示文件的内容按空格键显示下一页按b键显上一页按q键退出。3tail 命令tail -f 文件名tail -f用于显示文本文件的最后几行如果文件的内容有增加就实时的刷新。对程序员来说tail -f极其重要可以动态显示后台服务程序的日志用于调试和跟踪程序的运行。13、统计文本文件的行数、单词数和字节数wc(word count)功能为统计指定的文件中字节数、字数、行数并将统计结果输出wc 文件名14、搜索文件中的内容grep 内容 文件名注意如果内容中没有空格等特殊字符可以不用双引号括起来。示例1在main.cpp文件中搜索signalgrep signal main.cpp15、搜索文件1findfind 目录名 -name 文件名参数说明 目录名待搜索的目录搜索文件的时候除了这个目录名还包括它的各级子目录。 文件名待搜索的文件名匹配的规则。 示例 从 OPC 目录开始搜索把全部的 *.cpp 文件显示出来。find OPC -name *.cpp2locatelocate 文件名示例 搜索open62541.c文件locate open62541.c注意:第一次使用该命令,可能需要更新数据库,按照提示的命令执行一下就好了.find多用于在某个目录下进行模糊搜索而locate则是进行全盘准确定位。16、chmod命令用于改变linux文件或目录的访问权限。该命令有两种用法。一种是包含字母和操作符表达式的文字设定法另一种是包含数字的数字设定法。每一文件或目录的访问权限都有三组每组用三位表示分别为文件属主的读、写和执行权限与属主同组的用户的读、写和执行权限系统中其他用户的读、写和执行权限。举例ls -l example第一列共有10个位置第一个字符指定了文件类型。在通常意义上一个目录也是一个文件。如果第一个字符是横线表示是一个非目录的文件。如果是d表示是一个目录。从第二个字符开始到第十个共9个字符3个字符一组分别表示了3组用户对文件或者目录的权限。权限字符用横线代表空许可r代表只读w代表写x代表可执行。常用参数 -c 当发生改变时报告处理信息 -R 处理指定目录以及其子目录下所有文件 权限范围 u 目录或者文件的当前的用户 g 目录或者文件的当前的群组 o 除了目录或者文件的当前用户或群组之外的用户或者群组 a 所有的用户及群组 权限代号 r 读权限用数字4表示 w 写权限用数字2表示 x 执行权限用数字1表示 - 删除权限用数字0表示 s 特殊权限示例1删除文件 example 所有用户可执行权限chmod a-x example2给 example 的属主分配读、写、执行(7)的权限给 example 的所在组分配读、执行(5)的权限给其他用户分配执行(1)的权限chmod 751 example -c3将aaa目录及其子目录所有文件添加可读权限chmod ur,gr,or -R text/ -c17、查看系统磁盘空间df [-h] [-T]选项-h以方便阅读的方式显示信息df -h选项-T列出文件系统类型df -h -T18、额外补充的Linux命令操作文件或目录常用命令pwd 显示当前工作目录print working directory touch 创建空文件 mkdir 创建目录make directoriy -p 父目录不存在情况下先生成父目录 parents cp 复制文件或目录copy -r 递归处理将指定目录下的文件与子目录一并拷贝recursive mv 移动文件或目录、文件或目录改名move rm 删除文件remove -r 同时删除该目录下的所有文件recursive -f 强制删除文件或目录force rmdir 删除空目录remove directoriy cat显示文本文件内容 catenate more、less 分页显示文本文件内容 head、tail查看文本中开头或结尾部分的内容 head -n 5 a.log 查看a.log文件的前5行 tail -F b.log 循环读取follow常用命令wc 统计文本的行数、字数、字符数word count -m 统计文本字符数 -w 统计文本字数 -l 统计文本行数 find 在文件系统中查找指定的文件 find /etc/ -name aaa grep 在指定的文本文件中查找指定的字符串 ln 建立链接文件link -s 对源文件建立符号连接而非硬连接symbolic top 显示当前系统中耗费资源最多的进程 ps 显示瞬间的进程状态 -e /-A 显示所有进程环境变量 -f 全格式 -a 显示所有用户的所有进程包括其它用户 -u 按用户名和启动时间的顺序来显示进程 -x 显示无控制终端的进程 kill 杀死一个进程 kill -9 pid df 显示文件系统磁盘空间的使用情况 du 显示指定的文件目录已使用的磁盘空间的总 -h文件大小以KMG为单位显示human-readable -s只显示各档案大小的总合summarize free 显示当前内存和交换空间的使用情况 netstat 显示网络状态信息 -a 显示所有连接和监听端口 -t (tcp)仅显示tcp相关选项 -u (udp)仅显示udp相关选项 -n 拒绝显示别名能显示数字的全部转化成数字。 -p 显示建立相关链接的程序名 ifconfig 网卡网络配置详解 ping 测试网络的连通性备份压缩命令gzip 压缩解压文件或目录压缩文件后缀为gz bzip2 压缩解压文件或目录压缩文件后缀为bz2 tar 文件、目录打解包gzip命令命令格式gzip [选项] 压缩解压缩的文件名 -d将压缩文件解压decompress -l显示压缩文件的大小未压缩文件的大小压缩比list -v显示文件名和压缩比verbose -num用指定的数字num调整压缩的速度-1或--fast表示最快压缩方法低压缩比-9或--best表示最慢压缩方法高压缩比。系统缺省值为6bzip2命令命令格式bzip2 [-cdz] 文档名 -c将压缩的过程产生的数据输出到屏幕上 -d解压缩的参数decompress -z压缩的参数compress -num 用指定的数字num调整压缩的速度-1或--fast表示最快压缩方法低压缩比-9或--best表示最慢压缩方法高压缩比。系统缺省值为6tar命令-c 建立一个压缩文件的参数指令create -x 解开一个压缩文件的参数指令extract -z 是否需要用 gzip 压缩 -j 是否需要用 bzip2 压缩 -v 压缩的过程中显示文件verbose -f 使用档名在 f 之后要立即接档名file三、Linux环境变量讲解3.1 环境变量的概念3.1.1 什么是环境变量程序操作系统命令和应用程序的执行都需要运行环境这个环境是由多个环境变量组成的。3.1.2 环境变量的分类1按生效的范围分类。系统环境变量公共的对全部的用户都生效。用户环境变量用户私有的、自定义的个性化设置只对该用户生效。2按生存周期分类。永久环境变量在环境变量脚本文件中配置用户每次登录时会自动执行这些脚本相当于永久生效。临时环境变量使用时在Shell中临时定义退出Shell后失效。3Linux环境变量Linux环境变量也称之为Shell环境量变以下划线和字母打头由下划线、字母区分大小写和数字组成习惯上使用大写字母例如PATH、HOSTNAME、LANG等。3.2 常用的环境变量3.2.1 查看环境变量1env命令在Shell下用env命令查看当前用户全部的环境变量。上图只截取了部分环境变量并非全部。注用env命令的时候满屏显示了很多环境变量不方便查看可以用grep筛选。env|grep 环境变量名例如查看环境变量名中包含PATH的环境变量。env|grep PATH2echo命令echo $环境变量名例如echo $LANG注意符号$不能缺少Linux系统就像人类社会给钱就给你看信息哈哈。3.2.2 常用的环境变量1PATH可执行程序的搜索目录可执行程序包括Linux系统命令和用户的应用程序PATH变量的具体用法本文后面的章节中有详细的介绍。2LANGLinux系统的语言、地区、字符集。echo $LANG3HOSTNAME服务器的主机名。echo $HOSTNAME4SHELL用户当前使用的Shell解析器。echo $SHELL5HISTSIZE保存历史命令的数目。6USER当前登录用户的用户名。echo $USER7HOME当前登录用户的主目录。echo $HOME8PWD当前工作目录。echo $PWD9LD_LIBRARY_PATHC/C语言动态链接库文件搜索的目录它不是Linux缺省的环境变量但对C/C程序员来说非常重要具体用法本文后面的章节中有详细的介绍。3.3 设置环境量export 变量名值如果环境变量的值没有空格等特殊符号可以不用单引号包含。示例export PATH$PATH:.以上命令为当前shell的环境变量PATH添加.目录是.export LD_LIBRARY_PATH$LD_LIBRARY_PATH:.以上命令为当前shell的环境变量LD_LIBRARY_PATH添加.目录采用export设置的环境变量在退出Shell后就会失效下次登录时需要重新设置。如果希望环境变量永久生效需要在登录脚本文件中配置。3.3.1 系统环境变量系统环境变量对全部的用户生效设置系统环境变量有三种方法。1在/etc/profile文件中设置。用户登录时执行/etc/profile文件中设置系统的环境变量。但是Linux不建议在/etc/profile文件中设置系统环境变量。2在/etc/profile.d目录中增加环境变量脚本文件这是Linux推荐的方法。/etc/profile在每次启动时会执行 /etc/profile.d下全部的脚本文件。/etc/profile.d比/etc/profile好维护不想要什么变量直接删除 /etc/profile.d下对应的 shell 脚本即可。/etc/profile.d目录下有很多脚本文件例如ls /etc/profile.d3在/etc/bashrc文件中设置环境变量。该文件配置的环境变量将会影响全部用户使用的bash shell。但是Linux也不建议在/etc/bashrc文件中设置系统环境变量。3.3.2 用户环境变量用户环境变量只对当前用户生效设置用户环境变量也有多种方法。在用户的主目录有几个特别的文件用ls是看不见的用ls .bash*可以看见。1.bash_profile推荐首选当用户登录时执行每个用户都可以使用该文件来配置专属于自己的环境变量。2.bashrc当用户登录时以及每次打开新的Shell时该文件都将被读取不推荐在里面配置用户专用的环境变量因为每开一个Shell该文件都会被读取一次效率肯定受影响。3.bash_logout当每次退出系统退出bash shell时执行该文件。4.bash_history保存了当前用户使用过的历史命令。3.3.3 环境变量脚本文件的执行顺序环境变量脚本文件的执行顺序如下/etc/profile-/etc/profile.d-/etc/bashrc-用户的.bash_profile-用户的.bashrc同名的环境变量如果在多个脚本中有配置以最后执行的脚本中的配置为准。3.4 重要环境变量的详解1、PATH环境变量可执行程序的搜索目录可执行程序包括Linux系统命令和用户的应用程序。如果可执行程序的目录不在PATH指定的目录中执行时需要指定目录。1PATH环境变量存放的是目录列表目录之间用冒号:分隔最后的圆点.表示当前目录。export PATH目录1:目录2:目录3:…目录n:.2PATH缺省包含了Linux系统命令所在的目录/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin如果不包含这些目录Linux的常用命令也无法执行要输入绝对路径才能执行。示例ls /bin/ls可以查看到ls命令位于/bin目录下此时我们执行命令export PATH将PATH变量清空再执行ls命令系统会提示找不到ls命令。采用绝对路径就可以使用/bin/ls为环境变量PATH添加/bin目录后ls也可以执行了。3如果PATH变量中没有包含圆点.执行当前目录下的程序需要加./或使用绝对路径。示例 在当前目录下执行 example 命令提示无法执行。将圆点.添加到环境变量PATH之后便可以执行了。export PATH$PATH:.2、LD_LIBRARY_PATH环境变量C/C语言动态链接库文件搜索的目录它不是Linux缺省的环境变量但对C/C程序员来说非常重要。LD_LIBRARY_PATH环境变量存放的也是目录列表目录之间用冒号:分隔最后的圆点.表示当前目录与PATH的格式相同。export LD_LIBRARY_PATH目录1:目录2:目录3:......目录n:.这个环境变量我们会在下次课讲解Linux静态库与动态库时详细介绍。3.5 环境变量的生效1在Shell下用export设置的环境变量对当前Shell立即生效Shell退出后失效。2在脚本文件中设置的环境变量不会立即生效退出Shell后重新登录时才生效或者用source命令让它立即生效例如source /etc/profile3.6 应用经验虽然设置环境变量的方法有多种但是建议大家系统环境变量在/etc/profile.d目录中配置用户环境变量在用户的.bash_profile中配置不建议在其它脚本文件中配置环境变量会增加系统运维的麻烦容易出错。四、课后作业1搭建Linux程序开发环境安装vmware虚拟机安装ubuntu操作系统在ubuntu上安装VSCode。2配置环境变量PATH使得每次登陆后执行用户程序都无须输入./3在第二题的基础上将/bin目录下的ls复制到用户家目录下清空环境变量PATH执行ls。换个目录执行ls看看能否运行。