Linux

Linux下基本命令的掌握

ls指令

语法:ls [ 选项 ] [文件或目录]

功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。

常用选项:

  • -a 列出目录下的所有文件,包括以.开头的隐含文件。
  • -d 将目录象文件一样显示,而不是显示其下的文件。如:ls -d指定目录
  • -i 输出文件的i节点的索引信息。如ls -ai指定文件
  • -k 以k字节的形式表示文件的大小。ls -alk 指定文件
  • -| 列出文件的详细信息。
  • -t 以时间排序。
  • -R 列出所有子目录下的文件。(递归)
  • -h 可以显示大小单位,但要和-l参数一起使用

文件系统可以看这篇文章——[详细讲解,Linux内核——文件系统(建议收藏)][https://zhuanlan.zhihu.com/p/505338841]

ls通配符的使用

通配符 含义
* 代表任意个数个字符
代表任意一个字符,至少1个
[] 表示可以匹配字符组中的任意一个
[abc] 匹配abc中的任意一个
[a-f] 匹配a到f范围内的任意一个字符

硬链接数:通俗的讲就是有多少种方式可以访问当前的目录

pwd命令

语法:pwd

功能:显示用户当前所在目录

常用选项:无

image-20231031195748175

cd指令

Linux系统中,磁盘上的文件和目录被组成一颗目录树,每个节点都是目录或文件

语法:cd 目录名

功能:改变工作目录,将当前工作目录改变到指定的目录下

举例:

cd ..: 返回上级目录
cd /root/Desktop: 绝对路径
cd ../day02/:相对路径
cd ~: 进入用户家目录
cd -: 返回最近访问的目录

touch命令

语法:touch [选项]…文件…

功能:touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件。

常用选项:

  • -a 或-time=atime或–time-access或–time=use只改存取时间
  • -d 适用指定的日期时间,而非现在的时间
  • -f 此参数将忽略不予处理,仅负责解决BSD版本和touch指令的兼容性问题。
  • -m 或–time=mtime或–time=modify 只更改变动时间
  • -r 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同
  • -t 使用指定的日期时间,而非现在的时间

如果文件不存在,可以创建一个空白文件

如果文件已经存在,可以修改文件的末次修改日期

mkdir指令(重要)

语法:mkdir [选项] dirname…

功能:在当前目录下创建一个名问dirname的目录

常用选项:

  • -p,–parents 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立那些尚不存在的目录,即一次可以建立多个目录。

举例:

mkdi -p /test/test1

image-20231031202106611

rmdir指令&&rm指令(重要)

rmdir是一个与mkdir相应的命令,mkdir是建立目录,而rmdir是删除命令。

语法:rmdir [-p] [dirname]

适用对象:具有当前目录操作权限的使用者

功能:删除空目录

常用选项:

  • -p 当子目录被删除后如果父目录变成空目录的话,就连带父目录一起删除

rm命令可以同时删除文件或目录

语法: rm[-f-i-r-v] [dirname/dir]

适用对象:所有适用者

功能:删除文件或目录

常用选项:

  • -f 即使文件属性为只读,也直接删除
  • -i 删除前逐一询问确认
  • -r 删除目录及其下所有文件,删除文件夹必须加此参数

man指令(重要)

Linux的命令有很多参数,我们不可能全记住,我们可以通过查看联机手册获取帮助。访问Linux手册页的命令是man。

语法:man [选项] 命令

常用选项:

  • -k 根据关键词搜索联机帮助

  • num只在第num章节找

  • -a 将所有章节的都显示出来,比如man printf它缺省从第一章开始搜索,知道就停止,用a选项,当按下q退出,他会继续往后面搜索,知道所有章节都搜索完毕

  • 1是普通命令

  • 2 是系统调用如open,write之类的(通过这个,至少可以方便的差导调用这个函数们需要加什么头文件)

  • 3 是库函数,如printf,fread

  • 4 是特殊文件,也就是/dev下的各种设备文件

  • 5 是指文件的格式,比如passwd,就会说明这个文件中各个字段的含义

  • 6 是给游戏留的,由各个游戏自己定义

  • 7 是附件还有一些变量,比如向environ这种全局变量在这里就有说明

  • 8 是系统管理用的命令,这些命令只能由root使用,如ifconfig

man手册可以汉化。

cp指令重要

语法:cp [选项] 源文件或者目录 目标文件或者目录

功能:复制文件或目录

说明:cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息

image-20231031210152423

常用选项:

  • -f或–force强行复制文件或目录,不论目的文件或目录是否已经存在
  • -i或–interactive覆盖文件之前先询问用户
  • -r递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的志,不属于目录或符号链接,则一律视为普通文件处理
  • -R或–recursive递归处理,将指定目录下的文件及子自录—升处理

mv指令(重要)

mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename)files),是linux系统下常用的命令。经常用来备份文件或目录

语法:mv [选项] 源文件或者目录 目标文件或者目录

功能:

  1. 视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的目录中。
  2. 当第二个参数类型是文件时、mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的日标文件名。
  3. 当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。

常用选项:

  • -f : force强制的意思,如果目标文件已经存在,不会询问而直接覆盖.
  • -i :若目标文件(destination)已经存在时,就会询问是否覆盖!

举例:

将rm改成mv
vim ~/.bashrc #修改这个文件
mkdir -p ~/.trash
alias rm=trash
alias ur=undelfile
undelfile() {
mv -i !.trash/\$@ ./
}
trash() {
mv $@ ~/.trash/
}

cat

语法: cat [选项] [文件]

功能:查看目标文件内容

常用选项:

  • -b 对非空输出行编号
  • -n 对输出的所有行编号
  • -s 不输出多行空行

date

date指定格式显示时间 date+%Y:%m:%d

date用法:date[option]…[+Format]

  1. 在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记,其中常用的标记列表如下

    • %H:小时(O0..23)
    • %M:分钟(00..59)
    • %S∶秒(00..61)
    • %X∶相当于%H:%M:%S
    • %d:日(01..31)
    • %m :月份(01..12)
    • %Y:完整年份(0000..9999)
    • %F:相当于%Y-%m-%d
  2. 在设定时间方面

    • date -s //设置当前时间,只有root权限才能设置,其他只能查看。
    • date -s 20080523/设置成20080523,这样会把具体时间设置成空00:00:00
    • date -s 01:01:01//设置具体时间,不会对日期做更改
    • date -s “01:01:01 2008-05-23”//这样可以设置全部时间
    • date -s “01:01:01 20080523”//这样可以设置全部时间
    • date -s “2008-05-23 01:01:01”//这样可以设置全部时间
    • date -s “200805230 1:01:01”//这样可以设置全部时间
  3. 时间戳

    时间->时间戳

    • date +%s

    时间戳->时间

    • date+%Y:%m:%d -d @1599642565

    Unix时间戳(英文为Unix epoch, Unix time, POSIX time或Unix timestamp)是从1970年1月1日(UTCGMT的午夜)开始所经过的秒数,不考虑闰秒。

top

Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。我们目前要了解的选项

选项:

  • -u<用户名>指定用户名
  • -p<进程号>指定进程
  • -n<次数>循环显示的次数

shutdown关机

语法:shutdown [选项] 常见选项:

  • -h :将系统的服务停掉后,立即关机
  • -r ︰在将系统的服务停掉之后就重新启动
  • -t sec : -t后面加秒数,亦即『过几秒后关机』的意思

如果后面购买了云服务器,尽量不要使用shutdown来关机,因为云服务器一般都要保证服务器一直在线,使用exit或者ctrl+d退出即可

重要的几个热键[Tab],[CTRL]+c,[CTRL]+d

  • ctrl + d:退出登陆用户或键盘输入结束

  • tab键:命令或档案的补全

  • ctrl+c:终止前台异常进程

grep

  • -n:显示匹配行及行号
  • -v:显示不包括匹配文本的所有行(相当于求反)
  • -i:忽略大小写

常用的两种查找模式

  • ^a:行首,搜寻以a开头的行
  • ke$行尾,搜索以ke结束的行

scp

先 ssh [-p port] user@remote 登陆

# 把堂前目录下的01.py文件复制到远程家目录下的 Desktop/0.1py
# 注意:`:`后面的路径如果不是绝对路径,则以用户的家目录作为参照路径
scp -P port 01.py user@remote:Desktop/01.py

# 把远程家目录下的Desktop/01.oy文件复制到本地当前目录下的01.py
scp -P port user@remote:Desktop/01.py 01.py

# 加上-r可以传送文件夹
scp -r demo user@remote:Desktop

scp -r user@remote:Desktop demo

以下命令后续逐一补全:

  • 安装和登录命令: login、shutdown、halt、reboot、install、mount、umount、chsh、exit、last;
  • 文件处理命令: file、mkdir、grep、dd、find、mv、ls、diff、cat、In;
  • 系统管理相关命令: df、top、free、quota、at、lp、adduser、groupadd、kill、crontab;
  • 网络操作命令: ifconfig、 ip、ping、netstat、telnet、ftp、route、rlogin、rcp、finger、mail、nslookup
  • 系统安全相关命令: passwd、su、umask、chgrp、chmod、chown、chattr、sudo ps、who;
  • 其它命令: tar、unzip、gunzip、unarj、mtools、man、unendcode、uudecode。

netstat (重要)

netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。

  • -a:查看所有连接

  • -c:持续列出网络状态

  • -e:显示网络其他相关信息

  • -n:直接打印连接的IP地址与端口信息

  • -l 或–listening 显示监控中的服务器的Socket。

  • -p 或–programs 显示正在使用Socket的程序识别码和程序名称。

  • -r:显示路由信息

  • -t:显示TCP传输协议的连线状况

netstat -lntp可以用来查看服务器是什么

ps

ps aux 查看进程详细状况
-a 显示终端上的所有进程,包括其它用户的进程
-u 显示进程的详细状态
-x 显示没有控制终端的进程
减号-可以不带
top 动态显示运行中的进程并且排序
kill [-9] PID 终止指定代号的进程 -9表示强行终止

提示:使用 kill命令时,最好只终止由当前用户开启的进程,而不要终止root身份开启的进程,否则可能导致系统崩溃

实例

查看进程的PID、名称以及CPU占用率:

ps axo pid,comm,pcpu

按内存资源的使用量对进程进行排序:

ps aux | sort -rnk 4

按CPU资源的使用量对进程进行排序:

ps aux | sort -nk 3

显示所有进程信息:

ps -A

显示指定用户信息:

ps -u root

查看线程数:

ps -efL

查看进程并按内存使用大小排列:

ps -e -o "%C : %p :%z : %a" | sort -k5 -nr

显示所有进程信息,连同命令行:

ps -ef

ps与grep常用组合用法,查找特定进程:

ps -ef | grep ssh

通过名字或命令搜索进程:

ps -C nginx

CPU或者内存进行排序,降序:

ps aux --sort=-pcpu,+pmem

用树的风格显示进程的层次关系:

ps -f --forest -C nginx

显示一个父进程的子进程:

ps -o pid,uname,comm -C nginx

重定义标签:

ps -e -o pid,uname=USERNAME,pcpu=CPU_USAGE,pmem,comm

显示进程运行的时间:

ps -e -o pid,comm,etime

查看named进程详细信息:

ps -aux | grep named

通过进程id获取服务名称:

ps -o command -p 91730 | sed -n 2p

将目前属于您自己这次登入的PID与相关信息列示出来:

ps -l

列出目前所有的正在内存当中的程序:

ps aux

找出与cronsyslog这两个服务有关的PID号码:

ps aux | egrep '(cron|syslog)'

把所有进程显示出来,并输出到ps001.txt文件:

ps -aux > ps001.txt

awk

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得
尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各
种分析处理。

awk有3个不同版本: awk、 nawk和gawk, 未作特别说明,一般指gawk, gawk 是AWK的GNU版本。
awk其名称得自于它的创始人Alfred Aho、Peter Weinberger和Brian Kernighan 姓氏的首个字母。实
际上AWK的确拥有自己的语言: AWK 程序设计语言,三位创建者已将它正式定义为“样式扫描和处
理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计
算以及生成报表,还有无数其他的功能。

有三种方式调用awk:

  • 1.命令行方式- (重点介绍)
    awk [-F field-separator]
    commands’
    input-file(s)
    其中,commands是真正awk命令,[-F域分隔符]是可选的。input-file(s) 是待处理的文件。
    在awk中,文件的每一行中, 由域分隔符分开的每一项称为- 一个域。通常,在不指名F域分隔
    符的情况下,默认的域分隔符是空格。
  • shell脚本方式
    将所有的awk命令插入-一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,
    -般通过键入脚本名称来调用。
    相当于shell脚本首行的: #!/bin/bash
    可以换成: #!/bin/ awk
  • 将所有的awk命令插入- -个单独文件,然后调用:
    awk -f awk -script-file input-file(s)
    其中,-f选项加载awk- script-file中的awk脚本,input-file(s) 跟上面的是一样
[youzipii@localhost ~]$ last -5
youzipii pts/1 192.168.174.1 Wed Mar 13 17:17 still logged in
youzipii pts/0 :0 Wed Mar 13 17:16 still logged in
youzipii :0 :0 Wed Mar 13 17:11 still logged in
(unknown :0 :0 Wed Mar 13 16:54 - 17:11 (00:17)
reboot system boot 3.10.0-514.el7.x Wed Mar 13 16:53 - 17:28 (00:34)
wtmp begins Thu Dec 26 18:50:02 2019
wtmp begins Thu Dec 26 18:50:02 2019
[youzipii@localhost ~]$ last -n 5 | awk '{print $1}'
youzipii
youzipii
youzipii
(unknown
reboot
wtmp

awk工作流程是这样的:读入有’ \n’换行符分割的一- 条记录,然后将记录按指定的域分隔符划分域,
填充域,$0则表示所有域, $1表示第- -个域, $n表示第n个域。默认域分隔符是”空白键”或”[tab]
键”,所以$1表示登录用户,$3表示登录用户ip,以此类推,可以用逗号隔开

[youzipii@localhost ~]$ cat /etc/passwd | awk -F ':' '{print $1}'
root
bin
daemon
adm
lp
sync
[youzipii@localhost ~]$ cat /etc/passwd | awk -F ':' '{print $1"\t"$7}'
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
[youzipii@localhost ~]$ ifconfig | awk '/mask/'
inet 192.168.174.142 netmask 255.255.255.0 broadcast 192.168.174.255
inet 127.0.0.1 netmask 255.0.0.0
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255

-F 指定分隔符为:

/内容/打印内容所在行

which

which ls
# 输出 /bin/ls

which useradd
# 输出 /usr/sbin/useradd

bin和sbin

在Linux中,绝大多数可执行文件都是保存在/bin、/sbin、/usr/bin、/usr/sbin

/bin(binary)是二进制执行文件目录,主要用于具体应用

/sbin(system binary)是系统管理员专用的二进制代码存放目录,主要用于系统管理

/usr/bin(user commands for applications)后期安装的一些软件

/usr/sbin(super user commands for applications)超级用户的一些管理程序

df/du

disk freee显示磁盘剩余空间

df -h 显示磁盘剩余空间 重点看根目录挂在的那一条
du -h 目录名 显示目录下空间占用情况
-h 以人性化的方式显示文件大小

du常用命令:du -sh *显示目录下所有文件的大小

ln 建立链接

ln -s 被链接的源文件 链接文件 //建立文件的软链接,用通俗的方式讲类似于 Windows下的快捷方式

注意:没有-s建立的是一个硬链接

两个文件占用相同大小的硬盘空间,工作中几乎不会建立

源文件要使用绝对路径,这样方便文件移动后继续使用

image-20241011164447490

在 Linux 中,文件名 和 文件的数据 是分开存储的

  • 提示:
    在 Linux 中,只有文件的硬链接数==0才会被删除使用
  • 使用ls -l可以查看一个文件的硬链接的数量在日常工作中

sz和rz

szrz 是用于在 Linux 系统中进行文件传输的命令,通常用于通过终端连接到远程服务器,并在本地和远程系统之间传输文件。

rz 命令

rz 命令用于将文件从客户端传输到服务器端。在使用 rz 命令之前,需要在终端模拟器中设置允许 X/Y/ZMODEM 传输,通常可以通过终端模拟器的设置或菜单中找到相应选项。一般来说,你可以通过在终端中输入 rz 命令来启动接收文件的过程。

sz 命令

sz 命令用于将文件从服务器端传输到客户端。在使用 sz 命令之前,你需要在服务器端调用 sz 并在终端模拟器中打开一个文件选择器,选择要发送的文件。选择完成后,文件将通过 ZMODEM 协议发送到客户端。

使用方法

  1. 首先,通过 SSH 或其他远程连接方式连接到目标 Linux 服务器。
  2. 在服务器上使用 rz 命令来接收文件,或者使用 sz 命令来发送文件。
  3. 在本地终端中,选择接收文件(使用 rz)或发送文件(使用 sz)。

这两个命令通常与终端模拟器(如 SecureCRT、PuTTY 等)一起使用,以便在终端界面中进行文件传输。在使用这些命令时,确保你的终端支持 ZMODEM 文件传输协议,以便顺利传输文件。

请注意,为了使用这些命令,你的系统中需要安装 lrzsz 软件包。如果你的系统中没有安装,可以通过包管理器进行安装。不安装lrzsz有些shell终端rz时不会弹出文件选择框,比如mobaxterm

yum list installed | grep lrzsz

image-20241107154833989

这样没有显示就是没装,我们先给他装一下

yum install -y lrzsz

image-20241107155041938

rz

rz (Receive ZMODEM):使用 ZMODEM 协议,将本地文件批量上传到远程 Linux/Unix 服务器,注意不能上传文件夹,如果上传文件夹,请先打包再下载.

rz 命令常用参数

  • -h:显示帮助信息,根据具体的需要选择不同的参数即可
  • -b : 以二进制的方式进行传输,推荐使用
  • -e : 对所有的控制字符进行字符转义,推荐使用
  • –version : 查看 lrzsz 的版本

一般使用 rz -b -e filename

image-20241107155538906

image-20241107155547425

sz

sz (Send ZMODEM):使用 ZMODEM 协议,可将多个文件从远程 Linux/Unix 服务器下载到本地.注意不能下载文件夹,如果下载文件夹,请先打包再下载.

sz [选项] [filelist]
命令选项基本与 rz 相同,具体的选项可以使用 sz -h 来查看
例如:下载多个文件
输入 sz file1 file2 file3 .

image-20241107155830493

这里和选的路径好像还有关系,有些路径他会卡住,我后面选桌面他就直接下载下来了

image-20241107160014921

Linux重定向管道命令环境变量PATH

Linux目录配置标准FHS

是什么?

FHS本质一套规定Linux目录结构,软件建议安装位置的标准
为什么?

使用Linux来开发产品或者发布软件的公司、个人太多,如果每家公司或者个人都按照自己的意愿来配置文件或者软件的存放位置,这无疑是一场灾难。我们可不想学完我们的Linux之后,去公司发现看不懂别人的目录结构,更别谈开发了。
怎么办?

#进入根目录
[root@1ocalhost home]# cd /
#查看目录树(两层,只看目录,不看文件)
[root@localhost /]# tree -d -L 1
.
|- bin -> usr/bin #可执行文件目录,linux白带命令在这里
|- boot #开机会使用到的文件,包括活Linux核心文件以及开机菜单与开机所需配置文件等等。
|- dev #设备目录
|- etc #配置文件几乎都放宣在这个自录内,例如人员的帐号密码档、各种服务的启始档等等
|- home #家目录,系统默认的使用者主文件夹,用户的个人文件都可放在这里
|-lib -> usr/lib #放置在开机时会用到的函数库,以及在/bin或/sbin下面的指令会调用的l函数库l
|-lib64 -> usr /lib64#与lib类似
|- media #放置可移除的设备,包括软盘、光盘、DVD等等设备都暂时挂载于此。
|- mnt #设备临时挂载目录
|─ opt #第三方协力软件放置的目录
|- proc #是一个虚拟文件系统,放置内存中的数据,不占用硬盘空间
|- root #系统管理员的主文件夹
|- run#放置系统开机后所产生的各项信息
|- sbin -> usr/sbin #里面包括了开机、修复、还原系统所需要的指令,root用户使用
|- srv #service是一些网络服务启动之后,这些服务所需要取用的数据目录。
|—- sys #与proc类似
|- tmp #temp,让一般使用者或者是正在执行的程序暂时放置文件的地方
|- usr #unix software resource:与软件安装/执行有关
|- var #variable,与系统运行过程有关,主要为变动性较大的数据
10diro-torioc

linux目录结构详细说明–基于FHS与CentOS7.0[文章链接][https://blog.csdn.net/lzq00277/article/details/108303917]

Linux数据重定向的理解与操作

基本准备

基本大部分计算机,要与人交互,都要默认打开三个设备(文件)

  • 标准输入,stdin,代码是0
  • 标准输出,stdout,代码是1
  • 标准错误输出,stderr,代码是2

为什么?

Linux一切皆文件,交互需求,输入输出信息分类
除了上面的三个标准设备(文件),我们可能经常有从文件读取数据,或者将数据写入文件的场景

重定向的理解

是什么?

  • 输出/追加重定向:本来应该显示到显示器(通常)文件的内容,写入到文件当中。
  • 输入重定向:或者本来应该从显示器(通常)文件读取数据,转化成从指定文件读取数据
[root@localhost test1]# touch file1 file2 file3
[root@localhost test1]# ls #当前只有三个文件
file1 file2 file3
[root@localhost test1]# whoami #该命令输出的结果,默认是直接打印到标准输出的stdout文件中
root
[root@localhost test1]# whoami>file4 #输出重定向,不在显示出来
[root@localhost test1]# ll #新创建文件file4
total 4
-rw-r--r--. 1 root root 0 Oct 31 07:46 file1
-rw-r--r--. 1 root root 0 Oct 31 07:46 file2
-rw-r--r--. 1 root root 0 Oct 31 07:46 file3
-rw-r--r--. 1 root root 5 Oct 31 07:47 file4
[root@localhost test1]# cat file4 #本来应该显示到显示器的内容, 写到了file4文件中
root
#追加重定向
[root@localhost test1]# echo "hello bit">file4 #将新内容重定向到文件file4中
[root@localhost test1]# cat file4 #发现之前的root被覆盖了
hello bit
[root@localhost test1]# echo "hello bit" > file4
[root@localhost test1]# echo "hello bit" > file4
[root@localhost test1]# echo "hello bit" > file4
[root@localhost test1]# cat file4 #连续重定向多此,发现文件内容并无变化
hello bit 其实并不是没有变化,而是每次写入都是重头开始
[root@localhost test1]# echo "hello bit1" >> file4
[root@localhost test1]# echo "hello bit2" >> file4
[root@localhost test1]# echo "hello bit1" >> file4
[root@localhost test1]# cat file4 #通过多此>>,我们发现内容是被追加到文件结尾的,叫做追加重定向
hello bit
hello bit1
hello bit2
hello bit1
#输入重定向
[root@localhost test1]# cat > file1
hello
bit
besd^Ht^H^H^H^[[4~^[[4~ #ctrl+d结束,Delete键不能删除
[root@localhost test1]# cat file1 #可以看出,如果cat后面没有紧跟数据源文件,默认从标准输入获取数据
hello
bit
best
[root@localhost test1]# ll
total 8
-rw-r--r--. 1 root root 28 Oct 31 07:50 file1
-rw-r--r--. 1 root root 0 Oct 31 07:46 file2
-rw-r--r--. 1 root root 0 Oct 31 07:46 file3
-rw-r--r--. 1 root root 43 Oct 31 07:48 file4
[root@localhost test1]# cat file4
hello bit
hello bit1
hello bit2
hello bit1
[root@localhost test1]# cat < file4 #既然cat要打印文件,前提也是先读取file4,所以也可以这样写
hello bit
hello bit1
hello bit2
hello bit1
[root@localhost test1]# cat < file4 > file3 #读取再写入
[root@localhost test1]# cat file3
hello bit
hello bit1
hello bit2
[root@localhost test1]# cat file4 #原数据保留
hello bit
hello bit1
hello bit2
hello bit1

cat >输入时键盘的删除键也会被读入,虽然再次cat不显示,但内存不一样,可以用vi看出来

代码0,1,2?是什么

[whb@vM-O-3-centos test]$ find /home -name test.cfind: ' /home/w1': Permission denied #报错信息
/home/wudu/work/linux-57/1inux-1esson7/signal_test/test.c#正常信息/home/wudu/work/1inux-57/1inux-1esson7/sigaction_test/test.c#正常信息...
[whb@VM-O-3-centos test]$ find /home -name test.c > test_list #发现并不是所有信息都被重定向find: ' /home/w1 ': Permission denied
#报错信息并没有被写入目标文件
[whb@vM-O-3-centos test]$ cat test_list
/home/wudu/work/1inux-57/1inux-1esson7/signal_test/test.c#正常信息被写入了/home/wudu/work /1inux-57/1inux-lesson7/sigaction_test/test.c
...
#1:代表标准输出#2:代表标准错误
# 但是他们两个默认都会往显示器打印,像上面的情况,打印输出到显示器会发生混乱
#只打印正常信息
[whb@VM-O-3-centos test]$ find /home -name test.c 2>err.list/home/wudu/work/linux-57/1inux-lesson7/signal_test/test.c/home/wudu/work/linux-57/linux-lesson7/sigaction_test/test.c/home/wudu/work/1inux-57/linux-lesson7/sigmask/test.c
/home/wudu/work/linux-57/linux-1esson15/test/test.c/home/wudu/work / linux-57/1inux-1esson4/pipesize/test.c/home/wudu/work/linux-57/1inux-lesson5/testmkfifo/test.c/home/wudu/work / linux-57/linux-lesson5/shmtest/test.c/home/wudu/work / linux-57/1inux-lesson3/dynamic/test.c/home/wudu/work/linux-57/linux-lesson3 /static/test.c...
[whb@vM-O-3-centos test]$ cat err.list #错误信息被单独分离出来find: ‘/home/w1’ : Permission denied
find: ' /home/sly': Permission deniedfind: ‘ /home/zwc': Permission deniedfind: ‘/home/cpx': Permission denied

find: ‘ /home/gb': Permission denied
find: ' /home/bss': Permission denied
#只打印错误信息
#上面默认就是
#正常和错误信息都重定向到文件中
[whb@vM-O-3-centos test]$ find /home -name test,c >info.list 2>&1[whb@vM-O-3-centos test]$ cat info.7ist
find: ' /home/wl’ : Permission denied
find: ' /home/wudu/ . local' : Permission denied
/home/wudu/work/linux-57/linux-lesson7/sighal test/test.c/home/wudu/work/linux-57/linux-lesson7[sigaction_test/test.c/home/wudu/work/linux-57/1inux -Pesson7 sigmask/test.c
...
#2>&1??又是什么鬼?这个底层是怎么实现的。目前还不能讲,比特后期的课程才有

显示器中的输出信息有错误的也有正确得,大于(>)只把正确的写入,即只重定向标准输出,如果要都打印进去,在命令后面加上2>&1即可

/dev/null

垃圾桶黑洞设备,如果我知道有错误信息,但是我不想要,我想凡是错误信息直接丢弃,习惯写法是

[whb@vM-O-3-centos test]$ find /home -name test.c 2>/dev/nu11#便只显示正常信息了/home/wudu/work/linux-57/linux-lesson7/signal_test/test.c
/home/wudu/work/1inux-57/linux-lesson7/sigaction_test/test.c/ home/wudu/work/linux-57/linux-1esson7/sigmask/test.c
/home/wudu/work/ linux-57/linux-1esson15/test/test.c/home/wudu/work/linux-57/1inux-lesson4/pipesize/test.c/home/wudu/work/linux-57/linux-1esson5/testmkfifo/test.c
...

Linux管道命令的理解和操作

命令是可以产生数据的,如果我们还要多输出数据进行加工,甚至想多次加工,就需要使用管道

[root@localhost ~]# last #显示正在或者最近登陆linux的用户信息
root pts/0 192.168.174.1 Tue Oct 31 06:45 still logged in
root pts/1 192.168.174.1 Tue Oct 31 06:34 - 06:45 (00:11)
root pts/0 192.168.174.1 Tue Oct 31 04:51 - 06:34 (01:43)
(unknown :0 :0 Tue Oct 31 04:50 still logged in
reboot system boot 3.10.0-514.el7.x Tue Oct 31 04:49 - 09:06 (04:16)
root pts/0 192.168.174.1 Mon Oct 30 20:01 - crash (08:48)
(unknown :0 :0 Mon Oct 30 20:00 - crash (08:49)
reboot system boot 3.10.0-514.el7.x Mon Oct 30 20:00 - 09:06 (13:05)
...

#如果我只想看到5条信息呢
[root@localhost ~]# last | head -5 #其中"|"就是管道,head时一个获取文本行的工具,可以单独介绍
root pts/0 192.168.174.1 Tue Oct 31 06:45 still logged in
root pts/1 192.168.174.1 Tue Oct 31 06:34 - 06:45 (00:11)
root pts/0 192.168.174.1 Tue Oct 31 04:51 - 06:34 (01:43)
(unknown :0 :0 Tue Oct 31 04:50 still logged in
reboot system boot 3.10.0-514.el7.x Tue Oct 31 04:49 - 09:07 (04:17)
...

#如果我只想看到我(root)的登陆历史信息呢?
[root@localhost ~]# last | grep "root"
root pts/0 192.168.174.1 Tue Oct 31 06:45 still logged in
root pts/1 192.168.174.1 Tue Oct 31 06:34 - 06:45 (00:11)
root pts/0 192.168.174.1 Tue Oct 31 04:51 - 06:34 (01:43)
root pts/0 192.168.174.1 Mon Oct 30 20:01 - crash (08:48)
root pts/1 192.168.174.1 Tue Oct 24 04:38 - 04:38 (00:00)
root pts/0 :0 Tue Oct 24 04:30 - 04:39 (00:08)
root :0 :0 Tue Oct 24 04:30 - 04:39 (00:08)
...

#如果我只想看到我的历史登陆时间?要用到awk
[root@localhost ~]# last | grep "root" | awk '{print $1,$4,$5,$6,$7}'
root Tue Oct 31 06:45
root Tue Oct 31 06:34
root Tue Oct 31 04:51
root Mon Oct 30 20:01
root Tue Oct 24 04:38
root Tue Oct 24 04:30
root Tue Oct 24 04:30
root Mon Oct 23 19:08
root Tue Jul 25 01:33
root Tue Jul 25 01:32
root Tue Jul 25 01:14
root Tue Jul 25 01:14
root Tue Jul 25 01:09
root Tue Nov 16 21:07

可见,管道是可以级联多条命令的,每条命令的结果输出,都作为输入,导入下一条命令。有点像流水线

image-20231101001146154

理论上,管道的基本操作就完了,实际上,如果站在日常使用就够了,但是如果想面试大厂,至少有两方面问题需要深究?

  • 除了上面的文本处理工具,还有哪些文本处理工具你都使用过,各自有什么特征?·
  • 站在操作系统层面,管道的底层原理是什么?

Linux环境变量与PATH

假设我们用c写一个输出hello world!的程序

[root@localhost ~]# cat test.c
#include<stdio.h>
int main(){
printf("hello world\n");
return 0;
}
[root@localhost ~]# gcc -o mycmd test.c
[root@localhost ~]# ./mycmd
hello world
#./也可以认为是一种命令
#想ls,就在/bin/ls or/usr/bin/ls,为什么执行的时候可以不带路径呢

环境变量PATH
是一个路径集,命令再被执行时,系统会在环境变量PATH中进行路径查找,如果找到,就停止查找,执行命令。

[root@localhost ~]# echo $PATH #不同环境,平台的内容可能不同
/usr/local/soft/java/jdk1.8.0_40/bin:/usr/local/soft/java/jdk1.8.0_40/jre/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
$:用来显示PATH环境变量的内容
#各个路径以:作为分隔符,每个区域代表一个搜索路径

这也就解释了,为何ls不需要带路径,因为ls所在的路径,本身就在PATH环境变量列表当中。

[root@localhost ~]# which ls
alias ls='ls --color=auto'
/usr/bin/ls

那么问题来了,我也想让我的’hello world’程序执行的时候不带./这样的路径,怎么办呢?

#方法一
[whb@vM-O-3-centos test]$ mycmd-bash: mycmd: command not found
[whb@vM-O-3-centos test]$ sudo cp mycmd /usr/bin[sudo] password for whb:
[whb@vM-O-3-centos test]$ 1s /usr/bin/mycmd/usr/bin/mycmd
[whb@VM-O-3-centos test]$ mycmd#但是千万不要这样干,因为会‘污染'指令集he1lo wor1d
#方法二
[whb@vM-O-3-centos test]$ echo $PATH
/usr/loca1/jdk8/bin:/usr/loca1/jdk8/jre/bin:/usr/loca1/bin:/usr/bin: [usr/Toca1/sbin:/usr/sbin : /home/whb / .1oca1/bin : /home/whb/bin
[whb@vM-O-3-centos test]$ pwd#查看自己当前处于哪个目录/home/whb/test
[whb@VM-0-3-centos test]s export PATH=$PATH:/home/whb/test#导出新的环境变量,加上程序所在的路径[whb@vM-0-3-centos test]$ echo $PATH
/usr/loca1/jdk8/bin:/usr/local/jdk8/jre/bin;/eseloca1/bin:/usr/bin:/usr/local/sbin:/usr/sbin : /home/whb / .loca1/bin:/home/whb/bin : / home/vwhb/tes t
[whb@vM-O-3-centos test]$ sudo rm /usr/bin/mycmd#删掉在/usr/bin路径下的可执行程序[whb@vM-O-3-centos test]$ which myemd #mycmdt经能通过环境变量被找到
~/test/mycmd
[whb@vM-0-3-centos test]$ mycmd就可以不带路径he1lo wor1d

我们在思考一下,几乎可以得出如下结论;

  • 系统本身会提供某种全局育找属性,帮我们找到特定的模块/程序

其实,编译器内部也有类似的功能,想想,为何我们#includec头文件>,并没有指明头文件在哪里,但是编译器也能帮我们找到并展开,包括我们也并没有指明我们的程序依赖哪些第三方库,编译器也能找到。

插话,vim编辑器里Tab键缩进不是4个空格怎么调

  • 第一步,找到vimrc文件所在位置

    # find / -name vimrc
  • 第二步: 找到以后用vim打开vimrc文件并增加下面两行代码

    set ts=4
    set expandtab

    加在set ruler或即可

    image-20231101002709400

Linux权限理解

linux中/etc/pam.d/system-auth文件详解该文件可以用来限制密码强度,输入次数等,可提高安全性

Linux用户的概念

Linux下有两种用户:超级用户(root)、普通用户

  • 超级用户:可以再linux系统下做任何事情,不受限制
  • 普通用户:在linux下做有限的事情。
  • 超级用户的命令提示符是”#”,普通用户的命令提示符是”$”。

角色切换

普通用户切换超级用户

[youzipii@localhost ~]$ whoami
youzipii
[youzipii@localhost ~]$ sudo -s
[sudo] password for youzipii:
[root@localhost youzipii]# whoami
root
[root@localhost youzipii]#

超级用户切换到普通用户

[youzipii@localhost ~]$ sudo -s
[root@localhost youzipii]# whoami
root
[root@localhost youzipii]# exit
exit
[youzipii@localhost ~]$ whoami
youzipii

怎么查看当前linux有多少用户[好文][https://www.cnblogs.com/will-wu/p/12937015.html]

cat /etc/passwd | cut -f 1 -d :
[youzipii@localhost ~]$ cat /etc/passwd | cut -f 1 -d:
root
bin
daemon
adm
lp
...
# 注:| 是管道,把cat的输出传给cut处理;后面的cut取出每一行的以:分割的第一栏
[youzipii@localhost ~]$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
...
/etc/passwd 文件存放的是用户信息.由六个分号组成的7个信息,分别是:
用户名 (magesh): 已创建用户的用户名,字符长度 1 个到 12 个字符。
密码(x):代表加密密码保存在 `/etc/shadow 文件中。
用户 ID(506):代表用户的 ID 号,每个用户都要有一个唯一的 ID 。UID 号为 0 的是为 root 用户保留的,UID 号 1 到 99 是为系统用户保留的,UID 号 100-999 是为系统账户和群组保留的。
群组 ID (507):代表群组的 ID 号,每个群组都要有一个唯一的 GID ,保存在 /etc/group文件中。
用户信息(2g Admin - Magesh M):代表描述字段,可以用来描述用户的信息(LCTT 译注:此处原文疑有误)。
家目录(/home/mageshm):代表用户的家目录。
Shell(/bin/bash):代表用户使用的 shell 类型。

用户相关命令

序号 命令 作用 说明
1 useradd -m -g 组 新建用户名 添加新用户 -m 自动建立用户家目录
-g 指定用户所在的组,否则会建立一个同名的组
2 passwd 用户名 设置用户密码 如果是普通用户,直接用passwd可以修改自己的账户密码
3 userdel -r 用户名 删除用户 -r 会自动删除用户家目录
4 cat /etc/passwd | grep 用户名 确认用户信息 新建用户后,用户的信息会保存在/etc/passwd文件中
5 usermod -g 组 用户名 让用户有某些权限
6 usermod -s /bin/bash 修改用户登陆SHell

报错(用户不在sudoers文件中)

在使用sudo -s命令时,出现以下情况

youzipii is not in the sudoers file.  This incident will be reported.

解决方法:

# 第一步先su - 进入root模式
# 第二步再去修改/etc/sudoers里的内容,在root下面加入用户名,其他与root一致
# 但文件权限可能不够,需要先给权限
[root@localhost ~]# chmod 777 /etc/sudoers
[root@localhost ~]# vi /etc/sudoers
...
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
youzipii ALL=(ALL) ALL
...
[root@localhost ~]# chmod u-wx,o-wx,g-rwx /etc/sudoers

另外,用户角色切换还有其他方式,还有很多细节.
还有,Linux是多用户的,所以可以同时登陆多人,甚至你可以切成别人的身份,但是目前我们的Linux机器,大都是自己使用,所以先不考虑这些。

Linux权限管理

文件访问者的分类

  • 文件和文件目录的所有者:u—User
  • 文件和文件目录的所有者所在的组的用户g—Group
  • 其它用户:o—Others(外国人)
chown 用户名 文件名|目录名 //修改文件拥有者

文件类型和访问权限(事务属性)

image-20231101185252874

组管理

groupadd 组名 sudo执行
groupdel 组名 sudo执行
cat /etc/group 确认组信息
chgrp 组名 文件/目录名 修改文件/目录的所属组 加上-R参数可以递归修改

文件类型

  • d:文件夹-︰普通文件
  • 1∶软链接(类似windows的快捷方式)
  • b:块设备文件(例如硬盘、光驱等)
  • p:管道文件
  • c:字符设备文件(例如屏幕等串口设备)
  • s:套接口文件

file指令

功能说明:辨识文件类型

语法:file [选项] 文件或目录

[youzipii@localhost home]$ cd youzipii/
[youzipii@localhost ~]$ file ../youzipii/
../youzipii/: directory
[youzipii@localhost ~]$ file youzipii.txt
youzipii.txt: empty
[youzipii@localhost ~]$ echo "www.baidu.com" >> youzipii.txt
[youzipii@localhost ~]$ file youzipii.txt
youzipii.txt: ASCII text

基本权限设置

  • 读(r/4) : Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
  • 写(w/2) : Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
  • 执行(x/1) : execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
  • “—“表示不具有该项权限

文件权限值得表示方法

字符表示方法

Linux表示 说明 Linux表示 说明
r– 只读 -w- 仅可写
–x 仅可执行 rw- 读可写
-wx 可写和执行 r-x 可读可执行
rwx 可读可写可执行 无权限
权限符号 八进制 二进制
r 4 100
w 2 010
x 1 001
rw 6 110
rx 5 101
wx 3 011
rwx 7 111
0 000

文件权限访问得相关设置方法

chmod功能:设置访问权限

格式:chmod [参数] 权限 文件明

常用选项:

  • R->递归修改目录文件的权限
  • 说明:只有文件的拥有者和root才可以改变文件的权限

chmod命令权限值的格式

① 用户表示符 +/-=权限字符

  • +:向权限范围增加权限代号所表示的权限
  • -:向权限范围取消权限代号所表示的权限
  • =:向权限范围赋予权限代号所表示的权限
  • 用户符号:
  • u:拥有者
  • g:拥有者同组者
  • o:其它用户
  • a:所有用户

实例

[youzipii@localhost ~]$ ll
total 4
-rw-rw-r--. 1 youzipii youzipii 14 Nov 1 04:04 youzipii.txt
[youzipii@localhost ~]$ chmod u-rw,g-rw,o-r youzipii.txt
[youzipii@localhost ~]$ ll
total 4
----------. 1 youzipii youzipii 14 Nov 1 04:04 youzipii.txt
[youzipii@localhost ~]$ chmod u+w,a=x youzipii.txt
[youzipii@localhost ~]$ ll
total 4
---x--x--x. 1 youzipii youzipii 14 Nov 1 04:04 youzipii.txt

②三位8进制数字

实例

[youzipii@localhost ~]$ chmod 000 youzipii.txt
[youzipii@localhost ~]$ ll
total 4
----------. 1 youzipii youzipii 14 Nov 1 04:04 youzipii.txt
[youzipii@localhost ~]$ chmod 664 youzipii.txt
[youzipii@localhost ~]$ ll
total 4
-rw-rw-r--. 1 youzipii youzipii 14 Nov 1 04:04 youzipii.txt
chown功能:修改文件拥有者

格式:chown [参数] 用户名,文件名

实例

# chown user1 f1
# chwon -R user1 filegroup1
chgrp功能:修文件或目录所属组

格式:chgrp [参数] 用户组名 文件名

常用选项: -R 递归修改文件或目录所属组

实例

# chgrp users /abc/f2
使用sudo分配权限

(1) 修改/etc/sudoers文件分配文件

chmod 740 /etc/sudoers
vi /etc/sudoer

(2) 使用sudo调用授权命令

[youzipii@localhost ~]$ whoami
youzipii
[youzipii@localhost ~]$ sudo -u root whoami
root
...
or
...
[youzipii@localhost ~]$ whoami
youzipii
[sudo] password for youzipii:
[youzipii@localhost ~]$ sudo whoami
root

目录权限

  • 可执行权限:如果目录没有可执行权限,则无法cd到目录中.
  • 可读权限:如果目录没有可读权限,则无法用ls等命令查看目录中的文件内容.
  • 可写权限:如果目录没有可写权限,则无法在目录中创建文件,也无法在目录中删除文件.

换句话来讲,就是只要用户具有目录的写权限,用户就可以删除目录中的文件,而不论这个用户是否有这个文件的写权限.
这好像不太科学啊,我张三创建的一个文件,凭什么被你李四可以删掉?我们用下面的过程印证一下.

[youzipii@localhost ~]$ sudo chmod 777 fortest
[youzipii@localhost ~]$ ll
total 4
drwxrwxrwx. 2 root root 6 Nov 1 04:38 fortest
-rw-rw-r--. 1 user1 youzipii 14 Nov 1 04:04 youzipii.txt
[youzipii@localhost ~]$ ls -ld fortest/
drwxrwxrwx. 2 root root 6 Nov 1 04:38 fortest/
[youzipii@localhost ~]$ cd fortest/
[youzipii@localhost fortest]$ touch test.c
[youzipii@localhost fortest]$ ll
total 0
-rw-rw-r--. 1 youzipii youzipii 0 Nov 1 04:41 test.c
[youzipii@localhost fortest]$ sudo touch test_root.c
[youzipii@localhost fortest]$ ll
total 0
-rw-rw-r--. 1 youzipii youzipii 0 Nov 1 04:41 test.c #普通用户
-rw-r--r--. 1 root root 0 Nov 1 04:41 test_root.c #超级用户
[youzipii@localhost fortest]$ whoami
youzipii
[youzipii@localhost fortest]$ rm test_root.c
rm: remove write-protected regular empty file ‘test_root.c’? y
[youzipii@localhost fortest]$ ll
total 0
-rw-rw-r--. 1 youzipii youzipii 0 Nov 1 04:41 test.c #删除成功

为了解决这个问题,Linux引入了粘滞位

粘滞位[好文][https://blog.csdn.net/better1914/article/details/53943081]

粘滞位(Stickybit),或粘着位。最常见的用法在目录上设置粘滞位,如此以来,只有目录内文件的所有者或者root才可以删除或移动该文件。如果不为目录设置粘滞位,任何具有该目录写和执行权限的用户都可以删除和移动其中的文件。在我们系统中,粘滞位一般用于/tmp目录,以防止普通用户删除或移动其他用户的文件。
一个目录具有粘滞位,则在other的X位会表现为 t,或者T.大小写的区别在于,原来x位上有x权限,有了粘滞位则表现为t.否则,表现为T。

[youzipii@localhost /]$ ls -ld /tmp
drwxrwxrwt. 30 root root 4096 Nov 1 04:04 /tmp

删除用户是最好带上-r不然用户的home目录不会一起删除

关于目录权限总结

  • 目录的可执行权限是表示你可否在目录下执行命令。
  • 如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd进入目,即使目录仍然有-r读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)
  • 而如果目录具有-x权限,但没有-权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限
  • 所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。

Linux软件包管理yum

什么时软件包

  • 在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序.
  • 但是这样太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成windows上的安装程序)放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安装.
  • 软件包和软件包管理器,就好比”App”和”应用商店”这样的关系.
  • yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器.主要应用在Fedora, RedHat,Centos等发行版上.

关于rzsz

这个工具用于windows机器和远端的Linux机器通过XShell传输文件.安装完毕之后可以通过拖拽的方式将文件上传过去.

注意事项

关于yum的所有操作必须保证主机(虚拟机)网络畅通!可以通过 ping 指令验证

ping baidu.com

ping命令是一个用来进行检测网络连通性的命令,我们目前主要会用就行,如果你不知道自己的主机有没有联网,可以试试ping

[youzipii@localhost yum.repos.d]$ ping baidu.com -c 4
PING baidu.com (110.242.68.66) 56(84) bytes of data.
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=1 ttl=128 time=56.8 ms
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=2 ttl=128 time=56.2 ms
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=3 ttl=128 time=57.3 ms
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=4 ttl=128 time=56.1 ms

--- baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 56.184/56.664/57.344/0.561 ms

查看软件包

通过yum list 命令可以罗列出当前一共有哪些软件包.由于包的数目可能非常之多,这里我们需要使用grep命令只筛选出我们关注的包.例如:

[youzipii@localhost yum.repos.d]$ yum list | grep lrzsz
lrzsz.x86_64 0.12.20-36.el7 @anaconda

注意事项

  • 软件包名称:主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构.
  • “x86_64”后缀表示64位系统的安装包, “i686”后缀表示32位系统安装包.选择包时要和系统匹配.”el7”表示操作系统发行版的版本.
  • “el7”表示的是centos7/redhat7. “el6”表示centos6/redhat6.
  • 最后一列, base 表示的是”软件源”的名称,类似于”小米应用商店”,”华为应用商店”这样的概念.

如何安装软件

通过yum,我们可以通过很简单的一条命令完成gcc的安装.

sudo yum install lrzsz

yum 会自动找到都有哪些软件包需要下载,这时候敲”y”确认安装.出现”complete”字样,说明安装完成.

注意事项

  • 安装软件时由于需要向系统目录中写入内容,一般需要会do或者切到rool账户下才能完成.
  • yum安装软件只能一个装完了再装另一个.正在yum安装一个软件的过程中,如果再尝试用yum安装另外-个软件, yum会报错.

如何卸载软件

仍然是一条命令:

sudo yum remove lrzsz

[换源][https://blog.csdn.net/xiaojin21cen/article/details/84726193]

vim与gcc使用

img

vi/vim区别

vilvim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于x window、mac os、windows。我们课堂上,统一按照vim来进行讲解。

vi使用

打开和新建文件

vi filename

如果文件已经存在,会直接打开文件

不存在,会新建一个文件

打开文件并且定位行

例如:开始时知道某一行代码有错,就可以快速定位到出错代码的位置

vi 文件名 +行数

提示:如果只带上+而不指定行号,会直接定位到文件末尾

异常处理

如果vi异常退出,在磁盘上可能会保存有交换文件

下次在使用vi编辑文件时可能会出现如下信息,按下字母d可以删除交换文件image-20241011170831562

按下键盘时,注意关闭输入法

行内移动

  • w 向后移动一个单词
  • b 向前移动一个单词
  • 0 回到行首
  • ^ 行首,第一个不是空白字符的位置
  • $ 行尾

行数移动

  • gg 文件顶部,g代表go
  • G 文件末尾
  • 数字gg 移动到数字对应的行
  • 数字G 移动到数字对应的行
  • :数字 移动到数字对应的行

屏幕移动

  • Ctrl+b 向上翻页
  • Ctrl+f 向下翻页
  • H 屏幕顶部
  • M 屏幕中部
  • L 屏幕底部

移动(程序)

vi中使用空行来区分段落

在程序开发时,通常一段功能相关的代码会写在一起,之间就没有空行

  • { 上一段
  • } 下一段
括号切换

在程序世界中,()[]{}三种括号的使用频率是非常高的

  • % 匹配括号,也就是在第一个括号按shift+5可以匹配到对应形成闭合的括号

标记

  • 在开发时,棠一块代码可能需要稍后处理,例如:编辑、查看
  • 此时先使用 m增加一个标记,这样可以 在需要时快速地跳转回来 或者 执行其他编辑操作
  • 标记名称 可以是 az 或者 Az 之间的任意 一个 字母
  • 添加了标记的 行如果被删除,标记同时被删除
  • 如果 在其他行添加了相同名称的标记,之前添加的标记也会被替换掉
命令 英文 功能
mx mark 添加标记x,x是a-z后者A-Z之间的任意一个字母
‘x’ 直接定位到标记x所在位置(飞雷神)

选中文本(可视模式)

  1. 学习 复制 命令前,应该先学会 怎么样选中 要复制的代码
  2. 在 vi 中要选择文本,需要先使用 visual命令切换到 可视模式
  3. vi 中提供了 三种 可视模式,可以方便程序员选择 选中文本的方式
  4. 按 ESC 可以放弃选中,返回到 命令模式
命令 模式 功能
v 可视模式 从光标位置剋是按照正常模式选择文本,就光标划到哪选到哪
V 可视行模式 光标经过的行都会被选中
Ctrl+v 可是块模式 锤石方向选中文本,可以结合移动相关操作使用
ggVG 选中所有内容

vim基本概念

课堂上我们讲解vim的三种模式(其实有好多模式,目前掌握这3种即可),分别是命令模式(command mode)、插入模式(Insert mode)和底行模式弋(last line mode),各模式的功能区分如下:

  • 正常/普通/命令模式(Normal mode)

控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到last line mode·

  • 插入模式(Insert mode)

只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。

  • ·末行模式(last line mode)

文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。在命令模式下,shift+:即可进入该模式。要查看你的所有模式:打开vim,底行模式直接输入

:help vim-modes

我这里一共有12种模式:six BASIC modes和six ADDITIONAL modes.

vim基本操作

  • 进入vim,在系统提示符号输入vim及文件名称后,就进入vim全屏幕编辑画面;

    • $ vim test.c
    • 不过有一点要特别注意,就是你进入vim之后,是处于[正常模式],你要切换到[插入模式]才能够输入文字。
  • [正常模式]切换至[插入模式]

    • 输入a 光标后移
    • 输入i 不变
    • 输入o 新起一行
    • 输入s 但会删除当前光标所在的一个元素
  • [插入模式]切换至[正常模式]

    • 目前处于[插入模式],就只能一直输入文字,如果发现输错了字,想用光标键往回移动,将该字删除,可以先按一下「ESC」键转到[正常模式]再删除文字。当然,也可以直接删除。
  • [正常模式]切换至[末行模式][shift +;」,其实就是输入「:」 退出vim及保存文件,在[正常模式]下,按一下「:」冒号键进入「Last line mode],例如:

    • : w(保存当前文件)
    • : wq(输入「wq」,存盘并退出vim)
    • :q!(输入q!,不存盘强制退出vim)

vim正常模式命令集(重要)

  • 插入模式

    • ·按「i」切换进入插入模式「insert mode]按”井入插入模式后是从光标当前位置开始输入文件;[重
      要]
    • ·按「a」进入插入模式后,是从目前光标d在位置的下一个位置开始输入文字;
    • ·按「o」进入插入模式后,是括入新的一行,从行首开始输入文字。
  • 从插入模式切换为命令模式

    • 按「ESC」键。〔[重要]
  • 移动光标

    • vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母[h]、 [j]、 [k] 、[l],分别控制光标左、下、上、右移一格
    • 按[G]:移动到文章的最后〔重要]
    • 按[$]:移动到光标所在行的”行尾”[重要]
    • 按[^]:移动到光标所在行的“行首”[重要]
    • 按[w]:光标跳到下个字的开头〔重要
    • 按[e]:光标跳到下个字的字尾
    • 按[b]︰光标回到上个字的开头[重要]
    • 按[#]︰光标移到该行的第#个位置,如:5l,56l
    • 按[gg]:进入到文本开始〔[重要]
    • 按[shift+g]︰进入文本末端
    • 按[ctrl]+[b]︰屏幕往”后”移动一页
    • 按[ctrl]+ [f]︰屏幕往”前“移动一页
    • 按[ctrl]+ [u]︰屏幕往”后”移动半页·
    • 按[ctrl] + [d]︰屏幕往”前”移动半页
  • 删除文字

    • .[x] : 每按一次,删除光标所在位置的一个字符〔重要]

    • [#x]︰例如,[6x]表示删除光标所在位置的”后面(包含自己在内)”6个字符

    • .[X] 大写的X,每按一次,删除光标所在位置的“前面”一个字符

    • .[#X]︰例如,[20X]表示删除光标所在位置的“前面”20个字符

    • .[dd]:删除光标所在行[重要]

    • [#dd] :从光标所在行开始删除#行[重要]

    • [yw]︰将光标所在之处到字尾的字符复制到缓冲区中。

    • .[#yw]:复制#个字到缓冲区

    • .[yy]:复制光标所在行到缓冲区。[重要]

    • .[#yy」 :例如,[6yy]表示拷贝从光标所在的该行”往下数”6行文字。

    • [p]︰将缓冲区内的字符贴到光标所在位置。注意:所有与”y”有关的复制命令都必须与”p”配合才能完成复制与粘贴功能。[重要]

  • 替换

    • [r]︰替换光标所在处的字符。
    • .[R ]:香交元粽所至芝媒富拿es,直到接下 [ESC]
  • 销上一次操作

    • [u]∶如果您误执行一个命令,可以马上按下0l
      回到上、个操作。按多次“u”可以执行多次回复。
      [重要]
    • .[ctrl+r]:撤销的恢复「[重要]
  • 更改

    • .[c]:更改光标所在处到字尾处
    • .[c#w]︰例如,[c3w]表示更攻个字
  • 跳至指定的行

    • [ctrl] + [g]: 列出光标所夺行的接往号。[重要]
    • [#G]︰例如,[15G],表示移动光标至文章的第15行行首。

vim末行模式命令集

在使用末行模式之前,请记住先按「ESC」键确定您已经处于正常模式,再按「:」冒号即可进入末行模式。

  • 列出行号
    • [set nu] :输入[set nu]后,会在文件中的每一行前面列出行号。[重要]跳到文件中的某一行
    • [#] :[#]号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再
      回车,就会跳到文章的第15行。
  • 查找字符
    • [/关键字]∶先按[/]键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按[n]会往后寻找到您要的关键字为止。
    • [?关键字]︰先按[?]键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按[n]会往前寻找到您要的关键字为止。
    • 问题:/和?查找有和区别?操作实验一下
  • 保存文件[重要]
    • .[w]:在冒号输入字母[w]就可以将文件保存起来
  • 离开vim[重要]
    • [q]︰按[q]就是退出,如果无法离开vim,可以在「q」后跟一个[!]强制离开vim。
    • .[wq] :一般建议离开时,搭配[w]一起使用,这样在退出的时候还可以保存文件。
  • 两个桌面光标切换
    • 按住CTRL +两下w
  • !+gcc/man等命令
    • 例如!gcc test.c

vim操作总结

  • 三种模式

    • 正常模式
    • 插入模式
    • 底行模式
  • vim操作

    • 打开,关闭,查看,查询,插入,删除,替换,撤销,复制等等操作。

简单vim配置

[自动配置][https://github.com/askunix/VimForCpp]

保证自己联网的情况下,命令行直接运行,一键部署

curl - sLfhttps://gitee,conHGtz2222/vimForcpp/raw/master/insta1l.sh -o ./insta11.sh && bash./install.sh

配置文件位置

  • 在目录/etcl下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。
  • 而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为: “.vimrc”。例如,/root目录下,通常已经存在一个.vimrc文件,如果不存在,则创建之。
  • 切换用户成为自己执行su,进入自己的主工作目录,执行cd ~
  • 打开自己目录下的.vimrc文件,执行vim .vimrc

常用配置选项,用来测试

  • 设置语法高亮: syntax on
  • 显示行号: set nu
  • 设置缩进的空格数为4: set shiftwidth=4

使用插件

要配置好看的vim,原生的配置可能功能不全,可以选择安装插件来完善配置,保证用户是你要配置的用户,接下来:

  • 安装TagList插件,下载taglist_xx.zip ,解压完成,将解压出来的doc的内容放到/.vim/doc,将解压出来的plugin下的内容拷贝到l.vim/plugin
  • 在~/.vimrc中添加: let Tlist_show_one_File=1(let Tlist_Exit_on1ywindow=1) letTlist_use_Right_window=1
  • 安装文件浏览器和窗口管理器插件: WinManager
  • 下载winmanager.zip,2.x版本以上的
  • 解压winmanager.zip,将解压出来的doc的内容放到/.vim/doc,将解压出来的plugin下的内容拷贝到/ .vim/plugin
  • 在~/.vimrc中添加let g:winManagerwindowLayout=‘FileExplorer|TagListnmap wm: wMToggle
  • 然后重启vim,打开/XXX.c或/XXX.cpp,在normal状态下输入”wm”,你将看到上图的效果。更具体移步:[点我][https://blog.csdn.net/wooin/article/details/1858917],其他手册,请执行vimtutor命令。

[vim参考资料][https://github.com/wsdjeg/vim-galore-zh_cn]

ubuntu中安装git

sudo apt-get install git
(base) youzipii@youzipii-virtual-machine:~$ git
usage: git [--version] [--help] [-C <path>] [-c name=value]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
<command> [<args>]

Linux编辑器-gcc/g++使用