linux操作系统入门

文章目录

    • 1.快捷键
    • 2.Linux系统目录结构
    • 3.命令
    • 4.文件权限
      • 4.1更改文件权限:
      • 4.2更改所属组:
    • 5.查找与检索
      • 5.1按文件属性查找
      • 5.2根据所有者和所属组查找
      • 5.3在文件中搜寻字符串匹配的行并输出:grep
    • 6.安装
    • 7.压缩包管理
    • 8.进程管理
    • 9.网络相关命令
    • 10.用户管理
    • 11.ftp服务器搭建---vsftpd
    • 12.nfs网络共享服务器
    • 13.ssh服务器
    • 14.scp命令(super copy)
    • 15.vim
    • 16.gcc编译过程
    • 17.静态库的制作
    • 18.动态库的制作(共享库)
    • 19.gdb调试
    • 20.makefile(代码管理)

B站链接

1.快捷键

命令解析器:

shell----->unix操作系统

bash----->linux操作系统

本质:根据命令名字,调用对应的可执行程序

Linux快捷键:

ctrl+p 上一条命令

ctrl+n 下一条命令

ctrl+b 光标回退

ctrl+f 光标前进

ctrl+a 光标置头

ctrl+e 光标置尾

ctrl+d 删除光标覆盖的字符

ctrl+h 删除光标前面的字符

tab 填充命令

2.Linux系统目录结构

  • 根目录(/)

  • /bin (binary) 常用命令可执行程序,相当于windows下配置环境变量

  • /boot 存放的是启动linux时使用的一些核心文件,包括一些连接文件以及镜像文件

  • /dev Linux外部设备,在Linux中访问设备的方式和访问文件的方式是相同的

  • /etc 用来存放所有的系统管理所需要的配置文件和子目录

  • /home 所有用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的

  • /lib 存放系统最基本的动态链接共享库,其作用类似Windows里面DLL文件,几乎所有的应用程序都需要用到这些共享库

  • /media Linux系统会自动识别一些设备,例如优盘光驱等,当识别后,Linux会把识别的设备挂载到这个目录下

  • /mnt 系统提供该目录是为了让用户临时挂载别的文件系统,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里面的内容了

  • /root 该目录为系统管理员,也称作超级权限者的用户主目录

  • /usr 非常重要的目录,用户很多应用程序和文件都放在这个目录下,类似windows下的program file目录

3.命令

  • pwd -----当前目录
  • cd ~或者cd------ 当前用户家目录
  • tree----先安装,查看目录

绿色–可执行文件

红色–压缩包

青色–链接文件(stdio)

黄色–设备文件

  • ls 查看所有目录、文件
  • ls -a 可以查看隐藏目录、文件
  • ls -l 查看目录、文件详细信息(读写执行权限等等)

文件类型:

  • madir-----创建目录

    madir test

    mkdir aa/bb/cc -p 或者 mkdir -p aa/bb/cc

  • rmdir-------删除一个空目录(空的)

  • rm aa -r------递归删除目录

  • rm -ri bb-----提示

  • touch saber------创建文件

  • cp a temp-------拷贝文件(temp不存在就创建,存在就覆盖)

拷贝目录:

mylinux@ubuntu:~$ cp test newdir
cp: 略过目录'test'

mylinux@ubuntu:~$ cp test newdir -r      //递归拷贝目录

mylinux@ubuntu:~$ tree newdir
newdir
├── a
└── b
  • cat 文件名----查看内容,直接展示(适合小文件)

  • more 文件名----分页(空格)或者 (enter)查看内容 退出q/ctrl+c

  • less 文件名----行(enter) ctrl+p往前翻 ctrl+n往后翻

  • head 文件名-----默认显示前10行

  • head 文件名 -n----显示前n行

  • tail 文件名 -n----显示后n行

  • mv 原file名 现在file名 ----更改文件名

  • mv file dir------将file移动到dir中

  • ln -s file名 快捷方式名-----给文件创建快捷方式(文件名如果不是绝对路径、移动后快捷方式会失效)-------创建软链接(也可以用于目录)

  • ln file名 file_hard------给文件创建硬链接-------相当于备份(不占用磁盘空间)

    目录是不能创建硬连接的,只有文件可以

  • wc----获取一个文本文件信息

mylinux@ubuntu:~$ wc client.c 
  57  106 1138 client.c
行号  单词数 字节数 文件名
  • df - h------查看磁盘使用情况

  • which ls-----查看命令所在位置

  • adduser username------增加新用户

  • useradd -m username----增加新用户

4.文件权限

4.1更改文件权限:

  • 文字设定:

chomd [who] [+|-|=] [mode]

who:文件所有者(u) 文件所属组(g) 其他人(o)所有人:a

+:添加权限

-:减少权限

=:覆盖原来的权限

mode: r w x

  • 数字设定:

-: 没有权限

r: 4

w: 2

x: 1

such as:765

7: rwx 文件所有者

6:rw 文件所属组

5:rx 其他人

chmod -001 file:将其他人的执行权限去掉

4.2更改所属组:

sudo chown 所有者名 file

sudo chown 所有者名:所属组名 file

sudo chgrp 组名 file-------更改所属组

5.查找与检索

5.1按文件属性查找

按文件名查找:find+ 查找的目录 + -name + “文件名”

按文件大小:find+查找目录+ -size + (+10k/-10k/+10M/)

按文件类型:find+查找目录+ -type +d/f/b/c/s/p/l

5.2根据所有者和所属组查找

find +查找目录+ -user 组名

find+查找目录+ -group 组名

5.3在文件中搜寻字符串匹配的行并输出:grep

grep -r [查找的关键字] [路径]

mylinux@ubuntu:~$ grep include ~/test/b.c
#include 
#include 
#include 
#include 
#include 
#include 
#include 

6.安装

在线安装:

ubuntu:apt-get

centos:yum

安装tree:sudo apt-get install tree

删除tree:sudo apt-get remove tree

更新软件列表:sodu apt-get update

清理所有软件安装包:sudo apt-get clean

deb包安装(-i)卸载(-r):

sudo dpkg -i 安装包(xx,deb)

sudo dpkg -r 安装包(xx,deb)

源码安装:

7.压缩包管理

低配版:gzip bzip2

gzip:只能压缩文件,不能压缩目录

bzip2:只能压缩文件,不能压缩目录

bzip2 -k *.txt(可以保留原文件)

高排版:

tar-------不使用z/j,该命令只能对文件或目录打包

c------创建------压缩

x------释放------解压缩

v------显示提示信息-----压缩解压缩------可以省略

f------指定压缩文件的名字

z------使用gzip的方式压缩文件------ .gz

j-------使用bzip2的方式压缩-------- .bz2

压缩:(语法)

tar zcvf 生成指定压缩包的名字(xxx.tar.gz) 要压缩的文件或目录

tar jcvf 生成指定压缩包的名字(xxx.tar.bz2) 要压缩的文件和目录

mylinux@ubuntu:~$ tar zcvf allcpp.tar.gz *.c
cli.c
client.c
ser.c
server.c
tcp_server.c
mylinux@ubuntu:~$ ls
allcpp.tar.gz  client.c          hello_world.py   ser       tcp_server.c   公共的  文档
cli            examples.desktop  hello_world.pyc  ser.c     test           模板    下载
cli.c          get-pip.py        mysocket         serevr    test1          视频    音乐
client         get-pip.py.1      newdir           server.c  vscode_pyfile  图片    桌面
mylinux@ubuntu:~$ 

解压缩(语法):

tar jxvf 压缩包的名字

mylinux@ubuntu:~$ ls
allcpp.tar.gz  client.c          hello_world.py   ser       tcp_server.c   公共的  文档
cli            examples.desktop  hello_world.pyc  ser.c     test           模板    下载
cli.c          get-pip.py        mysocket         serevr    test1          视频    音乐
client         get-pip.py.1      newdir           server.c  vscode_pyfile  图片    桌面
mylinux@ubuntu:~$ rm *.c
mylinux@ubuntu:~$ ls
allcpp.tar.gz  examples.desktop  hello_world.py   newdir  test           公共的  图片  音乐
cli            get-pip.py        hello_world.pyc  ser     test1          模板    文档  桌面
client         get-pip.py.1      mysocket         serevr  vscode_pyfile  视频    下载
mylinux@ubuntu:~$ tar zxvf allcpp.tar.gz 
cli.c
client.c
ser.c
server.c
tcp_server.c
mylinux@ubuntu:~$ ls
allcpp.tar.gz  client.c          hello_world.py   ser       tcp_server.c   公共的  文档
cli            examples.desktop  hello_world.pyc  ser.c     test           模板    下载
cli.c          get-pip.py        mysocket         serevr    test1          视频    音乐
client         get-pip.py.1      newdir           server.c  vscode_pyfile  图片    桌面
mylinux@ubuntu:~$

tar jxvf 压缩包名字 -C 指定目录

mylinux@ubuntu:~$ tree test1
test1
0 directories, 0 files
mylinux@ubuntu:~$ tar jxvf test.tar.bz2 -C test1
test/
test/a.hard
test/b.c
test/tcp_client
test/a
test/tcp_client.c
test/b
mylinux@ubuntu:~$ tree test1
test1
└── test
    ├── a
    ├── a.hard
    ├── b
    ├── b.c
    ├── tcp_client
    └── tcp_client.c

1 directory, 6 files
mylinux@ubuntu:~$ ^C
mylinux@ubuntu:~$ 

rar--------必须手动安装该软件

8.进程管理

ps aux

管道|:过滤

pa aux|grep bash

kill -l

kill -9 pid kill -sigkill pid杀死进程

env配置信息

top查看任务管理器

9.网络相关命令

ifconfig

ping

mylinux@ubuntu:~$ ping  172.20.10.3 -c 4
PING 172.20.10.3 (172.20.10.3) 56(84) bytes of data.
64 bytes from 172.20.10.3: icmp_seq=1 ttl=128 time=3.57 ms
64 bytes from 172.20.10.3: icmp_seq=2 ttl=128 time=3.87 ms
64 bytes from 172.20.10.3: icmp_seq=3 ttl=128 time=1.65 ms
64 bytes from 172.20.10.3: icmp_seq=4 ttl=128 time=1.71 ms

--- 172.20.10.3 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 1.654/2.702/3.872/1.026 ms

nsloopup

mylinux@ubuntu:~$ nslookup www.baidu.com
Server:		127.0.1.1
Address:	127.0.1.1#53

Non-authoritative answer:
www.baidu.com	canonical name = www.a.shifen.com.
Name:	www.a.shifen.com
Address: 36.152.44.95
Name:	www.a.shifen.com
Address: 36.152.44.96

10.用户管理

添加用户

sudo adduser bob(用户名)

sudo useradd -s /bin/bash -g 组名 -d /home/用户名 -m用户名

更改密码

passwd 用户名

删除用户

sudo deluser +用户名

sudo userdel -r 用户名 -r的作用:把用户的主目录一起删除

cat /etc/passwd ---------存放用户信息

11.ftp服务器搭建—vsftpd

作用:负责文件的上传和下载

  • 服务器端

    • 修改配置文件

      sudo vim vsftpd.conf

    • 重启服务

      sudo service vsftpd restart

  • 客户端

    • 实名用户登录

      ftp+IP(server)

      输入用户名(server)

      输入密码

      文件上传:put file

      文件下载:get file

      不允许操作目录,如果想操作,只能打包之后再操作

    • 匿名用户登录

      ftp+serverIP

      用户名:anonymous

      密码:无(enter)

      不允许匿名用户在任意目录切换

      只能在一个指定的目录范围内工作

      需要在ftp服务器上创建一个匿名用户的目录----匿名用户的根目录

    • lftp客户端访问ftp服务器

      使用lftp上传、下载多个文件:mput xx xx xx / mget xx xx

      使用lftp上传、下载目录:mirror dir / mirror -R dir

12.nfs网络共享服务器

  • 服务器端

    创建共享目录:mkdir dir

    修改配置文件:/etc/exports

    /home/用户名/共享文件夹(ro/re,syns)

    重启服务:sudo service nfs-kernel-server restart

  • 客户端

    挂载服务器共享目录:sudo mount serverIP:/home/用户名/sharedir /mnt

13.ssh服务器

  • 服务器端

    安装ssh:sudo apt-get install openssh-server

    查看SSH是否安装:sudo aptitude show openssh-server

  • 远程登陆

    ssh 用户名@IP

    eg:服务器管理员通过ssh远程登录外地主机,进程维护

  • 退出登录

    logout

14.scp命令(super copy)

scp -r 目标用户名@目标主机名:/目标文件的绝对路径 /保存到本机的绝对(相对)路径

#mylinux@ubuntu
scp -r  [email protected]:/home/bob/aa /home/mylinux/newdir

15.vim

  • 命令模式下的快捷键

    H J K L

    前下上后

    行首:0

    行尾:$

    文件开始位置:gg

    文件结尾:G

    行跳转:n(100/200)G

  • 删除操作

    删除光标后面的字符:x

    删除光标后面的字符:X

    删除单词:dw

    删除光标到行首的字符:d0

    删除光标到行尾的字符:D

    删除光标当前行:dd

    删除多行:ndd(n是一个自然数)

  • 撤销操作:u

  • 反撤销:ctrl+r

  • 复制:yy

  • 复制多行:nyy

  • 粘贴:p(下一行开始) P(当前行开始)

  • 剪切==删除

  • 可视模式

  • 选择内容:hjkl

  • 操作:复制y 删除:d

  • /查找内容 ?查找内容 n/N上下移动光标

  • 缩进:>> <<

  • 文本模式

  • a-----在光标所在位置后面插入

  • A----在当前行的尾部插入

  • i------在光标所在位置的前面插入

  • I------在光标所在行的行首插入

  • o-----在光标所在行的下面开辟一行

  • O----在光标所在行的上面开辟一行

  • s-----删除光标后面的字符

  • S-----删除光标所在行

  • 末行模式

  • 查找------/tom

  • 替换-------

  • /tom/jack/g

  • :%s/tom/jack/

  • :20,25s/tom/jack/g

  • 分屏模式--------

  • :sp ctrl+ww切换--------水平分屏

  • :vsp +文件名 ctrl+ww切换--------垂直分屏

16.gcc编译过程

hello.c—(预处理器)—>hello.i-----(编译器)–>hello.s------(汇编器)---->hello.o-----(链接器)---->hello.out(可执行文件)

  • 预处理器(cpp)------头文件展开,宏替换,注释去掉----gcc -E hello.c -o hello.i
  • 编译器(gcc)-----c文件变成汇编文件-----gcc -S hello.i -o hello.s
  • 汇编器(as)-----汇编文件变成二进制文件----gcc -c hello.s -o hello.o
  • 链接器(ld)-----将函数库中相应的代码组合到目标文件中-----gcc hello.o -o hello
  • 直接:gcc hello.c -o hello
  • 执行:./hello
  • 怎增加头文件: gcc hello.c -o hello -I include(头文件)
  • 增加宏定义: gcc hello.c -o hello -I include -D DEBUG
  • 优化程序: gcc hello.c -o hello -I include -D DEBUG -O3(最高优化)
  • 输出警告信息:gcc hello.c -o hello -I include -D DEBUG -O3 -Wall
  • 包含调试信息:gcc hello.c -o hello -I include -D DEBUG -O3 -Wall -g

17.静态库的制作

  • 命名规则 lib+库名字+.a such as(libmytest.a)

  • 制作步骤

    生成对应的.o文件-------.c----->.o -c

    将生成的.o文件打包 ar rcs +静态库的名字+生成的所以的.o

  • 发布和使用静态库:

    发布静态库

    头文件

  • 调用静态库的两种方式:

    gcc main.c /lib/mytest.a -o test -I include

    gcc main.c -I include -L lib -l mytest -o test

  • 静态库的优势

    • 发布程序的时候,不需要提供对应的库
    • 加载库的速度快
  • 静态库的缺点

    • 库被打包到应用程序中,导致库的体积很大
    • 库发生了改变,需要重新编译程序

18.动态库的制作(共享库)

  • 命名规则:lib+名字+.so

  • 制作步骤:

    • 生成与位置无关的代码(生成与位置无关的.o)
    • cd src
    • gcc -fPIC -c *.o -I …/include
    • gcc -shared -o libmytest.so *.o -I include
  • 发布和使用共享库

    • mv libmytest.so …/lib

    • cd lib/

    • gcc main.c lib/libmytest.so -o test -I include

    • 或者gcc main.c -I include -L /lib -l mytest -o test

    • ./test

  • export LD_LIBRARY_PATH=./lib

  • 解决程序执行时动态链接库无法被加载的问题

    • 需要找动态链接器的配置文件
    • 动态库的路径写到配置文件中
    • 更新------sudo ldconfig -v
    • cd /etc
    • sudo vim ld.so.conf
    • 添加动态库的路径:/home/……/lib
    • ldd mytest查看
  • 优点

    • 执行程序小
    • 动态库更新了,不需要重新编译程序
  • 缺点

    • 发布程序时,需要动态库提供给用户
    • 动态库没有被打包到应用程序中,加载速度相对较慢
  • 总结:

    gcc工作流程:

    预处理:gcc -E

    编译: gcc -S

    汇编: gcc -c

    链接:没参数

    -o:指定生成的文件的名字

    -D:在编译的时候定义宏

    -I:指定头文件的路径

    -g:gdb调试的时候需要添加该参数

    -O:编译优化,3个等级

    -Wall:编译期间输出警告信息

    制作静态库:

命名规则:libmytest.a

制作步骤:

生成.o: gcc -c *.c

打包(将所有的.o文件):ar rcs 静态库的名字 *.o

使用: main.c

​ gcc main.c -L /libpath -l libname -o 文件名 -I include

制作动态库:

动态库后缀:.so--------libname.so

制作步骤:

​ 生成与位置无关的代码(.o)

​ gcc -fPIC -c *.c -I include

​ 将.o打包生成.so文件

​ gcc -shared *.o -o libname.so

​ 使用main.c lib include

​ gcc main.c -L lib -l mytest -I include -o test

应用程序不能执行,动态链接库连接不到自己制作的库

临时设置的方法:

export LD_LIARARY_PATH=./lib

永久设置的方法:

找到动态链接库的配置文件:/etc/ld.so.conf

在该文件中添加动态库的目录(绝对路径)

更新:sudo ldconfig -v

19.gdb调试

gcc main.c -o test -g

gdb test

查看:

l 文件名:20(行号)

l 文件名:函数名

l 继续查看后面内容

设置断点:break(b) 22(行号)

查看断点信息:info(i) break(b)

执行:start 或者 run

单步执行:n

继续:c(continue)

display 变量名:追踪查看具体变量值

info display

undisplay 编号:取消跟踪

u ------跳出单词循环

d 断点编号------删除断点

finish-----跳出当前函数

set var i=10-----设置变量的值

quit-------退出gdb

20.makefile(代码管理)

规则三要素:目录,依赖,命令

目标:依赖

命令

//makefile编写----version1
test(可执行文件):依赖(*.c文件)
    gcc xx.c xxx.c …… -o test
执行:make

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pwwkSEBv-1585232160276)(C:\Users\严高飞\AppData\Roaming\Typora\typora-user-images\1585230092836.png)]

//修改时可以提高效率----version2
test:main.o add.o sub.o mul.o
    gcc main.o add.o sub.o mul.o -o test
main.o:main.c
    gcc -c main.c
add.o:add.c
    gcc -c add.c
sub.o:sub.c
    gcc -c sub.c
mul.o:mul.c
    gcc -c mul.c
make
//version3
abj=main.o add.o sub.o mul.o
target=test
target:$(obj)
    gcc $(obj) -o target
%.o:%.c
    gcc -c $< -o $@

makefile中的自动变量

$<:规则中的第一个依赖

$@:规则中的目标

$^:规则中的所有依赖

名:追踪查看具体变量值

你可能感兴趣的:(linux,ubuntu)