Linux 安装
Linux常用命令
1 指令和选项
在执行之前输入的指令
Linux 通用指令格式:
#指令 [选项] [操作对象]
一个指令可以包含多个选项
操作对象也可以是多个
1.ls指令
含义:ls(list)
列出当前工作目录下所有文件\文件夹的名称
用法2:ls 路径
列出指定路径下的所有文件\文件夹名称
./当前目录 ../上一级目录 /绝对路径;
用法3:ls 路径 选项
列出指定路径下的所有文件\文件夹名称,并以指定格式显示
ls -l 路径
ls -la 路径
解释:
-l :表示以详细列表的形式展开
-la:表示显示所有文件/文件夹(包含隐藏文件)
用法4:ls -lh 路径
含义:以列表的形式且在显示文档的时候文档大小以可读性较高的形式显示
注意 :ls列出的结果颜色说明 ,蓝色表示文件夹,黑色表示文件,绿色表示拥有读写全部1权限。
2.pwd指令
用法:#pwd (print working directory,打印当前工作目录)
3.cd指令
用法:#cd (change directory,改变目录)
语法:#cd 路径
补充:“~”,表示当前用户的家目录
切换方式:#cd ~
4.mkdir指令
用法: #mkdir (make directory,创建目录)
语法: #mkdir 路径(路径可以是文件夹的名称,也可是包含名称的完整路径)
语法2: #mkdir -p 路径 (实现多层目录的创建)
语法3: #mkdir 路径1 路径2 路径3 ... (一次创建多个目录)
5.touch指令
语法:#touch 文件路径 (创建文件,路径可以是文件名也可以是路径)
6.cp指令
语法:#cp 被复制的文档路径 复制到的路径(复制文件/文件夹到指定位置)
注意:复制到新位置是可以重命名的
注意:cp命令进行文件夹复制的时候需要加“-r”(表示递归复制),否则目录会被忽略
7.mv指令
语法:#mv 需要移动的文档路径 需要保存的位置(move,移动,剪切)
补充:重命名的命令也是mv
8.rm命令
语法:#rm 选项 需要移除的文件路径(remove 移出,删除)
“-f”,表示force(强制),不会提示是否删除
“-r”,删除目录时需要递归删除
案例:需要删除一个目录下公共特性的文档,列如都以linux开头
#rm -f linux* (“*”,称为通配符)
9.vim命令
语法:#vim 文件的路径(vim是一款文本编辑器,文件可以不存在)
退出打开的文件:在没有按下其它命令的时候,按下shift+英文冒号,输入q,按下回车即可。
10.输出重定向
一般的命令显示在终端中,输出重定向可以将执行结果保存在文件中
语法:> : 覆盖输出,会覆盖原先的文件 >> :追加输出,不会覆盖文件,在原有文件末尾添加
11.cat指令
作用1:直接打开一个文件的功能
语法:#cat 文件路径
作用2:对文件进行合并
语法2:#cat 带合并的文件路径1 带合并的文件路径2 ... 文件路径n > 新文件路径
2 进阶指令
1.df指令
语法:#df -h (查看磁盘的空间 -h,以可读性较高的形势展示)
2.free指令
语法:#free -m (查看内存使用情况 -m,表示以mb为单位表示)
3.head指令
语法:#head -n 文件路径(查看一个文件的前n行,如果不指定n则默认显示前10行)
4.tail指令
语法:#tail -n 文件路径(查看文件的后n行,如果不指定n则默认显示后10行)
作用2:查看一个文件的动态变化
语法:#tail -F 文件路径
退出按q键
5.less指令
语法:#less 文件路径(查看文件,以较少的内容进行输出,按下辅助功能键(数字+回车、空格、上下方向键)查看更多)
6.wc指令
语法:#wc -lwc 文件路径(统计文件内容信息,包括行数、单词数、字节数)
-l :表示lines,行数
-w:表示words,单词数
-c:表示bytes,字节数
7.date指令(重点)
语法1:#date(表示操作时间,读取、设置),shell
语法2:#date +%F(等价于:date "+%Y-%m-%d",输出形式:2023-04-06)
语法3:#date “+%F %T” (等价于:date "+%Y-%m-%d %H:%M:%S",输出形式:2023-04-06 02:11:11)
语法4:#date -d "-1 day" "+%F %T"(获取之前或之后的某个时间,备份)
8.cal指令
语法:#cal (等价#cal -1 ,直接输出当前月份的日历)
语法2:#cal -3 表示输出上一个月+本月+下一个月的日历
语法3:#cal -y 年份 (输出某一年的日历)
9.clear/ctrl + L 指令
语法:#clear 或者快捷键 ctrl+L(清除终端中已经纯在的信息)
10.管道(重要)
管道符:|
作用:管道一般可以用来“过滤”,“特殊”,“扩展处理”,把前面的输出用作后面的输入
语法:不能单独使用,必须配合前面所学指令一起使用,其作用主要是辅助作用。
过滤案例:#ls/|grep y 输出包含y字母的文档(grep主要用于过滤)
扩展处理:统计某个目录下的总个数 #ls/ | wc -l
3 高级指令
1.hostname指令
作用:操作服务器的主机名(读取、设置)
语法1:#hostname (输出完整的主机名)
语法2:#hostname -f (输出当前主机的FQDN,全限定域名)
2.id指令
作用:查看一个用户的基本信息(包含用户id,用户组id,附加组id...),默认显示当前用户
语法:#id
语法2:#id 用户名
3.whoami指令
作用:”我是谁“,显示当前登录的用户名
语法:#whoami
4.ps -ef指令(重点)
作用:ps 主要查看服务器的进程信息
-e :等价“-A”,表示列出全部进程
-f:显示全部的列(显示全字段)
列的含义:UID:用户id;
PID:进程id;
PPID:该进程的父级进程id,如果一个程序的父级进程找不到,该进程称为僵尸进程;
C:CPU的占用率,其形式是百分数;
STIME:进行的启动时间;
TTY:终端设备,发起该进程的设备识别符号,如果为“?”,表示该进程并不是由终端设备发起的;
TIME:进程的执行时间;
CMD:进程的名称或者对应的路径;
案例: #ps -ef | grep 进程名称
5.top指令
作用:查看服务器的进程占用资源
语法:#top (动态显示)
退出按q键
表头含义:
PID:进程id;
USER:用户;
PR:优先级;
VIRT:虚拟内存;
RES:常驻内存;
SHR:共享内存;
计算一个进程实际使用的内存 = 常驻内存(RES)-共享内存(SHR)
S:表示进程的状态(sleeping,其中S表示睡眠,R表示运行);
%CPU:表示cpu占用比;
%MEM:内存占用百分比;
TIME+:执行的时间;
COMMAND:进程的名称或者路径;
运行top时,按下方便快捷键:
M:按内存(MEM)从高到低排序
P:按cpu从高到低降序
1:当服务器拥有多个cpu时,切换是否显示各个cpu详情
6.du -sh指令
作用:查看目录的真实大小
选项含义:
-s:summaries,只显示汇总大小
-h:表示以高可读性进行显示
案例:统计“/root/yunwei”下目录大小
#du -sh /root/yunwei
7.find指令
作用:用于查找文件(其参数有55个之多)
语法:#find 路径范围 选项 选项的值
选项:
-name:按文档名搜索(支持模糊搜索)
-type:按文档类型搜索(“-”表示文件(用f替换)。“d”表示文件夹)
案例:使用find搜索httpd.conf
#find / -name hhtpd.conf
案例:搜索etc目录下所有的conf后缀的文件的数量
#find /etc -name *.conf | wc -l
案例:搜/etc/sane.d/目录下所有的文件
#find /etc/sane.d -type f
8.service指令(重点)
作用:用于控制软件的服务启动\停止\重启
语法:#service 服务名 start\stop\restart
例如:#service httpd start
9.kill指令(重点)
作用:杀死进程
语法:#kill 进程PID(配合ps指令一起使用)
语法:#killall 进程名称
10.iconfig指令(重点)
作用:获取操作网卡相关的指令
语法:#iconfig (获取网卡信息)
11.reboot指令
作用:重新启动计算机
语法:#reboot
语法2:#reboot -w (模拟重启,但不重启,只写开机与关机的日志信息)
12.shutdown指令
作用:关机 (慎用)
语法1:#shutdown -h now 或者 #shutdown -h 15:25
其它关机命令:
#init 0
#halt
#poweroff
13.uptime指令
作用:输出计算机的 持续在线时间(计算机从开机到现在运行的时间)
语法:#uptime
14.uname指令
作用:获取操作系统相关信息
语法:#uname (获取操作系统的类型)
语法2:#uname -a (获取全部的信息)
15.netstat -tnlp指令
作用:查看网络的连接状态
语法:#netstat -tnlp
选项说明:
-t:表示只列出tcp协议的连接
-n:表示将地址从字母组合转化成IP地址,将协议转化成端口号显示;
-l:表示过滤出“state(状态)”列中其值为LISTEN(监听)的连接;
-p:显示进程的pid和进程的名称;
16.man指令
作用:manual,手册(包含了linux中全部命令手册,英文)
语法:#man 指令 (q退出)
快速删除光标前/后的内容
前:ctrl + u 后: ctrl + k
4 vim编辑器
vim的三种模式(重点)
命令模式、编辑模式(输入模式)、末行模式(尾行模式)。
vim打开文件的方式:
#vim 文件路径
#vim +数字 文件路径 作用:打开指定文件,光标移动到指定行
#vim +/关键词 文件路径 作用:打开指定文件,高亮显示关键词
#vim 文件路径1 文件路径2 作用:同时打开多个文件
退出方式:输入:q按回车即可退出
重点:先复制出一个 /ect/passwd 到根目录
命令模式:
1.光标移动
1.光标移动到行首
按键:shift + 6 或 ^
2.光标移动到行尾
按键:shift + 4 或 ¥
3.光标移动到首行
按键:gg
4.光标移动到末行
按键:G
5.翻屏
向上翻屏
按键:CTRL +b 或 pgUp
向下翻屏
按键:ctrl + f 或pgDn
2.复制操作
1.复制光标所在行
按键:yy
粘贴
按键:在想要粘贴的地方按p键
2.以光标说在行为准(包含当前行),向下复制指定行数
按键:数字 yy
3.可视化复制
按键:ctrl + v,按方向键选择区块,按下p键粘贴
3.剪切/删除
1.剪切/删除光标所在行
按键:dd (删除之后下一行上移)
2.向下删除指定行
按键:数字 dd
3.删除当前行,但是下一行不上移
按键:D (删除之后当前行会变空白行)
4.撤销/恢复
撤销:输入:u回车 或者u (undo)
恢复:输入ctrl+r 取消之前的撤销
5.扩展1:光标快速移动
1.快速移动到指定行
按键:数字 G
2.以当前光标为准,向上\下移动n行
按键:数字 ↑,数字 ↓
3.末行模式下移动到指定行
按键:输入英文“:”,输入行数数字,按下回车
模式间的切换
进入末行模式:输入:
退出末行模式:按esc,进入命令模式
进入编辑模式,命令模式下按:“i或a”(i,在光标前插入,a,光标后插入)
末行模式
1.保存操作
输入:“:w”
输入:“:w 路径”
2.退出(quit)
输入:“:q”
3.保存并退出
输入:“:wq”
4.强制(!)
输入:“:q!” 表示强制退出,刚才做的修改不做保存
5.调用外部命令(了解)
输入:“:!外部命令”
6.收索/查找
输入:“/关键词”
在收索结果中切换上下结果: N/n (next)
取消高亮:“:nohl”[no highlight]
7.替换
:s /搜索的关键词/新的内容 (替换光标所在行的第一处)
:s/搜索的关键词/新的内容/g (替换光标所在行的全部符合的)
:%s/搜索的关键词/新的内容 (替换每行的第一个符合条件的)
:%s/搜索的关键词/新的内容/g (替换所有的符合条件的)
8.显示行号
输入:“:set nu” (number)
如果想取消:“:set nonu”
9.扩展2:使用vim打开多个文件,在末行模式下进行文件切换
查看当前已打开文件名:“:files”
切换文件方式:
a.指定切换文字的名称:“:open 文件名称”
b.来回切换上一个/下一个文件:下一个“:bn”,上一个 ":bp"
实用功能
1.代码着色
开启显示:“:syntax:on” (syntax:语法)
关闭显示:“:syntax:off”
2.vim中计算器的使用
a.进入编辑模式
b.按下“ctrl + R”,输入“=”,此时光标到最后一行
c.输入计算内容,按下回车
扩展
1.vim的配置(重点)
vim配置三种情况:
a.末行模式下输入的配置(临时)
b.个人配置文件(~/.vimrc,如果没有自行新建) 以个人为准
c.全局配置文件(vim自带,/ect/vimrc)
①新建好个人配置文件后进入编辑
②在配置文件中进行配置
比如显示行号:set nu
2.异常退出
什么是异常退出:在编辑文件后没有wq保存退出
解决办法:将交换文件删除掉即可
#rm -f .passwd.swp
3.别名机制(实用)
作用:相当于创建一些属于自己的自定义指令
别名机制依靠一个别名映射文件:~/.bashrc
注意:生效需要重新登录当前用户
4.退出方式
除了“wq”,“q”之外,还支持“:x”
Linux自有服务
运行模式也称之为运行级别
在linux中存在一个进程:init(initialize,初始化)
查看进程:#ps -ef | grep init
该进程存在一个对应的配置文件:inittab(系统的运行级别配置文件,位置/etc/inittab)
运行模式
0-表示关机级别(不要将默认的运行级别设置为这个值)
1-单用户模式
2-多用户模式,不带NFS(network file system)
3-多用户模式,完全的多用户模式
4-没有被使用的模式(被保留模式)
5-X11,完整的图形化界面模式
6-表示重启级别(不要将默认的运行级别设置为这个值)
与该级别相关的几个命令:
#init 0 表示关机
#init 3 表示切换到不带桌面的模式(临时切换)
#initi 5 切换到图形界面
#init 6 重启电脑
用户与用户组的管理
注意三个文件:
/etc/passwd 存储用户的关键信息
/etc/group 存储用户组的关键信息
/etc/shadow 存储用户的密码信息
1.用户管理
①添加用户
语法:#useradd 选项 用户名
选项:
-g:指定用户的用户组,其选项的值可以是用户组的id或组名
-G:指定用户的用户附加组,其选项的值可以是用户组的id或组名
-u:uid,用户的id
-c comment:添加注释
验证是否成功:
a.查看/etc/passwd最后一行是否有信息
b。验证是否存在家目录
扩展:认识passwd文件
用户名:密码:用户ID:用户组ID:注释:家目录:解释器shell
解释器shell:等待用户进入系统之后,用户输入指令之后,该解释器会收集用户输入的指令,传递给内核处理;
查看主组看passwd文件,查看附加组看group文件
②修改用户
语法:#usermod 选项 用户名 (user modify,用户修改)
选项:
-g:指定用户的用户组,其选项的值可以是用户组的id或组名
-G:指定用户的用户附加组,其选项的值可以是用户组的id或组名
-u:uid,用户的id
-l:修改用户名
-c comment:添加注释
③设置密码
语法:#passwd 用户名
切换用户命令:#su[用户名]
如果不指定用户名则表示切换到root用户
④删除用户
语法:#userdel 选项 用户名
Userdel:user delete(用户删除)
选项:
-r:删除用户的同时删除家目录
只有管理员有权限操作用户
用户组管理
用户组在创建用户时同时创建,对用户组修改实际是对/etc/group文件的修改
文件结构:用户名:密码:用户组ID:组内用户名
①用户组添加
语法:#groupadd 选项 用户组名
选项:
-g:类似用户添加里的-u,自定义用户组的id,如果不知道默认从500之后递增
-n:类似用户修改“-l”,表示设置新的用户组的名称
②用户编辑
语法:#groupmod 选项 用户组名
选项:
-g:类似用户添加里的-u,自定义用户组的id,如果不知道默认从500之后递增
-n:类似用户修改“-l”,表示设置新的用户组的名称
③用户组删除
语法:#groupdel 选项 用户组名
注意:如果这个组是主组,则不允许删除,需要先从组内移出所有用户
网络设置
网卡配置文件位置:/etc/sysconfig/network-scripts/
在目录中网卡的配置文件名称格式:ifcfg-网卡名称
ONBOOT:是否开机启动
BOOTPROTO:ip地址分配方式,DHCP动态主机分配协议
HWADDR:硬件地址,MAC地址
重启网卡:
#service network restart
在有的分支版本中可能没有service指令,担有一个共性的目录:/etc
/init.d存放网络服务的快捷方式
使用:#/etc/init.d/network restart
创建快捷方式:
#ln -s 原始文件的路径 快捷方式的路径
#ln -s /etc/sysconfig/network-scripts/ifcfg-eth0 ~/ifcfg-eth0
扩展2:重启单个网卡:
停止某个网卡:#ifdown 网卡名
开启某个网卡:#ifup 网卡名
ssh服务(重点)
ssh(secure shell,安全外壳协议),该协议有两个常用的作用:远程连接协议、远程文件传输协议。
协议使用端口号:默认是22
修改端口号,需要修改ssh的配置文件:etc/ssh/ssh_config
注意事项:(防火墙)
a.端口号范围0-65535
b.不能使用被占用的端口号
服务启动/停止/重启
#service sshd start/stop/restart
#etc/init.d/sshd start/stop/restart
1远程终端
终端工具主要帮助运维人员连接远程服务器,常见有:Xshell、secureCRT、Putty。
①获取服务器ip,可以通过ifcofig命令进行查看
2 ssh服务文件传输
可视化界面传输工具:Filezilla
扩展3:通过命令行工具来传输文件/文件夹
工具:PSCP.exe,只能用命令行打开
用法:
a.pscp 选项 用户名@linux 主机地址:资源路径 windows 本地地址 (下载到win)
b.pscp 选项 资源路径 用户名@linux 主机地址:远程路径 (上传到linux)
c. pscp 选项 -ls 用户名@linux主机地址 (列出远程路径下结构)
设置主机名
回顾:#hostname (零时的)
#hostname -f (FQDN,全限定域名)
1、 临时设置主机名(切换用户使之生效):#hostname 设置的主机名 登陆:su
2、永久设置主机名(需要重启) 修改/etc/sysconfig/network
3.修改linux服务器的ect/hosts文件,将Kobe指向本地(FQDN)
不设置FQDN会怎样:
①很多开源服务器软件会把报错或者无法启动;
②方便记忆;
③影响本地的域名服务
#vim /etc/hosts
Chkconfig
Chkconfig(systemctl)相当于window下的“电脑管家”提供”开机启动”的一个管理服务
①开机启动服务查询
#chkconfig --list
其中0-6表示各个启动级别
②删除服务
#chkconfig --del 服务名
③添加开机启动服务
#chkconfig --add 服务名
④设置服务在某个级别下开机启动
#chkconfig --level 连在一起的启动级别 服务名on/off
ntp服务
ntp服务:对计算机的时间同步管理操作
同时服务器时间的方式有两个:
①一次性同步(手动同步)
#ntpdate 时间服务器的ip地址或域名
IP地址查看可以访问 服务器列表 - 全球可用的NTP服务器列表与解析服务 - ntp.org.cn & ntpdate.net
②通过服务自动同步
服务名:ntpd
启动ntpd进程
#service ntpd start 或者 /ect/init.d/ntpd start
设置nptd开机自启
防火墙服务
firewalld centos6.5防火墙名称为iptables
①irewalld服务 stop/start/restart
②Centos7查看防火墙状态:#systemctl status firewalld 已启用:
关闭防火墙:#systemctl stop firewalld.service
可以访问linux内置apache
启动防火墙: #systemctl start firewalld
无法访问linux
永久禁用或者开启防火墙 执行开机禁用防火墙自启命令 : systemctl disable firewalld.service 防火墙随系统开启启动 : systemctl enable firewalld.service
Centos7查看相关规则:systemctl status 项目(-l 可以使用)
Centos6为:项目service 项目 status
③简单设置防火墙规则(centos7) 查看已打开的端口 netstat -anp 添加允许的端口 firewall-cmd --add-port=8080/tcp --permanent 若移除端口 firewall-cmd --permanent --remove-port=8080/tcp
rpm管理(重点)
rpm类似于window上的电脑管家,主要用于对linux服务器上的 软件包进行管理,相应的操作为:查询、卸载、安装
①查询
#rpm -qa | grep关键词 选项:
-q = =query (查询)
-a = = all (所有)
②卸载
卸载软件:
#rpm -e 软件名
当存在依赖关系又不想去解决的时候
#rpm -e 软件名 -nodeps (表示忽略依赖关系)
查看块状设备的信息: #lsblk
扩展:光盘的挂载和解挂 解挂操作 命令:umount 语法:#umount 当前设备的挂载点(路径)
此时,相当于U盘在window上已经被弹出来了,但是没有拔下来usb接口 挂载光盘: 命令:mount 语法:#mount 设备原始地址 要挂载的路径 设备原始路径:统一都在/dev下,然后根据大小确定具体name的值,拼凑在一起组成原始地址,例如当前:“dev/sr0” 要挂载的位置路径:挂载目录一般都在mnt下,也可以在mnt下建目录,此处以“mnt/dvd”为例
③安装软件
从官网下载安装包
#rpm -ivh 软件完整包名 -I install安装 -v 显示进度条 -h 表示以“#”形式显示进度条
rpm安装案例 1、 下载linux qq RPM文件,使用filezilla拖入linux文件(此处为/mnt/ 下) 下载地址: http://175.6.13.186/dlied1.qq.com/qqweb/LinuxQQ_1/linuxqq_2.0.0-b2-1082_x86_64.rpm
2、 安装
3、 使用命令将图形化界面QQ映射到gui export DISPLAY=192.168.133.129 linux地址 启动QQ:终端输入 QQ 即可启动
cron/crontab 计划任务(重点)
语法:#crontab 选项
常用选项: -l:list 列出指定用户的计划任务表 -e:edit 编辑指定用户的计划任务表 -u:user 指定的用户名,如果不指定,则表示当前用户 -r:remove 删除指定用户的计划任务表
编辑计划任务(重点)
计划任务的规则语法格式,以行为单位,一行则为一个计划:
分 时 日 月 周 需要执行的命令
例如:每天的0点0分执行reboot指令,则可以写成
0 0 * * * reboot
取值范围:
分 :0~59
时 :0~23
日 :1~31
月 :1~12
周:0~7,0表示星期天
四种符号:
*:表示取值范围的每一个数字
-:作区间表达式,想表示1~7,可以写成:1-7
/:表示每多少个 ,比如:每十分钟一次,则可以写成:*/10
,:表示多个取值,比如:想在1点、2点、6点执行一次则可以写成:1,2,6
Crontab权限问题:
任何用户可以创建自己的计划任务 但是管理员可以通过配置文件来限制其他用户使用crontab 黑名单默认文件(空文件,手动添加黑名单用户): /etc/cron.deny
里面写用户名,一行一个
还有一个配置文件:(白名单) 位置:/etc/cron.allow 本身不存在,需要自己创建
注意:白名单优先级高于黑名单,如果一个用户同时被存于两个文件夹中,则会被默认允许创建定制计划表。
Linux的权限管理操作
Linux**的权限操作与用户、用户组是兄弟操作。**
一、权限概述
总述:Linux系统一般将文件可存/取访问的身份分为3个类别:
owner、group、others,且3种身份各有read、write、execute等权限。
1、权限介绍
什么是权限?
在多用户(可以不同时)计算机系统的管理中,权限是指某个特定的用户具有特定的系统资源使用权力,像是文件夹、特定系统指令的使用或存储量的限制。
在Linux中分别有读、写、执行权限:
读权限:
对于文件夹来说,读权限影响用户是否能够列出目录结构
对于文件来说,读权限影响用户是否可以查看文件内容
写权限:
对文件夹来说,写权限影响用户是否可以在文件夹下“创建/删除/复制到/移动到”文档
对于文件来说,写权限影响用户是否可以编辑文件内容
执行权限:
一般都是对于文件来说,特别脚本文件。
2、身份介绍
Owner身份(文件所有者,默认为文档的创建者)
由于Linux是多用户、多任务的操作系统,因此可能常常有多人同时在某台主机上工作,但每个人均可在主机上设置文件的权限,让其成为个人的“私密文件”,即个人所有者。因为设置了适当的文件权限,除本人(文件所有者)之外的用户无法查看文件内容。
例如某个MM给你发了一封Email情书,你将情书转为文件之后存档在自己的主文件夹中。为了不让别人看到情书的内容,你就能利用所有者的身份去设置文件的适当权限,这样,即使你的情敌想偷看你的情书内容也是做不到的。
Group身份(与文件所有者同组的用户)
与文件所有者同组最有用的功能就体现在多个团队在同一台主机上开发资源的时候。例如主机上有A、B两个团体,A中有a1,a2,a3三个成员,B中有b1,b2两个成员,这两个团体要共同完成一份报告F。由于设置了适当的权限,A、B团体中的成员都能互相修改对方的数据,但是团体C的成员则不能修改F的内容,甚至连查看的权限都没有。同时,团体的成员也能设置自己的私密文件,让团队的其它成员也读取不了文件数据。在**Linux中,每个账户支持多个用户组。如用户a1、b1即可属于A用户组,也能属于B用户组【主组和附加组】**。
Others身份(其他人,相对于所有者)
这个是个相对概念。打个比方,大明、二明、小明一家三兄弟住在一间房,房产证上的登记者是大明(owner所有者),那么,大明一家就是一个用户组,这个组有大明、二明、小明三个成员;另外有个人叫张三,和他们三没有关系,那么这个张三就是其他人了。
同时,大明、二明、小明有各自的房间,三者虽然能自由进出各自的房间,但是小明不能让大明看到自己的情书、日记等,这就是文件所有者(用户)的意义。
Root用户(超级用户)
在Linux中,还有一个神一样存在的用户,这就是root用户,因为在所有用户中它拥有最大的权限 ,所以管理着普通用户。
3、Linux的权限介绍
要设置权限,就需要知道文件的一些基本属性和权限的分配规则。在Linux中,ls命令常用来查看文件的属性,用于显示文件的文件名和相关属性。
#ls -l 路径 【ls -l 等价于 ll】
标红的部分就是Linux的文档权限属性信息。
Linux**中存在用户、用户组和其他人概念**,各自有不同的权限,对于一个文档来说,其权限具体分配如下:
十位字符表示含义:
第1位:表示文档类型,取值常见的有“d表示文件夹”、“-表示文件”、“l表示软连接”、“s表示套接字”等等;
第2-4位:表示文档所有者的权限情况,第2位表示读权限的情况,取值有r、-;第3位表示写权限的情况,w表示可写,-表示不可写,第4位表示执行权限的情况,取值有x、-。
第5-7位:表示与所有者同在一个组的用户的权限情况,第5位表示读权限的情况,取值有r、-;第6位表示写权限的情况,w表示可写,-表示不可写,第7位表示执行权限的情况,取值有x、-。
第8-10位:表示除了上面的前2部分的用户之外的其他用户的权限情况,第8位表示读权限的情况,取值有r、-;第9位表示写权限的情况,w表示可写,-表示不可写,第10位表示执行权限的情况,取值有x、-。
权限分配中,均是rwx的三个参数组合,且位置顺序不会变化。没有对应权限就用 – 代替。
例如:以下一个文档权限是怎么样的?
a. 其是文件夹类型
b. 所有者:拥有全部权限(读写执行)
c. 同组用户:可读、可执行
d. 其他用户:可读、可执行
二、权限设置
语法:#chmod 选项 权限模式 文档
注意事项:
常用选项:
-R:递归设置权限 (当文档类型为文件夹的时候)
权限模式:就是该文档需要设置的权限信息
文档:可以是文件,也可以是文件夹,可以是相对路径也可以是绝对路径。
注意点:如果想要给文档设置权限,操作者要么是root**用户,要么就是文档的所有者。**
1、字母形式
给谁设置:
u:表示所有者身份owner(user)
g:表示给所有者同组用户设置(group)
o:表示others,给其他用户设置权限
a:表示all,给所有人(包含ugo部分)设置权限
如果在设置权限的时候不指定给谁设置,则默认给所有用户设置
权限字符:
r:读
w:写
x:表示执行
-:表示没有权限
权限分配方式:
+:表示给具体的用户新增权限(相对当前)
-:表示删除用户的权限(相对当前)
=:表示将权限设置成具体的值(注重结果)【赋值】
例如:需要给anaconda-ks.cfg**文件(-rw-------.)设置权限,要求所有者拥有全部的权限,同组用户拥有读和执行权限,其他用户只读权限。**
答案:
①#chmod u+x,g+rx,o+r anaconda-ks.cfg
②#chmod u=rwx,g=rx,o=r anaconda-ks.cfg
提示:当文档拥有执行权限(任意部分),则其颜色在终端中是绿色。
#chmod ug=rwx 形式,如果有两部分权限一样则可以合在一起写的
例如:如果anaconda-ks.cfg**文件什么权限都没有,可以使用root用户设置所有人都有执行权限,则可以写成**
①#chmod +x anaconda-ks.cfg
②#chmod a=x anaconda-ks.cfg
③#chmod a+x anaconda-ks.cfg
2、数字形式
经常会在一些技术性的网页上看到类似于#chmod 777 a.txt 这样的一个权限,这种形式称之为数字形式权限(777)。
读:r 4
写:w 2
执行:x 1
没有任何权限:0
例如:需要给anaconda-ks.cfg设置权限,权限要求所有者拥有全部权限,同组用户拥有读执行权限,其他用户只读。
全部权限(u**):读+写+执行=4+2+1=7**
读和执行(g**):读+执行=4+1=5**
读权限(o**):读=4**
由上得知权限为:754
#chmod 754 anaconda-ks.cfg
面试题:用超级管理员设置文档的权限命令是#chmod -R 731 aaa**,请问这个命令有没有什么不合理的地方?**
拥有者:7=4+2+1=读+写+执行
同组用户:3=2+1=写+执行
其他用户:1=1=执行
注意:在写权限的时候千万不要设置类似于上面的这种“奇葩权限”。如果一个权限数字中但凡出现2与3的数字,则该权限有不合理的情况。
3、注意事项
使用root用户创建一个文件夹(/oo),权限默认,权限如下:
需要在oo目录下创建文件(oo/xx.txt),需要给777权限:
切换到test用户(不是文档所有者,也不是同组用户,属于other部分):
问题1:test用户是否可以打开oo/xx.txt文件?【能打开】
问题2:test用户是否可以编辑oo/xx.txt文件?【可以】
问题3:test用户是否可以删除oo/xx.txt文件?【不可以,同样还不允许创建文件/文件夹、移动文件、重命名文件】
在Linux**中,如果要删除一个文件,不是看文件有没有对应的权限,而是看文件所在的目录是否有写权限,如果有才可以删除**。
三、属主与属组设置
属主:所属的用户(文件的主人)
属组:所属的用户组
前面的那个root就是属主
后面的那个root就是属组
这两项信息在文档创建的时候会使用创建者的信息(用户名、用户所属的主组名称)。
如果有时候去删除某个用户,则该用户对应的文档的属主和属组信息就需要去修改。
1、chown(重点)
作用:更改文档的所属用户
语法:#chown -R username 文档路径
案例:将刚才root用户创建的oo目录,所有者更改为test
#chown test oo/
2、chgrp(了解)
作用:更改文档的所属用户组
语法:#chgrp -R groupname 文档的路径
案例:将刚才root用户创建的oo目录,所有者更改为test,并且将所属用户组也改为test
#chgrp test oo/
思考,如何通过一个命令实现既可以更改所属的用户,也可以修改所属的用户组呢?
答:可以实现的,通过chown命令
语法:#chown -R username:groupname 文档路径
案例:要求只使用chown指令,将oo目录的所属用户和用户组改回成root,并且包含其子目录
四、扩展(1)
问题:reboot、shutdown、init、halt、user管理,在普通用户身份上都是操作不了,但是有些特殊的情况下又需要有执行权限。又不可能让root用户把自己的密码告诉普通用户,这个问题该怎么解决?
该问题是可以被解决的,可以使用sudo**(switch user do)命令来进行权限设置。Sudo可以让管理员(root)事先定义某些特殊命令谁可以执行**。
默认sudo中是没有除root之外用户的规则,要想使用则先配置sudo。
Sudo**配置文件:/etc/sudoers**
a. 配置sudo文件请使用“#visudo”,打开之后其使用方法和vim一致
b. 配置普通用户的权限
Root表示用户名,如果是用户组,则可以写成“%组名”
ALL:表示允许登录的主机(地址白名单)
(ALL):表示以谁的身份执行,ALL表示root身份
ALL:表示当前用户可以执行的命令,多个命令可以使用“,”分割
案例:本身test**用户不能添加用户,要求使用sudo配置,将其设置为可以添加用户,并且可以修改密码(但是不能修改root用户密码)。**
注意:在写sudo规则的时候不建议写直接形式的命令,而是写命令的完整路径。
路径可以使用which命令来查看
语法:#which 指令名称
在添加好对应的规则之后就可以切换用户,切换到普通用户test,再去执行:
此时要想使用刚才的规则,则以以下命令进行:
#sudo 需要执行的指令
在输入sudo**指令之后需要输入当前的用户密码进行确认的操作(不是root用户密码),输入之后在接下来5分钟内再次执行sudo指令不需要密码**。
特别注意:此处按照案例要求,不能让test用户修改root密码,因此规则还需要调整,不然其可以修改root密码的:
禁止修改*root密码的配置(先允许全部,再拒绝root密码设置):** /usr/bin/passwd [A-Za-z], !/usr/bin/passwd root
补充:在普通用户下怎么查看自己具有哪些特殊权限呢?
#sudo -l
最后:sudo不是任何Linux分支都有的命令,常见centos与ubuntu都存在sudo命令。
Linux的网络基础
一、网络相关概述
1、网络发展
信息传递
n 远古时期,人们就通过简单的语言、壁画等方式交换信息
n 千百年来,人们一直在用语言、图符、钟鼓、烟火、竹简、纸书等传递信息
n 古代人的烽火狼烟、飞鸽传信、驿马邮递
n 现代社会中,交通警的指挥手语、航海中的旗语等
n 这些信息传递的基本方式都是依靠人的视觉与听觉
电的产生
n 1831年,法拉第制出了世界上最早的第一台发电机
n 1866年,德国人西门子(Siemens)制成世界上第一台大功率发电机
n 1837年,美国人塞缪乐·莫乐斯成功地研制出世界上第一台电磁式电报机
n 1844年5月24日,莫乐斯在国会大厦联邦最高法院会议厅进行了“用莫尔斯电码”发出了人类历史上的第一份电报,从而实现了长途电报通信
网络诞生
n 1957年,前苏联发射了第一颗人造卫星,震惊了美国
n 1958年美国成立了国防部高级研究计划署(ARPA,Advanced Research Projects Agency),应对冷战形势,ARPA是一个管理机构,没有实验室和科学家
n 1969年,ARPANET(阿帕网)开始联机,因此**1969年被称为Internet元年**
网络分类(记忆)
n 局域网(Local Area Network,LAN)是指范围在几百米到十几公里内办公楼群或校园内的计算机相互连接所构成的计算机网络。
n 城域网(Metropolitan Area Network,MAN)所采用的技术基本上与局域网相类似,只是规模上要大一些。城域网既可以覆盖相距不远的几栋办公楼,也可以覆盖一个城。
n 广域网(Wide Area Network,WAN)通常跨接很大的物理范围,如一个国家。
除了上述的划分,网络还可以按照所有者分为公网、私网是两种Internet的接入方式。公网接入方式:上网的计算机得到的IP地址是Internet上的非保留地址,公网的计算机和Internet上的其他计算机可随意互相访问。私网则反之。
2、ip地址(重点记忆)
IP是英文Internet Protocol的缩写,意思是“网络之间互连的协议”,也就是为计算机网络相互连接进行通信而设计的协议。
IP**地址类型分为:公有地址、私有地址。**
公有地址
公有地址(Public address)由Inter NIC(Internet Network Information Center因特网信息中心)负责。这些IP地址分配给注册并向Inter NIC提出申请的组织机构。通过它直接访问因特网。
私有地址(重点)
私有地址(Private address)属于非注册地址,专门为组织机构内部使用。以下列出留用的内部私有地址:
A类 10.0.0.0--10.255.255.255
B类 172.16.0.0--172.31.255.255
C**类 192.168.0.0--192.168.255.255**
IP**地址按类型可以分为三类:**
类别 | 最大网络数 | IP地址范围 | 最大主机数 | 私有IP地址范围 |
---|---|---|---|---|
A | 126(2^7-2) | 1.0.0.0-127.255.255.255 | 16777214 | 10.0.0.0-10.255.255.255 |
B | 16384(2^14) | 128.0.0.0-191.255.255.255 | 65534 | 172.16.0.0-172.31.255.255 |
C | 2097152(2^21) | 192.0.0.0-223.255.255.255 | 254 | 192.168.0.0-192.168.255.255 |
网络运维相关技能:ip分类、子网划分、划分vlan、ACL、综合布线、各种Serve的搭建。
127.0.0.1 本机ip
3、网卡
网卡是一个网络组件,属于硬件范畴,主要负责计算机之间数据的封装和解封。
MAC地址:网卡的物理地址,网卡设备的编号,默认情况是全球唯一的(16进制)。
与IP**地址的区别:**
n 长度不同。IP地址为32位,MAC地址为48位。
n 分配依据不同。
n 网络寻址方式不同。OSI参考模型,ip地址是基于第三层工作(网络层),mac地址是第二层(数据链路层)
4、网线
网线是连接局域网必不可少的。在局域网中常见的网线主要有双绞线(RJ45接口)、铜轴电缆、光缆三种。
双绞线 铜轴电缆 光纤
5、交换机
交换机(Switch)意为“开关”,是一种用于电(光)信号转发的网络设备,交换机它可以为接入交换机的任意两个网络节点提供独享的电信号通路。
目前,交换机品牌比较有名的是:华为、华三(h3c)、思科、锐捷。
6、路由器
路由器(Router)又称网关设备(Gateway)是用于连接多个逻辑上分开、相对独立的网络。
7、拓扑结构图(扩展)
所谓“拓扑”就是把实体抽象成与其大小、形状无关的“点”,而把连接实体的线路抽象成“线”,进而以图的形式来表示这些点与线之间关系的方法,其目的在于研究这些点、线之间的相连关系。表示点和线之间关系的图被称为拓扑结构图。
常见的几种拓扑结构图:
二、网络相关命令
1、ping
作用:检测当前主机与目标主机之间的连通性(不是100%准确,有的服务器是禁ping)
语法:#ping 主机地址(ip地址、主机名、域名等)
例如:测试和baidu.com之间的连通性。
该命令可以跨平台,windows下也可以使用,语法一致。(区别在于Linux下默认一直发送,windows下默认发送4个数据包)
2、netstat
作用:表示查看网络的连接信息
语法:#netstat -tnlp (-t:tcp协议,-n:将字母转化成数字,-l:列出状态为监听,-p:显示进程相关信息)
#netstat -an (-a:表示全部,-n:将字母转化为数字)
TCP/IP协议需要使用这个命令。
3、traceroute
作用:查找当前主机与目标主机之间所有的网关(路由器,会给沿途各个路由器发送icmp数据包,路由器可能会不给响应)。
该命令不是内置命令,需要安装,但是目前的已经安装好了(之前选了开发工具)。
语法:#traceroute 主机地址
类似于查看快递的跟踪路由:
扩展:在windows下也有类似的命令:tracert 主机地址
在线工具网址:站长工具 - 站长之家
4、arp
地址解析协议,即ARP(Address Resolution Protocol),是根据**IP地址获取(MAC)物理地址的协议**。
当一个主机发送数据时,首先查看本机MAC**地址缓存中有没有目标主机的MAC地址,** 如果有就使用缓存中的结果;如果没有,ARP**协议就会发出一个广播包,该广播包要求查询目标主机IP地址对应的MAC地址,拥有该IP地址的主机会发出回应,回应中包括了目标主机的MAC地址,这样发送方就得到了目标主机的MAC地址。如果目标主机不在本地子网中,则ARP解析到的MAC地址是默认网关的MAC地址**。
常用语法:#arp -a 查看本地缓存mac表
#arp -d 主机地址 删除指定的缓存记录
该命令在windows下同样适用。
5、tcpdump(了解)
作用:抓包,抓取数据表
常用语法:
#tcpdump 协议 port 端口
#tcpdump 协议 port 端口 host 地址
#tcpdump -i 网卡设备名
查看22端口(ssh)的数据包:
00:09:17.xxxx 监听数据的时分秒
IP:使用的协议类型
192.168.21.1 数据包的一个方向(来自)
> 数据的流向
192.168.21.136 数据包的另外一个方向(到达)
三、项目上线流程(必须掌握)
1、服务器选配购买
项目上线服务器必须是外网服务器。
一般服务器有2种情况:购买真实服务器、购买云服务器。
购买真实服务器一次性成本过高,所以现在基本都是选择云服务器。
云服务的厂商:阿里云、腾讯云、知道创宇(加速乐)、华为云、盛大云、新浪云(sae)、亚马逊云等等。
以后以阿里云为例:
①打开阿里云官网,选择产品中的“云服务器ECS”
在页面上点击“立即购买”:
②选择具体的配置
安全组需要先在控制面板中创建,创建好之后才能在这里进行选择(安全组类似于防火墙,可以设置相关规则):
进入后台查看信息:
需要重置密码的话,则可以选择右侧“更多”选择“重置密码”,然后重启服务器,最后可以通过远程终端连接服务器:
2、域名购买
①在首页产品中找到域名注册
域名注册得先查看是否可以注册:
选择需要的域名:
确认购买信息:
购买之后就可以在后台控制面板中去查看域名情况。
3、域名备案
备案:当申请域名的人要想在国内使用域名,则需要向当地的通信管理局(省级)去申请报备。
备案前提:想要使用境内服务器的话,则必须得备案。
在管理后台点击“ICP备案系统”
点击新增主体备案:
填写完基本信息之后点击增加网站:
备案服务号可以在控制台顶部去获取:
申请到备案服务号之后填写继续:
会让用户下载一个图片:网站真实性核验单
下载打印,填写好上传到阿里云备案系统中。
后面等待初审,初审通过之后继续下一步(初审时间一般1天即可)
拍照
上传照片
等待管局审核(到这个步骤基本是已经通过,审核周期一般是15个工作日)。
等待审核通过,就会收到工信部发送的短信与邮件通知,邮件中有备案号和备案密码(备案密码用于注销备案)。
4、域名解析
点击“解析”
解析:将域名绑定到一个服务器地址的操作
DNS:domain name server,用于将域名转化成ip地址的服务器。
点击右上角的添加记录:
选择记录:
例如:需要将www.linux123.xyz解析到之前购买的云主机上,则解析可以设置如下:
解析之后可以通过在线ping命令检测效果:
5、配置生产环境(最后1天)
6、上传代码
此时需要使用上传工具:pscp,filezilla。
和之前使用的方式一样。
Shell基础
一、关于shell
1、什么是shell
什么是shell**?**
Shell(外壳) 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
什么是脚本?
脚本简单地说就是一条条的文字命令,这些文字命令是可以看到的(如可以用记事本打开查看、编辑)。
常见的脚本: JavaScript**(JS,前端),VBScript, ASP,JSP,PHP(后端),SQL(数据库操作语言),Perl,Shell**,python,Ruby,JavaFX,Lua等。
为什么要学习和使用shell**?**
Shell属于内置的脚本
程序开发的效率非常高,依赖于功能强大的命令可以迅速地完成开发任务(批处理)
语法简单,代码写起来比较轻松,简单易学
常见的shell**种类?**
在linux中有很多类型的shell,不同的shell具备不同的功能,shell还决定了脚本中函数的语法,Linux中默认的shell是/bin/bash**(重点)**,流行的shell有ash、bash、ksh、csh、zsh等,不同的shell都有自己的特点以及用途。
csh
C shell 使用的是“类C”语法,csh是具有C语言风格的一种shell,其内部命令有52个,较为庞大。目前使用的并不多,已经被/bin/tcsh所取代。
ksh
Korn shell 的语法与 Bourne shell 相同,同时具备了 C shell 的易用特点。许多安装脚本都使用 ksh ,ksh有42条内部命令,与bash相比有一定的限制性。
tcsh
tcsh是csh的增强版,与 C shell 完全兼容。
sh
是一个快捷方式,已经被/bin/bash所取代。
nologin
指用户不能登录
zsh
目前Linux里最庞大的一种shell:zsh。它有84个内部命令,使用起来也比较复杂。一般情况下,不会使用该shell。
bash
大多数Linux**系统默认使用的shell**,bash shell 是 Bourne shell 的一个免费版本,它是最早的 Unix shell,bash还有一个特点,可以通过help命令来查看帮助。包含的功能几乎可以涵盖shell所具有的功能,所以一般的shell脚本都会指定它为执行路径。
2、shell入门
编写规范:
代码规范:
#!/bin/bash [指定告知系统当前这个脚本要使用的shell解释器]
Shell相关指令
文件命名规范:
文件名.sh .sh是linux下bash shell 的默认后缀
使用流程:
①创建.sh文件 touch/vim
②编写shell代码
③执行shell脚本 脚本必须得有执行权限
案例1:创建test.sh,实现第一个shell脚本程序,输出hello world.
输出命令:#echo 123
注意:输出的内容如果包含字母和符号(不包含变量),则需要用引号包括起来。如果是纯数字可以包也可以不包。
注意,这里在运行时一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,Linux 系统会去 PATH(环境变量) 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。
案例2:使用root用户帐号创建并执行test2.sh,实现创建一个shelltest用户,并在其家目录中新建文件try.html。
脚本执行的另外一个方式:/bin/bash 脚本的路径(了解)
Shell脚本分为简单的写法(简单命令的堆积)和复杂写法(程序的设计)
二、shell进阶(重点)
1、变量(重点)
1.1、变量的含义
a. 什么是量
量就是数据.
b. 什么是变量
数据可以发生改变就是变量.
在一个脚本周期内,**其值可以发生改变的量就是变量.**
c. 什么叫做一个脚本周期
一个脚本周期我们可以简单的理解为当前的shell文件
变量是shell中不可或缺的一部分,也是最基础、最重要的组成部分。
1.2、变量的定义与使用(重点)
变量,先定义后使用。
定义形如:class_name="yunwe "
使用形如:echo $class_name
变量就是由2部分组成,一个是变量名(左边),另外一部分是变量的值(右边)
变量名和变量值是什么关系??
变量名和变量值是使用和被使用关系; 我们的变量名来使用变量值;
在使用变量的时候一定需要在变量名前面添加一个$符号,该要求在其他语言中也存在的(例如php)。
变量名的规范
注意,变量名后面的等号左右不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线“_”。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
问题:以下哪个shell变量名是合法的? A. var B.?var C. user*name D.echo
案例1:使用变量改写入门脚本中的第1个shell脚本。
关于单双引号的问题:
双引号能够识别变量,双引号能够实现转义(类似于“***”)**
单引号是不能识别变量,只会原样输出,单引号是不能转义的
案例2:定义一个变量,输出当前时间,要求格式为“年-月-日 时:分:秒”。
注意:反引号(esc**键下方的那个键),当在脚本中需要执行一些指令并且将执行的结果赋给变量的时候需要使用“反引号”。**
1.3、只读变量(了解)
语法:readonly 变量名
案例:定义变量a并且其值为10,随后设置其为只读变量,再去尝试重新赋值
1.4、接收用户输入(重点)
语法:read -p 提示信息 变量名
案例:编写一个脚本test6.sh,要求执行之后提示用户输入文件的名称(路径),然后自动为用户创建该文件
1.5、删除变量(了解)
语法:unset 变量名
案例:定义变量b=20,再输出b的值,随后删除b,最后再输出下b
2、条件判断语句
老婆给当程序员的老公打电话:下班顺路买一斤包子带回来,如果看到卖西瓜的,买一个。当晚,程序员老公手捧一个包子进了家门…老婆怒道:你怎么就买了一个包子?!老公答曰:因为看到了卖西瓜的。
把程序员老婆的话当作一段需求分析一下吧。买一斤包子是一个确定无疑的需求项,无论后面是什么情况什么条件,前面这一斤包子是肯定要买的。看到卖西瓜的是一个条件判断,后面“买一个”是一个模糊不清的需求项,买一个什么呢?需求里没说啊。客户把这个当作开发人员默认了解的内容了。可是作为一个成熟合格的程序员,该老婆的丈夫应该马上跟进确认需求“买一个什么?”,要不然程序可怎么写呢?所以笑话里该程序员是不合格的,起码是不积极不负责的。在没有明确需求的情况下,他只能按照自己的理解来完成工作了。那比较可能的结果就有如下几种:
1 看到卖西瓜的,买一个西瓜
如果 看到卖西瓜的
那么
买一个西瓜
否则
买一斤包子
2 看到卖西瓜的,买一个包子
如果 看到卖西瓜的
那么
买一个包子
3 看到卖西瓜的,买一个卖西瓜的
4 看到卖西瓜的,买一个老婆一直想买的东西
5 看到卖西瓜的,随便买一个东西
上述1**和2下面的条件汉字描述称之为“伪代码”,也是属于条件表达式的语法。**
语法1(一个条件):
if condition
then
command1
command2
...
fi
单行写法(一般在命令行中执行的时候):if [ condition ]; then command; fi
语法2(两个条件):
if condition
then
command1
command2
...
else
command
fi
语法3(多个条件):
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
3、运算符
在shell中,运算符和其他编程脚本语言一样,常见的有算数运算符、关系运算符、
逻辑运算符、字符串运算符、文件测试运算符等
3.1、算数运算符
下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | expr $a + $b 结果为 30。 |
- | 减法 | expr $a - $b 结果为 -10。 |
* | 乘法 | expr $a \* $b 结果为 200。 |
/ | 除法 | expr $b / $a 结果为 2。 |
% | 取余 | expr $b % $a 结果为 0。 |
= | 赋值 | a=$b 将把变量 b 的值赋给 a。 |
== | 相等。用于比较两个数字,相同则返回 true(真)。 | [ $a == $b ] 返回 false(假)。 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):
#!/bin/bash
val=expr 2 + 2
echo "两数之和为 : $val"
两点注意:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
完整的表达式要被 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
3.2、关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 检测两个数是否相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
-eq:equal
-ne:not equal
-gt:great than
-lt:less than
-ge:great than or equal
-le:less than or equal
案例:使用a=10,b=20来实现本案例
课堂作业:
写一个脚本,判断当前输入的用户是否存在。如果存在则提示“用户存在”否则提示“用户不存在”。
3.3、逻辑运算符
下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算,表达式为 true 则返回 false,否则返回 true。 | [ ! false ] 返回 true。 |
-o | 或(或者)运算,有一个表达式为 true 则返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
-a | 与(并且)运算,两个表达式都为 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
或运算:一个为真即为真,全部为假才是假
与运算:一个为假即为假,全部为真才是真
3.4、字符串运算符
下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 检测两个字符串是否相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
-n | 检测字符串长度是否为0,不为0返回 true。 | [ -n $a ] 返回 true。 |
str | 检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |
案例:将上述的语法验证下
3.5、文件测试运算符(重点)
文件测试运算符用于检测 Unix/Linux 文件的各种属性。
属性检测描述如下:
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
-d file | 检测文件是否是目录,如果是,则返回 true**。** | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true**。** | [ -f $file ] 返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回 false。 |
-p file | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] 返回 false。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] 返回 false。 |
-r file | 检测文件是否可读,如果是,则返回 true**。** | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true**。** | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true**。** | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于**0),不为空返回** true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true**。** | [ -e $file ] 返回 true。 |
案例:测试上述标绿色的效果
注意:权限几个判断,如果只有一个部分符合,则认为是有权限的。
4、shell脚本附带选项(重点)
问题描述:在linux shell中如何处理tail -10 access.log这样的命令行选项?
步骤:
调用tail指令
系统把后续选项传递给tail
Tail先去打开指定的文件
取出最后10行
问题:自己写的shell是否也可以像内置命令一样传递一些选项呢?
答:可以的,传递方式与上述的描述是一样的,关键是怎么接收。例如:
传递:
#./test.sh a b c
接收:
在脚本中可以用“$1”来表示a,“$2”来表示b,以此类推。
接收可以用“$**”加上选项对应的序号即可。**
测试:编写test14.sh,传递a,b,c,输出其值
其实$1、$2是变量。
练习:创建自定义指令“**user”**,可以直接执行,要求该指令具备以下语法和功能:
a. #user -add 用户名 【添加用户】
b. #user -del 用户名 【删除用户及其家目录】
同时题目中要求是指令,所以可以再去添加个别名:
LINUX安装nginx详细步骤
1.安装依赖包
一键安装上面四个依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
2.下载并解压安装包
//创建一个文件夹 cd /usr/local mkdir nginx cd nginx //下载tar包 wget http://nginx.org/download/nginx-1.13.7.tar.gz tar -xvf nginx-1.13.7.tar.gz
3.安装nginx
//进入nginx目录 cd /usr/local/nginx //进入目录 cd nginx-1.13.7 //执行命令 考虑到后续安装ssl证书 添加两个模块 ./configure --with-http_stub_status_module --with-http_ssl_module //执行make命令 make //执行make install命令 make install
4.启动nginx服务
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 4.配置nginx.conf
打开配置文件
vi /usr/local/nginx/conf/nginx.conf 将端口号改成8089(随便挑个端口),因为可能apeache占用80端口,apeache端口尽量不要修改,我们选择修改nginx端口。
将localhost修改为你服务器的公网ip地址。
5.重启nginx
/usr/local/nginx/sbin/nginx -s reload
查看nginx进程是否启动:
ps -ef | grep nginx
6.若想使用外部主机访问nginx,需要关闭服务器防火墙或开放nginx服务端口,端口为上一步nginx.conf的配置端口:
centOS6及以前版本使用命令: systemctl stop iptables.service
centOS7关闭防火墙命令: systemctl stop firewalld.service
关闭防火墙会导致服务器有一定风险,所以建议是单独开放服务端口 :
开放80端口:
firewall-cmd --zone=public --add-port=80/tcp --permanent
查询端口号80 是否开启:
firewall-cmd --query-port=80/tcp
重启防火墙:
firewall-cmd --reload
随后访问该ip:端口 即可看到nginx界面。
7.访问服务器ip查看(备注,由于我监听的仍是80端口,所以ip后面的端口号被省略)
安装完成一般常用命令
进入安装目录中,
命令: cd /usr/local/nginx/sbin
启动,关闭,重启,命令:
./nginx 启动
./nginx -s stop 关闭
./nginx -s reload 重启