实验楼-Linux(ubuntu)
1. Linux
的桌面系统
2. 命令 --help
- 显示更为简单的内容
软/硬连接:ln
-
硬连接
ln 目的地 硬连接名称
- 硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
-
软连接
ln -s 目的地 软连接名称
- 软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
3. whoami
和who am i
用户及文件权限管理
-
常用命令
sudo 命令
:以特权级别运行命令,需要当前用户属于sudo
组,且需要输入当前用户的密码,而不是超级账户的密码。不过有时间限制,Ubuntu默认为一次时长15分钟sudo -i
: 为了频繁的执行某些只有超级用户才能执行的权限,而不用每次输入密码,可以使用该命令。提示输入密码时该密码为当前账户的密码。没有时间限制。执行该命令后提示符变为“#”而不是“$”。想退回普通账户时可以执行“exit”或“logout” 。su username
:切换到该用户,需要输入目标用户的密码(与下面不同的是,切换至该用户并不会切换至该用户的家目录),普通用户切换到root用户,可以使用su -- 或su root,但是必须输入root密码才能完成切换。root用户切换到普通用户,可以使用su username
,不需要输入任何密码即可完成切换。su - username
或者su -l username
: 命令也是切换用户,但是同时用户的环境变量和工作目录也会跟着改变成目标用户所对应的。su passwd username
:该命令可以给指定的用户设置密码
-
创建用户
-
sudo useradd lilei
:此种直接创建一个用户(没有密码和用户目录),是没有办法用来登录或者su
切换用户的(centos6就可以),需要我们手动为该用户设置密码sudo passwd lilei
,输入两次密码就可以正常登录和切换用户了 -
上述步骤用
useradd
命令执行起来很麻烦(需要创建用户后设置用户密码和用户主目录),我们可以采用adduser
,自动执行创建用户,密码,主目录的操作 -
用户配置文件
/etc/passwd
:记录用户的各种信息,可以用来查看所有用户cat /etc/passwd
-
用户密码配置文件
/etc/shadow
:保存用户的登录密码,但是文件内部做了加密,密码不支持显示
-
-
用户组
-
概念
- 在 Linux 里面每个用户都有一个归属(用户组),用户组简单地理解就是一组用户的集合,它们共享一些资源和权限,但是同时也拥有用户自己的私有资源,就跟家的形式差不多,你的兄弟姐妹(不同的用户)属于同一个家(用户组) ,你们可以共同拥有这个家(共享资源),爸妈对待你们都一样(共享权限),你偶尔写写日记,其他人未经允许不能查看(私有资源和权限)。当然一个用户是可以属于多个用户组的,正如你既属于家庭,又属于学校或公司。
-
groups username
:来查看用户属于哪个组-
-
既然只有
sudo
组的用户可以使用sudo
权限,那么用户shiyanlou
是如何使用sudo
权限来创建用户lei
的呢?- 可以查看下
/etc/sudoers.d/shiyanlou
文件,我们在/etc/sudoers.d
目录下创建了这个文件,从而给shiyanlou
用户赋予了sudo
权限
- 可以查看下
-
-
id username
:该命令也可以查看用户属于那个组,只不过信息更详细 -
修改用户的所在组
- usermod -g 用户组 用户名
-
cat /etc/passwd
:显示所有的用户和用户组 -
将其他用户添加至
sudo
用户组-
默认情况下,我们添加的用户是不在
sudo
组的,但是我们可以将用户添加到sudo
分组 -
usermod
可以把用户添加到用户组,但是使用该命令必须要有root
权限,我们可以切换至root
账户或者使用sudo usermod username
,当然我们也可以采取修改/etc/sudoers
文件,但是不推荐,但是cenos6只能这么操作sudo usermod -G sudo username
-
-
删除用户
sudo userdel username
:删除用户sudo userdel username --remove-home
:删除用户和用户的家目录
-
删除用户组
-
sudo groupdel groupname
:删除用户组(该用户组必须是空的)
-
-
-
-
文件权限
-
概念
- 在 Unix/Linux 中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录。
-
查看文件权限
-
图示
-
-
变更文件所有者
chown
sudo chown shiyanlou iphone
:把iphone文件的所有权改为shiyanlou
-
变更文件读写权限
chmod
-
- 可见文件的执行权限决定了文件在
shell
中的颜色 - 通过三个数字
600
来决定文件所属用户,同组用户,其他用户的权限
- 可见文件的执行权限决定了文件在
-
-
目录结构和和文件基本操作
-
目录结构
- FHS:英文:Filesystem Hierarchy Standard 中文:文件系统层次结构标准
-
文件基本操作
- 标准输入输出:当我们执行一个 shell 命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),默认对应终端的键盘、标准输出文件(stdout)和标准错误输出文件(stderr),后两个文件都对应被重定向到终端的屏幕,以便我们能直接看到输出内容。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。
less
:该命令功能和more
一样,但是支持vim
的操作,但是more
就不支持vim
操作
环境变量和文件搜索
-
变量
-
引入
- 理解环境变量,首先需要知道什么是变量,该变量又称私有变量或者本地变量
-
特点
- 该变量只与当前shell有关系,子进程都不能访问变量
-
声明变量
declare 变量名
:创建变量,当然也可以不使用declare
来声明,但是后续数组的时候必须使用declare
-
变量赋值
变量名=hello
:=
左右两侧不能有任何空格,否则直接报错
-
获取变量值
$变量名
-
-
-
引入
- 环境变量又称为用户变量,只跟用户有关,跟
shell
没有关系
- 环境变量又称为用户变量,只跟用户有关,跟
-
特点
- 该变量只与用户有关,只要是该用户登录的
shell
都可以访问
- 该变量只与用户有关,只要是该用户登录的
-
三个显示不同范围的环境变量
-
set 显示当前 Shell 所有变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量。
-
env 显示与当前用户相关的环境变量,还可以让命令在指定环境中运行。
-
export 显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量
-
图示
-
-
那么哪些变量是环境变量,可以简单地理解成在当前进程的
子进程
有效则为环境变量,否则不是 -
环境变量永久生效
-
我们即使使用
export
关键字将本地变量转为环境变量,但是当我们关闭shell
的时候,环境变量就消失了 -
两种方法
-
临时性的
- 使用
export
命令行声明即可,变量在关闭shell
时失效
- 使用
-
补充:linux下的/etc/profile、/etc/bashrc、/.bash_profile、/.bashrc文件
-
分类
-
/etc/profile
-
-
如果你有对 /etc/profile 有修改的话必须得 source 一下你的修改才会生效,此修改对每个用户都生效。(因为该文件只会在用户第一登录的时候执行,所以要想生效,必须source,重开一个终端是没有用的)
-
但是ubuntu18实验的实验结果就是,即使修改了/etc/profile中的环境变量,要想生效,必须登录后手动source,即使你刚登陆,/etc/profile也不会自动生效的
-
但是centos不使用source,直接重新打开一个终端就行了,这个效果是跟实验楼的机器得到效果是一样的,当然手动source也是可以的
- 但是在centos中source后需要关闭当前shell,重新开启一个shell就可以看到更改,直接在原来的shell进行source,发现没有做出任何更改
- 但是在实验楼中source后直接生效
-
-
-
/etc/bashrc(ubuntu为 /etc/bash.bashrc)
- 为每一个运行 bash shell 的用户执行此文件。当 bash shell 被打开时,该文件被读取。如果你想对所有的使用 bash 的用户修改某个配置并在以后打开的 bash 都生效的话可以修改这个文件,修改这个文件不用重启,重新打开一个 bash 即可生效。
- Ubuntu没有此文件,与之对应的是/ect/bash.bashrc。
-
~/.bash_profile(ubuntu为 ~/.profile)
- 每个用户都可使用该文件输入专用于自己使用的 shell 信息,当用户登录时,该文件仅仅执行一次!默认情况下,它设置一些环境变量,执行用户的/ .bashrc 文件。 此文件类似于 /etc/profile,也是需要需要 source 才会生效,/etc/profile 对所有用户生效,/.bash_profile 只对当前用户生效。
- ~/.profile(由Bourne Shell和Korn Shell使用)和.login(由C Shell使用)两个文件是.bash_profile的同义词,目的是为了兼容其它Shell。
-
~/.bashrc
- 该文件包含专用于你的 bash shell 的 bash 信息,当登录时以及每次打开新的 shell 时,该文件被读取。(每个用户都有一个 ~/.bashrc 文件,在用户目录下) 此文件类似于 /etc/bashrc,不需要重启就可以生效,重新打开一个 bash 即可生效,/etc/bashrc 对所有用户新打开的 bash 都生效,但 ~/.bashrc 只对当前用户新打开的 bash 生效。
- ~/.bashrc文件会在bash shell调用另一个bash shell时读取,也就是在shell中再键入bash命令启动一个新shell时就会去读该文件。这样可有效分离登录和子shell所需的环境。但一般 来说都会在/.bash_profile里调用/.bashrc脚本以便统一配置用户环境。
-
~/.bash_logout:
- 当每次退出系统(退出 bash shell)时,执行该文件。可把一些清理工作的命令放到这文件中
-
~/.bash_history
- 是bash shell的历史记录文件,里面记录了你在bash shell中输入的所有命令。可通过HISSIZE环境变量设置在历史记录文件里保存记录的条数。
-
-
执行顺序
-
①在刚登录Linux时(此阶段执行的两个文件都是在登录时执行)
-
首先启动 /etc/profile 文件,
-
- 其中~/.bash_profile、 ~/.bash_login和 ~/.profile文件往往只存在一个,这与Linux的发行版本有关。centos中为 ~/.bash_profile,ubuntu则为 ~/.profile。
-
-
-
②下面开始执行用户的bash设置
- 最后,在退出shell时,还会执行 ~/.bash_logout文件。
-
总结执行顺序
- /etc/profile
- ~/.bash_profile | ~/.bash_login | ~/.profile
- ~/.bashrc
- /etc/bashrc
- ~/.bash_logout
-
-
-
永久性的
-
- 在
~/.profile
中配置export
语句:只对当前用户生效 - 在
/etc/profile
中配置export
语句:对所有的用户生效(在根目录)
- 在
-
-
-
-
添加自己的命令到
PATH
环境变量-
方法1:
-
$ PATH=$PATH:/home/shiyanlou/mybin
:在用户shiyanlou
的主目录下创建mybin
文件夹,然后在该文件夹里面写好自己的命令(可执行文件:shell
脚本,编译的二进制文件)
-
-
方法2:
-
在每个用户的
home
目录中有一个Shell
每次启动时会默认执行一个配置脚本,以初始化环境,包括添加一些用户自定义环境变量等等.-
不同的
shell
有着不同的配置文件(他们在 etc 下还都有一个或多个全局的配置文件,不过我们一般只修改用户目录下的配置文件)zsh
--->~/.zshrc
bash
--->~/.bashrc
-
-
我们可以直接修改
~/.zshrc
文件:echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
-
-
-
修改变量和删除变量
-
修改变量
-
引入
- 如上所示,我们在
PATH
变量中增加了~/mybin
,现在我们需要删除这个增加的路径,我们怎么修改呢
- 如上所示,我们在
-
修改方法
${变量名#匹配字串}
: 从头向后开始匹配,删除符合匹配字串的最短数据${变量名##匹配字串}
: 从头向后开始匹配,删除符合匹配字串的最长数据${变量名%匹配字串}
: 从尾向前开始匹配,删除符合匹配字串的最短数据${变量名%%匹配字串}
: 从尾向前开始匹配,删除符合匹配字串的最长数据${变量名/旧的字串/新的字串}
: 将符合旧字串的第一个字串替换为新的字串${变量名//旧的字串/新的字串}
: 将符合旧字串的全部字串替换为新的字串
-
示例:修改在末尾增加了路径的
PATH
变量-
- 为了防止删除错误导致系统崩溃,我们可以先用一个变量来接收当前
PATH
变量的值
- 为了防止删除错误导致系统崩溃,我们可以先用一个变量来接收当前
-
- 然后我们使用
${变量名%匹配字串}
来满足我们的要求:从尾向前开始匹配,删除符合匹配子串的最短数据
PATH=${PATH%/home/shiyanlou/mybin}
- 然后我们使用
-
-
-
变量删除
-
unset 变量名
:删除变量unset mypath
-
-
-
如何让修改配置文件后立刻生效
-
引入
- 我们在
Shell
中修改了一个配置脚本文件之后(比如zsh
的配置文件home
目录下的.zshrc
),每次都要退出终端重新打开甚至重启主机之后其才能生效,很是麻烦
- 我们在
-
source 配置文件
source ~/home/shiyanlou/.zshrc
-
-
-
文件搜索
-
whereis
简单快速- 这个搜索很快,因为它并没有从硬盘中依次查找,而是直接从数据库中查询。
- 只能搜索二进制文件(-b),man 帮助文件(-m)和源代码文件(-s)。如果想要获得更全面的搜索结果可以使用
locate
命令
-
locate
快而全-
使用
locate
命令查找文件也不会遍历硬盘,它通过查询/var/lib/mlocate/mlocate.db
数据库来检索信息,数据库通过系统每天自动执行updatedb
来更新数据库,但是locate
命令并不是内置命令,需要使用apt
来安装这个命令$ sudo apt-get update $ sudo apt-get install locate # 先执行 updatedb 命令 $ sudo updatedb # 查找/usr下查找包含sh的文件 $ locate /usr/sh
-
-
which
短小精悍- which 本身是 Shell 内建的一个命令,我们通常使用 which 来确定是否安装了某个指定的程序,因为它只从 PATH 环境变量指定的路径中去搜索命令并且返回第一个搜索到的结果
-
find
最强大- 该命令是四个命令中最为强大的命令,用法及其复杂,我们可以在实际使用中去学习该命令的使用
-
-
whatis
:查看命令的简单描述
文件系统操作和硬盘管理
-
- 对于 IDE 硬盘,驱动器标识符为“hdx”,其中“hd”表明分区所在设备的类型,这里是指 IDE 硬盘了。“x”为盘号(a 为基本盘,b 为基本从属盘,c 为辅助主盘,d 为辅助从属盘),“”代表分区,前四个分区用数字 1 到 4 表示,它们是主分区或扩展分区,从 5 开始就是逻辑分区。例,hda3 表示为第一个 IDE 硬盘上的第三个主分区或扩展分区,hdb2 表示为第二个 IDE 硬盘上的第二个主分区或扩展分区。
- 对于 SCSI 硬盘则标识为“sdx~”,SCSI 硬盘是用“sd”来表示分区所在设备的类型的,其余则和 IDE 硬盘的表示方法一样。
-
使用
df
命令查看磁盘的容量 -
使用
du
命令查看目录的容量
帮助命令
-
内建命令和外建命令
-
概念
- 内建命令是写在
shell
程序中,一运行就加载到内存的命令,运行速度极快.如cd
,history
- 外建命令由于功能强大,所以不能一运行就加载进内存,故就不是
shell
中自带的程序,如ls
,vi
,通常位于/bin,/usr/bin,/sbin,/usr/sbin
- 内建命令是写在
-
type
:可以查看命令是内建命令还是外建命令
-
-
help
和--help
命令- 对于内建命令来说,可以使用
help 内建命令
查看命令的帮助 - 对于外建命令来说,可以使用
外建命令 --help
来查看帮助
- 对于内建命令来说,可以使用
-
man
命令- 没有内外建命令之分,而且提供的命令帮助过于详细
-
info
命令- 和
man
的使用一模一样,但是帮助更详细
- 和
定期任务crontab
-
用户自定义定期任务
-
格式
-
案例
-
crontab -e
:创建一个定时任务 -
常用命令
-
- conrtab –r:终止任务调度。
- 如果我们只需要删除某一个自动记录,我们只需要在使用
crontab -e
中,然后删除那条命令
-
- crontab –l:列出当前有那些任务调度
-
- service crond restart [重启任务调度]
-
-
注意
-
-
所有用户的定时任务都可以在
/var/spool/cron/crontabs
目录中找到,目的是为了隔离任务
-
-
系统定时任务
- 只需要以
sudo
权限编辑/etc/crontab
文件就可以
- 只需要以
命令的执行顺序控制与管道
-
简单的顺序执行命令:
;
-
使用
;
来让多个命令简单的顺序执行$ sudo apt-get update;sudo apt-get install some-tool;some-tool # 让它自己运行
-
-
选择性执行命令:
&&
-
使用
&&
来让多个命令选择性执行 -
如果前一个命令返回的执行状态为0(执行成功),那么则执行后面的命令,否则不再执行后面的命令
$ which cowsay>/dev/null && cowsay -f head-in ohch~
- 通过
$?
可以获取上一次任务执行的状态
- 通过
-
-
选择性执行命令:
||
-
使用
||
来让多个命令选择性执行,效果是和&&
相反 -
如果前一个命令返回的执行状态为1(执行失败),那么则执行后面的命令,否则不再执行后面的命令
$ which cowsay>/dev/null || echo "cowsay has not been install, please run 'sudo apt-get install cowsay' to install"
- 通过
$?
可以获取上一次任务执行的状态
- 通过
-
-
&&
和||
的结合使用-
$ which cowsay>/dev/null && echo "exist" || echo "not exist"
-
思考:能否写成
$ which cowsay>/dev/null || echo "not exist" && echo "exist"
-
软件安装
-
apt
是apt-get
,apt-cache
,apt-config
的子集,包含了绝大多数的常用的命令,所以推荐使用apt
-
步骤
-
$ sudo apt-get install w3m
:w3m
是一个可以在终端查看网页的软件
-
apt-get
会首先在本地数据搜索一个叫做w3m
的软件
- 为什么会在本地数据库搜索呢?是因为
apt
会定期从服务器上下载软件数据库表,表中保存着各个软件的依赖,所以我们需要使用sudo apt update
来更新数据库的软件信息
-
进程概念
-
kill
命令- -1 重新读取参数运行,类似与 restart
- -2 如同 ctrl+c 的操作退出
- -9 强制终止该任务
- -15 正常的方式终止该任务
-
概念
- 服务(service) 本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysql , sshd 防火墙等),因此我们又称为守护进程,是 Linux 中非常重要的知识点
-
centos6.x命令格式
- service 服务名 [start | stop | restart | reload | status]
-
centos7.x命令格式
- systemctl [start | stop | restart | reload | status] 服务名
-
6.x查看系统的所有服务名称
ls -l /etc/init.d
-
7.x查看系统正在运行个服务名称
systemctl
-
linux服务和linux系统的运行级别的关系
-
-
6.x通过
chkconfig
命令可以给每个服务的各个运行级别设置自启动/关闭,注意是 chkconfig ,不是checkconfig- chkconfig --list #列出所有的系统服务
- chkconfig --add httpd #增加httpd服务
- chkconfig --del httpd #删除httpd服务
- chkconfig --list #列出系统所有的服务启动情况
- chkconfig --list mysqld #列出mysqld服务设置情况
- chkconfig --level 35 mysqld on #设定mysqld在等级3和5为开机运行服务,--level 35表示操作只在等级3和5执行,on表示启动,off表示关闭
- chkconfig mysqld on #设定mysqld在各等级为on,“各等级”包括2、3、4、5等级
-
-
常用服务介绍
-
centos7.x
-
防火墙(
)
-
如果你的系统上没有安装使用命令安装
安装firewalld 防火墙yum install firewalld
-
开启服务
systemctl start firewalld.service
-
关闭防火墙
systemctl stop firewalld.service
-
开机自动启动
systemctl enable firewalld.service
-
关闭开机制动启动
systemctl disable firewalld.service
-
firewall-cmd
命令的使用-
查询指定端口是否已开
firewall-cmd --query-port=666/tcp
必须要求666端口必须是永久开放的,临时性开通的端口查询的结果永远是no
- firewall-cmd --permanent --zone=public --add-port=8080-8081/tcp //永久
- firewall-cmd --zone=public --add-port=8080-8081/tcp //临时
-
查看 onenote 的防火墙文章
-
-
-
-