欢迎光临散文网 会员登陆 & 注册

Linux学习笔记——进阶命令篇

2023-03-08 16:58 作者:Vh暖夏  | 我要投稿

**Linux进阶命令

*重定向 > 或 >>

将输出的屏幕的数据,重定向到一个指定位置(一般是指定一个文件),不管指定的文件是否存在,

都会创建新文件保存数据。(上面写的新建文件type nul > 1.txt 就是这个原理)

e.g: 

ls > 1.txt —— 把ls的内容输出到1.txt文件上(再次执行会覆盖,相当于python的open('w'))

ls >> 1.txt —— 在1.txt中追加ls的内容(相当于open('a'))

合并文件:

cat 1.txt 2.txt > 3.txt 把1.txt和2.txt内容合并到3.txt中


*管道(|)命令

一个命令的输出可以通过管道作为另一个命令的输入,可以理解成是一个容器,存放在终端显示的内容

e.g: 

ls -l | more 把ls -l显示的数据放到管道里,再用more作用于管道里的这些数据


*软链接与硬链接

类似于Windows下的快捷方式,当一个源文件的目录层级比较深,要想方便使用它可以给源文件一个链接

软连接:

a. 软链接无论更改源文件还是链接文件内容,都会更改文件内容

b. 软链接是链接文件链接到某个文件的绝对路径,而不管是不是这个文件,只要是这个名即可(如1.txt连接到2.txt,此时删了2.txt,再新建一个2.txt,这个1.txt一样能链接到新的2.txt)

c.软链接的原文件最好写绝对路径(不要写类似./xx/xx的相对路径,应把.换成.再往上的路径一直到根写下来才算绝对路径),防止链接失效

e.g :

ln -s (待链接(原)文件绝对路径)(链接文件文件名(不写绝对路径默认链接到当前目录))————同理,文件夹也可链接


硬链接 —— 指向同一块磁盘上数据的文件的引用

a. 硬链接只能链接文件,不允许对目录做硬链接

b. 硬链接不受路径影响

c. 硬链接会保持数据同步

d. 硬链接会改变文件属性信息中的链接数(文件属性信息即ls -l可以查看(文件权限和user中间的数字即为硬链接数))

e.目录的文件信息中的链接数表示当前目录下包含多少子目录


*文件内容搜索命令:grep(内含正则表达式详解)

grep '(要查找的内容)' (被查找的文件) —— 与查找内容完全一致

grep -i '' file —— 忽略大小写查找

grep -n '' file —— 显示匹配行号

grep -v '' file —— 显示不包含匹配文本的所有行

其中,指令前的-和要查找的内容两边的''可省略

-i、-n、-v可以混合使用,e.g : -in —— 忽略大小写且匹配行号查找


用正则表达式匹配查找:

^ —— 以指定字符串开头

$ —— 以指定字符串结尾

. —— 匹配任意一个字符(除换行符外)

e.g:

grep -in '^h' a.txt —— 把在a.txt以h开头的行忽略h大小写且匹配行号查找出来(^写在h前面)

grep -in 'h$' a.txt —— 以h结尾的查找出来(注意$写在h后面)

grep -in 'he.llo' a.txt —— 假如a.txt里有he1llo、he2llo、he3llo,那么都能打印出来

grep -in 'abc.' a.txt —— 若一行中包含abc.(.可以是任意字符)这个字符串,就把它打印出来

综合使用:设有a.txt内有6行字符串(12, a1, a1a1, a2, adsd, basd)

1.想查找一行只有两个字符且开头结尾为a.的

grep -in '^a.$' a.txt --- a1、a2

2.想查找一行只有两个字符的

grep -in '^..$' a.txt --- 12、a1、a2

所以,^$中间夹着多少个字符就规定了查找以多少个字符为一行的


进阶使用 —— grep 与 管道 结合

e.g1:查看某进程是否已开启

先了解一个命令:ps aux —— 查看当前Linux所有进程(若以后学习了mysql后,如果运行了mysql程序,ps aux会显示出mysql正在进程中,所以若要快速查看是否已经运行了mysql程序,则可用grep与管道结合来查找)

ps aux | grep mysql ('mysql'的''可以省略写,上面也说过)

其实这就相当于:

ps aux > b.txt

grep mysql b.txt

e.g2:查找某个在控制台敲过的命令历史

history | grep find —— 查找所有已执行过的find命令历史记录



*查找文件命令:find —— 在指定目录下查找文件(包括目录)

格式:

find 被查找的文件(这样默认当前目录,且查找结果不以./开头)

find 查找路径 -name 被查找的文件(查找结果以/开头)

Tips:在查找时,查找的范围包含“查找路径”及其下的子目录


通配符:* —— 可包含多个字符、? —— 只包含一个字符(使用通配符时最好加上'')

e.g:

find . -name '*基础*.txt' —— 查找当前目录及其子目录下的含“基础”的txt文件(可找到1.基础班.txt)

find . -name 'a?.txt' —— 查找a?的txt文件,可能是a1.txt、a2.txt……反正问号只代表一个字符

find . -name '?.txt' —— 查找以一个字符命名的所有txt文件

find / -name '*.txt' —— 从根目录下(全盘搜索)查找所有txt文件


其他用法:

find xxxxxxx -delete —— 查找到某些后,全部删除 e.g:find -name '?.txt' -delete

find . -size +4k —— 查找当前目录下大于4k的文件(换成-4k就是查找小于4k的文件)

find . -regex '^.$'.txt —— 运用正则表达式(正则在grep一节已详解)查找以一个字符命名的文件


*压缩(.zip、.gz、.bz2)和打包(tar) —— (其中.bz2的“2”读two)

压缩与解压缩:

zip:

zip (压缩包文件名) (要压缩的文件)—— 压缩成.zip格式文件

e.g: 

压缩:zip sql.zip *.sql

解压缩:unzip sql.zip

.gz:

e.g:

压缩:gzip 1.txt -> 1.txt.gz

解压缩:gzip -d 1.txt.gz -> 1.txt

.bz2:

压缩:bzip2 1.txt -> 1.txt.bz2

解压缩:bzip2 -d 1.txt.bz2 -> 1.txt


打包与解包:

格式:tar 参数 包名 被打包的文件

-c 创建.tar打包文件

-v 打印打包或解包的详细信息到控制台

-z 压缩或解压缩(.gz)

-j 压缩或解压缩(.bz2)

-x 解包

-f 指定文件名称,必须放到所有选项的后面,后面跟的是包名

-C 解包/解压缩到指定目录 —— 此参数解包/解压缩时用才奏效,压缩时不能用

e.g:

打包:tar cvf 1.tar 1.txt 2.txt -> 1.tar

(f参数必须放到所有参数后面)

(由于有v参数,故在控制台显示1.txt、2.txt这样的信息)

(打包不是压缩,文件大小大约是1.txt和2.txt的字节数之和)

(打包后,可以用以上学的gz、bz2压缩命令进行压缩得到1.tar.gz或1.tar.bz2)

解包:tar xvf 1.tar(-C 解包到指定目录) -> 1.txt 2.txt 

(其中-C不写默认解包到当前文件夹)

(若该文件夹下已有1.tar所打包的文件,如已有1.txt(与1.tar中的1.txt内容不一致),那么执行此命令会覆盖该1.txt,只会保留1.tar解包出来的1.txt)

tar zcvf 1.tar.gz

打包加压缩:tar czvf 1.tar.gz 1.txt 2.txt

(tar cjvf 1.tar.bz2 1.txt 2.txt)—— 用bzip2压缩

解包加解压缩:tar xzvf 1.tar.gz -C 指定解压缩目录

(tar xjvf 1.tar.bz2 -C 指定解压缩目录)—— 用bzip2解压

(其中-C不写默认解压到当前文件夹)


*权限与权限管理

字母法权限管理 —— rwx

按顺序为:-文件类型 (d代表文件夹)rwx文件所有者权限(u(user))r-x文件所有者所属组用户权限(g(group))r-x其他用户权限(o(other))

id 用户名 —— 查看当前用户所属用户编号、主组且主组编号、(主组, 次组1, 次组2)

r ——  read 读取权限(可读)

w —— write 写入权限(可写)

x —— exeute 执行权限(可执行)

- —— 占位符  无权限

a —— all 表示所有用户

chmod —— 修改权限

+ —— 增加权限

- —— 撤销权限

= —— 设置权限

用ls -l 可以查看文件权限

e.g:-rw-r--r-- 1 Vh 197121 16 Mar  3 22:40 1.txt

详解如下:

-rwxr-xr-x(文件权限(代表user拥有所有权限,group和other没有写入权限)) 1(硬链接数) Vh(user) 197121(组编号) 16(文件大小16字节) Mar 3 22:40(3月3日22:40) 1.txt(文件名)

修改权限:

e.g:

chmod g-x,o-x,u-w 1.txt —— 为group和other撤销执行权限,user撤销写入权限(注意,要连着写时,逗号后不能习惯性地加一个空格)

于是以上变成-r--r--r--,都只能读,不能写

但是user还是可以写入,因为有一个:wq!强制保存功能,但是group和other:wq!也不能保存了

chmod a+x 1.txt —— user、group、other都加上权限x

chmod a=--- 1.txt —— 所有权限撤销 —— ----------

chmod a=rx 1.txt —— 所有加上r和x权限 —— -r-xr-xr-x


数字法权限管理 —— rwx可以用数字代替

r —— 4 —— 2**2

w —— 2 —— 2**1

x —— 1 —— 2**0

- —— 0

rwx —— 7 —— 4+2+1

r-x —— 5 —— 4+1

e.g:

chmod 6 1.txt —— -------rw-

chmod 66 1.txt —— ----rw-rw-

chmod 666 1.txt —— -rw-rw-rw

chmod 777 1.txt —— -rwxrwxrwx

chmod 000 1.txt —— ----------

chmod 700 1.txt —— -rwx------


对文件夹的权限限制:

chmod 111 folder —— 只能执行cd folder,但不能读写

chmod 555 folder —— 可读可执行cd folder 后还可用ls读,但不能touch或rm之类的写操作


文件和目录的默认权限:

文件默认权限是755

目录默认权限:775

(可能不同的版本linux有差别)


*获取管理员权限

一般来说,程序员在操作Linux都是用一个权限比较低的用户去操作的,避免写错命令直接误删系统文件

如果使用这个低权限用户时,有些操作权限不够(提示Permission denied或xx权限不够),可临时借用管理员权限

e.g:

sudo find / -name *.sql

如果大量操作都需要管理员权限,懒得写sudo,则可切换到管理员root身份

sudo -s —— 切换后操作需谨慎!

退出管理员身份,切换回原身份

exit

已经在原身份,再次执行exit,会退出控制台


如果不知道现在自己是什么身份,可用whoami命令查看(一般这个在sh环境中运行才要用到,在bash中则会自动显示 —— vh@ubantu:)

whoami应用场景举例:

假如小明今天上班在机房维护电脑,下班了忘了退出登陆,第二天小明休息,换小亮维护电脑,那么小亮可以用whoami查询现在登陆的是哪个用户,若发现不是自己的用户,退出他的登自己的即可


*用户管理

先学基础:

①新建用户的主目录在/home默认(使用了-m选项)在下,其内容是原封不动拷贝/etc/skel目录的(skel即skeleton(框架、骨架))

这种机制的应用场景:

如果我是多用户系统管理员,那么可在skel目录下写一个ReadMe.txt的介绍,那么以后的新建用户都可看到我的自我介绍。或者在.bashrc文件中加入一些方便的环境变量或者命令别名,这样每个新建用户都可以使用这些功能。不过,更好的选择是把这些设置放到全局的 /etc/profile 中, skel 目录下的文件是拷贝过去的,如果你修改或者增加了新的文件,只有新建的用户才能使用,老用户是无法使用的。

②/etc/passwd文件中记录了所有用户信息,以

vh:x:1000:1000:Vh,,,:/home/vh:/bin/bash

jack:x:1001:1001::/home/jack:/bin/sh    为例

可见,每条信息都用:隔开。格式如下:

用户名:密码的占位符x:用户uid:所属组gid:备注(全名,房间号码,工作电话,家庭电话,其他):用户登录所使用的shell(用户的命令环境)(有bash和sh两种)

③/etc/shadow(要用sudo权限查看)文件中记录了所有用户的密码,密码用md5加密(md5是一种不可逆的加密方式,即使明文相同,但每次加密结果也不同)

④/etc/group文件中记录了所有组的名字与组编号(所属该组的用户不会在内)格式如下:

用户组名:用户组密码占位符(一般Linux系统的用户组都没有密码):组id

⑤/etc/gshadow(要用sudo权限查看)文件中记录了各个组的一些基本信息介绍

以上的文件都可以用vi进行修改,运用命令只是一种帮我们快速把这些信息写进相应的文件的一个快捷方式


添加用户:

adduser —— 傻瓜式添加用户,以提示信息诱导添加用户密码、备注等,shell默认/bin/bash

useradd —— 以可选命令的方式添加用户

(假设useradd添加用户A,那么会自动编一个组命名为A,且用户A加入了A组(即在/etc/group文件写入一个组名为A的组,然后用户A加了进去,那么用户A的主组就是A组)) —— 主组次组会在用户组管理谈到

以下是useradd的常用选项介绍:(更多请查看useradd -h)

-M 强制不创建用户主文件夹(家目录)

(不写-m时默认也是不创建用户主文件夹)

(若创建的用户没有家目录,则会以HOME=/登录)

-m 在/home创建一个以该用户名命名的文件夹,其中内容拷贝的是/etc/skel的内容

-d 设置该用户主文件夹路径(格式:-m 用户名 -d /路径/主文件夹名)(与-m一起使用才有效)

-c 为用户加上备注(会将此备注文字加在/etc/passwd中的第5项字段中)

-s 指定用户登录所使用的shell —— 不写默认/bin/sh(sh的shell非常不方便,上下键似乎不能自动填充执行过的命令且其终端只有一个$,不能显示vh@ubantu:/etc这样的字样,所以最好设置为/bin/bash,或在/etc/passwd文件把该用户/bin/sh修改为/bin/bash也行)

-g 设定主组。指定用户所属的主要组,默认不指定会自动创建一个同名的组,且其所属主组就是这个同名的组

-G 设定次组。设置用户所属的次要组(可设置多个,格式:useradd -G cizu1,cizu2,cizu3)

-p 设置密码

(还未摸清这个参数的用法,这个直接设是一个明文密码且无效,所以不建议用这个设置密码,而是用以下说的方法)

-e 有效期限。指定帐号的有效期限。格式为YYYY-MM-DD,将存储在/etc/shadow

-f 缓冲天数。限定密码过期后多少天,将该用户帐号停用


查看用户信息:

id 用户名 —— 查看当前用户所属用户编号、主组且主组编号、(主组, 次组1, 次组2)

(系统用户编号一般在1000以内,自己创建的一般在1000以上)


设置密码:

设置他人用户密码:

创建用户后,用“sudo passwd (用户名)”的命令来设置或更改该用户的密码(若密码太短或太简单,会有报错提示,但不管他,正常输两次密码即可设置成功)

设置自己的密码:

passwd即可

设置root的密码:

sudo passwd


切换用户:

格式:su - 目标用户 

(若写-,切换后就到目标用户的家目录,若省略-,则切换后还是在切换前的目录)

(回车后会提示输入密码,输入的是目标用户的密码)

(这种切换是在当前用户临时进入目标用户,不是真正进入,所以切换后再exit会回到当前用户)

(若目标用户没有设置密码,则不能切换,会显示su:认证失败)

(在实验中发现,su - root提示su:认证失败,然后sudo passwd设置密码后发现可以切换,所以root应该是默认无密码的)

(su - root切换过去后pwd显示/root说明/root就是root的家目录,而用su root切换过去的效果与sudo -s的效果一致,只不过sudo -s不需要每次都输入密码(有一个缓存时间,可能输过一次后10分钟内就不需要再输,可直接切换过去)

(若切换了多次,则exit是一层层退出来。e.g:vh切到rose再切到jack,那么exit一次是回到rose,再exit才回到vh)


删除用户:

userdel -r 用户名(假设是jack)

(不加-r的话只删除用户,不删除主目录,则会导致/home中多了一个jack的垃圾文件夹)

(运行-r可能会有报错,说邮件池未找到或者其他的什么,没关系的,因为userdel只是帮我们走了一遍删除流程,所谓的删除流程就是上面“先学基础”中说的那几个文件,若在某文件中找不到关于这个用户的信息(可能手动删了,可能未生成),就会报错,但-r是肯定能把用户删除干净的)


*用户组管理

先学基础:

主组与次组:

每个用户都必须有一个主组,假如创建用户A没有用-g设定主组,那就会以自己的名字创建一个新组A,然后自己加入这个A组。假如已经存在了某些组,那么创建用户时使用-g参数可以指定这个用户的主组,使用-G参数可以指定这个用户的次组,次组可设定多个,格式上面已说

创建组:

sudo groupadd 组名

删除组:

sudo groupdel 组名

(注意删除组时不能有任何一个用户的主组是这个组,否则会报错,要删除相关的用户后才能删除这个组,但是若这个组只是某些用户的次组,则无所谓,可以直接删除)


*远程操作ssh和scp

通过ssh可以让客户端电脑远程操作Linux服务器

方法:

1.服务器端下载一个ssh服务端软件,sudo apt-get install penssh-server

(需在线安装,如果Linux虚拟机不能联网,可查看Else_Notes的“运行”笔记)

2.客户端如果是windows系统,则需安装OpenSSH for Windows这个软件(可以先查看C:\Windows\System32\OpenSSH是否存在,若存在则不用再下载),mac电脑默认已经下载。

3.然后Linux服务端(假设用户名为vh)打开终端输入ifconfig查看ip地址

(ip地址看的是inet6的,可能写成fe80::1cf4:cc55...的样子,也可复制下来使用,或它下一行那个inet 192.168.13.54也可以复制使用)

(如果Linux是虚拟机,则需把NAT模式改为桥接模式,因为NAT模式是虚拟的ip,桥接模式才是一台真正的电脑ip)

4.客户端打开终端输入ssh vh@ip地址,然后等待两秒再输入yes即可连接成功,就可以在客户端电脑操作Linux服务器了


通过scp可以在客户端和服务器端互传文件:

客户端传文件给服务器端:(上传)

scp a.txt vh@ip地址:/服务器的某路径

服务器端传文件给客户端:(下载)

sudo scp vh@ip地址:/a.txt .(这个点是下载到客户端的当前位置)

(要输入两次密码,第一次输入的是客户端的密码,第二次输入的是服务器端的密码)


FileZilla软件的使用:

FileZilla是一个免费开源的FTP软件,使用可视化方式进行上传和下载文件,以后可以通过FileZilla来代替scp命令

(是一个可视化的软件,粘贴ip和密码连接好了就可以直接拖动文件的方式进行上传和下载了)

(要注意的是,这个软件显示的服务器端的/不是真正服务器端的/,而是在/var/ftp/shared)


*软件安装和卸载

学习目标:能够使用apt-get命令安装软件


软件安装介绍:

Ubuntu软件安装有两种方式:

1.离线安装(deb文件格式安装)

dpkg -i 包名 —— 安装deb安装包(i指install)

dpkg -r 包名 —— 卸载deb安装包(r指remove)

2.在线安装(apt-get方式安装)—— 主要用于在线从互联网的软件仓库中搜索、安装、升级、卸载软件。


命令格式:

sudo apt-get(现在已经整合为直接apt也行了) install 安装包名(大概记得即可,有则会提示),表示在线安装deb安装包


更改镜像源:—— 镜像源就是下载软件来源的服务器

因为使用apt-get命令默认是从国外的服务器下载安装软件的,会导致下载安装速度很惶,所以需要更改成国内的镜像源服务器

镜像源更改方式:

1.图形界面操作更改:打开设置,打开软件和更新,选择主服务器为阿里或清华源,然后要输密码,然后输完了会弹出可用软件的列表信息已过时,按重新载入即可。

2.命令操作更改:打开清华软件镜像源mirrors.tuna.tsinghua.edu.cn网页,找到ubuntu然后点击它旁边的小问号,进入后选择想要的版本,然后复制下面框框中的所有文本,然后到终端把/etc/apt/sources.list文件内容全部更改为刚复制的(最好先备份一下sources.list),然后sudo apt update更新以下源(这个命令相当于上面图形界面处理的“重新载入”)。然后就可以使用sudo apt install 安装包名安装软件了


apt-get命令汇总:(以下apt-get均省略为apt)

sudo apt update —— 更新软件源

sudo apt upgrade —— 更新升级所有软件包

sudo apt upgrade 包名 —— 更新某个软件包

sudo apt list --upgradable —— 列出可更新的软件

sudo dist-upgrade —— 升级系统版本(Ubuntu的升级)

sudo apt install 包名 —— 安装一个软件包

sudo apt remove 包名 —— 删除一个软件包

sudo apt help —— 列举其他apt-get命令


Linux学习笔记——进阶命令篇的评论 (共 条)

分享到微博请遵守国家法律