Liunx之基础学习

用户提权命令之 -sudo

sudo 命令用来以其他身份来执行命令,预设的身份为 root。在/etc/sudoers中设置了可执行 sudo 指令的用户。若其未经授权的用户企图使用 sudo,则会发出警告的邮件给管理员。用户使用 sudo 时,必须先输入密码,之后有 5 分钟的有效期限,超过期限则必须重新输入密码。

语法:

sudo 【选项】【参数】
-b:在后台执行指令;
-h:显示帮助;
-H:将 HOME 环境变量设为新身份的 HOME 环境变量;
-k:结束密码的有效期限,也就是下次再执行 sudo 时便需要输入密码;。
-l:列出目前用户可执行与无法执行的指令;
-p:改变询问密码的提示符号;
-s<shell>:执行指定的 shell;
-u< 用户 >:以指定的用户作为新的身份。若不加上此参数,则预设以 root 作为新的身份;
-v:延长密码有效期限 5 分钟;
-V :显示版本信息。

实例

这个 sudo 命令用在什么时候呢?

看图

 

怎么办?权限不够,这时候需要 sudo ls /root  以 root 身份去运行,chaoge 权利小,root 总可以了吧!!

这是由于配置 sudo 必须编辑 /etc/sudoers 文件,并且只有 root 才能修改,咱们可以通过 visudo 命令直接编辑 sudoers 文件,使用这个命令还可以检查语法,比直接编辑 vim /etc/sudoers 更安全

visudo 编辑 sudoers 文件

写入
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
chaoge ALL
=(ALL) ALL #允许 chaoge 在任何地方,执行任何命令

此时切换 chaoge 用户
#su 命令用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码。
su - chaoge
已经可以使用 sudo ls /root 命令
若想取消用户的 sudo 这个权限 在 sudoeres 将该用户删除即可

文件目录与权限

Linux 权限的目的是(保护账户的资料)

Linux 权限主要依据三种身份来决定:

  • user/owner 文件使用者, 文件属于哪个用户
  • group 属组, 文件属于哪个组
  • others 既不是 user,也不再 group,就是 other,其他人

什么是权限#

在 Linux 中,每个文件都有所属的所有者,和所有组,并且规定了文件的所有者,所有组以及其他人对文件的,可读,可写,可执行等权限。

对于目录的权限来说,可读是读取目录文件列表,可写是表示在目录内新增,修改,删除文件。可执行表示可以进入目录

解读上图:

  1. 权限,第一个字母为文件类型,后续 9 个字母,每 3 个一组,是三种身份的权限
  2. 文件链接数
  3. 文件拥有者 - 属主
  4. 文件拥有组 - 属组
  5. 文件大小
  6. 最后一次被修改的时间日期
  7. 文件名 

先来分析一下文件的类型

-    一般文件
d    文件夹
l    软连接(快捷方式)
b    块设备,存储媒体文件为主
c    代表键盘, 鼠标等设备

文件权限#

r    read 可读,可以用 cat 等命令查看
w    write 写入,可以编辑或者删除这个文件
x    executable    可以执行

目录权限#

权限这里测试不要用 root 实验!!!!root 太牛逼了

请用普通用户执行!!!!!测试文件、文件夹权限操作,请用普通用户!

r    可以对此目录执行 ls 列出所有文件
w    可以在这个目录创建文件
x    可以 cd 进入这个目录,或者查看详细信息

权限与数字转化

修改文件权限属性#

普通用户只能修改自己的文件名,时间与权限(注意)
因此修改其他用户权限,只能用最 nb 的 root 用户
当前文件信息
-rw-r--r--. 1 root root      0 Jun 28 14:36 小护士电话.txt

修改属主:
chown roo 小护士电话.txt
查看信息:
-rw-r--r--. 1 roo root 0 Jun 28 14:36 小护士电话.txt

修改属组:
chgrp roo 小护士电话.txt
查看信息:
-rw-r--r--. 1 roo roo 0 Jun 28 14:36 小护士电话.txt

修改文件权限#

我们已知三种身份权限(属主,属组,其他人),每种身份都有 rwx 的三种权限,系统还提供了数字计算权限。

r    read          4
w    write        2
x    execute     1

每种身份最低是 0 分,最高是 r+w+x 7 分

因此三种身份,最高权限是 777,最低是 000

-rw-rw-r-- 1 root root 0 8 月  11 16:41 pyyu.txt
因此可知 pyyu.txt 的权限是
属主是 6 r+w(4+2)
属组是 6 r+w(4+2)
其他人是 4 r(4)

命令:

chmod

chmod [身份]   [参数]   [文件]
    u(user)   +(添加)  
    g(group)   -(减去)
    o(other)  =(赋值)
    a(all)

例如:

当前权限
-rw-rw-r-- 1 root root 0 8 月  11 16:41 11.txt
方法 1
减去属主的写权限
chmod u-w 11.txt
查看权限
-r--rw-r-- 1 root root 0 8 月  11 16:41 11.txt

方法 2
属主添加可读可写可执行权限
chmod 700 11.txt

属主可读可写可执行
属组可读可执行
其他人可读可执行
chmod 755 11.txt

软链接

软连接也叫做符号链接,类似于 windows 的快捷方式。

常用于安装软件的快捷方式配置,如 python,nginx 等

ln -s 目标文件  软连接名

1. 存在文件 /tmp/test.txt
[root@master tmp]
# ls -l
-rw-r--r-- 1 root root 10 10 月 15 21:23 test.txt

2. 在 /home 目录中建立软连接,指向 /tmp/test.txt 文件
ln
-s /tmp/test.txt my_test

3. 查看软连接信息
lrwxrwxrwx
1 root root 13 10 月 15 21:35 my_test -> /tmp/test.txt

4. 通过软连接查看文件
cat my_test

my_test 只是 /tmp/test.txt 的一个别名,因此删除 my_test 不会影响 /tmp/test.txt,但是删除了本尊,
快捷方式就无意义不存在了

PS1 变量

Linux 命令提示符由 PS1 环境变量控制

[root@oldboy_python ~]# echo $PS1
[\u@\h \W]\$
一定要用单引号设置
可以自行调整全局变量/etc/profile 文件用于永久生效 PS1='[\u@\h \W\t]\$'
\d  日期
\H  完整主机名
\h  主机名第一个名字
\t  时间 24 小时制 HHMMSS
\T  时间 12 小时制
\A  时间 24 小时制 HHMM
\u  当前用户账号名
\v  BASH 的版本
\w  完整工作目录
\W  利用 basename 取得工作目录名
\#  下达的第几个命令
\$  提示字符,root 为#,普通用户为 $
PS1 > 变量名
$PS1 > 查看变量内容
PS1=新内容 重新赋值

变量赋值,查看
name='chaoge'
echo $name

PS1 显示 ip 地址
export PS1="[\u@\h /sbin/ifconfig ens33 | sed -nr 's/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' \w]$"

linux 的网络端口管理命令

netstat [选项]
-t 或 --tcp:显示 TCP 传输协议的连线状况;
-u 或 --udp:显示 UDP 传输协议的连线状况;
-n 或 --numeric:直接使用 ip 地址,而不通过域名服务器;
-l 或 --listening:显示监控中的服务器的 Socket;
-p 或 --programs:显示正在使用 Socket 的程序识别码和程序名称;
-a 或 --all:显示所有连线中的 Socket;

linux 进程管理

ps -ef  显示所有进程
通过进程 id 号管理

#杀死进程的命令
kill 进程 id

kill 还有一个参数 -9 参数

kill -9 用于杀死不重要的僵尸进程 , 强制杀死进程
批量杀死进程的命令
pkill 进程的名字

tree

安装:yum install -y tree

tree 命令以树状图列出目录的内容。

-a:显示所有文件和目录;
-A:使用 ASNI 绘图字符显示树状图而非以 ASCII 字符组合;
-C:在文件和目录清单加上色彩,便于区分各种类型;
-d:先是目录名称而非内容;
-D:列出文件或目录的更改时间;
-f:在每个文件或目录之前,显示完整的相对路径名称;
-F:在执行文件,目录,Socket,符号连接,管道名称名称,各自加上"*""/""@""|"号;
-g:列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码;
-i:不以阶梯状列出文件和目录名称;
-l:< 范本样式 > 不显示符号范本样式的文件或目录名称;
-l:如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录;
-n:不在文件和目录清单加上色彩;
-N:直接列出文件和目录名称,包括控制字符;
-p:列出权限标示;
-P:< 范本样式 > 只显示符合范本样式的文件和目录名称;
-q:用“?”号取代控制字符,列出文件和目录名称;
-s:列出文件和目录大小;
-t:用文件和目录的更改时间排序;
-u:列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码;
-x:将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该目录予以排除在寻找范围外。

dns 解析流程

#dns 解析流程
1. 浏览器输入域名的时候, 浏览器优先去 hosts 文件中寻找是否有对应记录
2. 没有记录就去 dns 本地缓存中寻找, 是否有记录
3. 寻找是否配置了 dns 服务器, 然后去公网中寻找记录
4. 找到了就缓存到本地 dns 记录中,
5. 解析结束
#dns 域名解析系统 

作用: 把域名解析为 ip 地址, 网络中的一个超大电话簿

公网中, 存在 dns 服务器, 进行解析

在 linux 中的 dns 服务器配置文件是

/etc/resolv.conf 里面定义了网络中的 dns

dns :
阿里巴巴: 223.5.5.5 223.6.6.6
腾讯的 dns:
119.29.29.29
谷歌的 dns:
8.8.8.8
114 的 dns:
114.114.114.114

#hosts 文件, 强制解析了, 也可能更换了你的 dns 记录, 用于测试本地的假域名

定时任务

什么是计划任务:
后台运行,到了预定的时间就会自动执行的任务,前提是:事先手动将计划任务设定好。这就用到了 crond 服务
crond 服务相关的软件包
[root@MiWiFi-R3-srv ~]# rpm -qa |grep cron
cronie-anacron-1.4.11-14.el7.x86_64
crontabs-1.11-6.20121102git.el7.noarch
cronie-1.4.11-14.el7.x86_64

这些包在最小化安装系统时就已经安装了,并且会开机自启动 crond 服务,并为我们提供好编写计划任务的 crontab 命令。

crontab 命令被用来提交和管理用户的需要周期性执行的任务,与 windows 下的计划任务类似

语法:

crontab (选项)(参数)
-e:编辑该用户的计时器设置;
-l:列出该用户的计时器设置;
-r:删除该用户的计时器设置;
-u< 用户名称 >:指定要设定计时器的用户名称。

存放定时任务的文件
/var/spool/cron

注意:

1 . 查看计划任务的执行:tail -f /var/log/cron

2. 写计划任务时,命令必须加上绝对路径,否则会出现这种情况:从日志中看,确实触发了计划任务的执行,但是命令却没有执行成功,比如 * * * * * reboot 就会出现这种情况,需要将 reboot 写成 /usr/sbin/reboot

3.  计划任务执行的命令 是否存在,软件是否安装  

4. 确保 crontab 服务运行  

systemctl status cron

ps -ef|grep crond

5. 检测 crontab 是否开机启动

systemctl is-enabled crond

编辑定时任务:

crontab   -e  #编辑定时任务的文件

crontab   -l  #列出定时任务的规则

crontab 配置文件:

在 /etc 目录下有一个 crontab 文件,这个就是系统任务调度的配置文件
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
#
.---------------- minute (0 - 59)
#
| .------------- hour (0 - 23)
#
| | .---------- day of month (1 - 31)
#
| | | .------- month (1 - 12) OR jan,feb,mar,apr ...
#
| | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
#
| | | | |
#
* * * * * user-name command to be executed
 分 时 日 月 周

View Code

crontab 任务配置基本格式:

crontab 任务配置基本格式:
*  *  *  *  *  command
分钟 (0-59) 小时 (0-23) 日期 (1-31) 月份 (1-12) 星期 (0-6,0 代表星期天 )  命令

第 1 列表示分钟 1~59 每分钟用 * 或者 */1 表示
第 2 列表示小时 1~
23(0 表示 0 点)
第 3 列表示日期 1~
31
第 4 列表示月份 1~
12
第 5 列标识号星期 0~
6(0 表示星期天)
第 6 列要运行的命令

星号():代表所有可能的值,例如 month 字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
30 08 * * 每天 8.30 去上班
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“
1,2,5,7,8,9
中杠(
-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6
正斜线(
/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如
/10,如果用在 minute 字段,表示每十分钟执行一次。
/3 * * * * /usr/sbin/ntpdate ntp1.aliyun.com 每隔三分钟执行下时间同步

View Code

所有命令一定要用绝对路径来写!

分  时   日  月  周   你要执行的命令的绝对路径
*   *    *   *   *    

#每分钟执行一次命令

        • * 命令绝对路径

#每小时的 3,15 分组执行命令
分 时 日 月 周 你要执行的命令的绝对路径
3,15 * * * *

#每小时的整点执行命令
0 * * * *

#在上午 8-11 点的第 3 和第 15 分钟执行
3,15 8-11 * * *

#每晚 21:30 执行命令
30 21 * * *

#每周六、日的下午 1:30 执行命令
30 13 * * 6,0

#每周一到周五的凌晨 1 点,清空 /tmp 目录的所有文件
0 1 * * 1-5 /usr/bin/rm -rf /tmp/*

#每晚的 21:30 重启 nginx
30 21 * * * /usr/bin/systemctl restart nginx

#每月的 1,10,22 日的 4:45 重启 nginx
45 4 1,10,22 * * /usr/bin/systemctl restart nginx

#每个星期一的上午 8 点到 11 点的第 3 和 15 分钟执行命令
3,15 8-11 * * 1

 

配置阿里云的 yum 源的步骤

1
2
3
#linux的yum仓库目录是:
cd /etc/yum.repos.d/   这个目录下,第一层中,所有以.repo结尾的文件,都会识别为一个yum仓库
(这个仓库就是一个url),url中提供了各种rpm包的下载,yum工具回去查找
配置阿里云的 yum 源的步骤
1. 地址如下:https://opsx.alibaba.com/mirror

2. 备份原本的 yum 仓库文件
cd
/etc/yum.repos.d
#新建文件夹
mkdir allrepo
#移动所有的 repo 文件到这个目录下, 咱不用它了
mv * ./allrepo

3. 下载新的阿里云的 yum 仓库文件

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#-O 代表把 Centos-7.repo 下载到指定目录, 且改名

4. 配置额外的第三方仓库
wget
-O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

5. 可以测试 yum 工具安装一个 nginx
yum install nginx
-y

6. 启动 nginx 测试访问
systemctl start nginx
7、关闭 nginx
systemctl stop nginx

yum 还提供了哪些用法

yum repolist all        列出所有仓库
yum list all            列出仓库所有软件包
yum info 软件包名            查看软件包信息
yum install 软件包名        安装软件包
yum reinstall 软件包名    重新安装软件包
yum update    软件包名        升级软件包
yum remove    软件包名        移除软件包
yum clean all            清楚所有仓库缓存
yum check-update        检查可以更新的软件包
yum grouplist            查看系统中已安装的软件包
yum groupinstall 软件包组    安装软件包组

centos7 用 systemctl 管理服务
例如:
systemctl start/stop/reload/restart/ nginx

systemctl enable nginx #设置 nginx 开机自启
systemctl disable nginx #禁止 nginx 开机自启

systemctl stop firewalld
#临时关闭防火墙服务
systemctl disable firewalld #永久关闭开机自启

python 的虚拟环境工具安装

 (注意, 你的 PATH 变量, 编译安装的 python3 一定要放在最前面)

1、下载虚拟环境工具 (这里是在物理环境下安装的)
    pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv

2、创建虚拟环境, 分别运行一个 django1 和 django2
进入一个统一管理的目录, 管理虚拟环境例如
/opt/allenv
mkdir
/opt/allenv
cd
/opt/allenv
# 创建虚拟环境命令
virtualenv --no-site-packages --python=python3 venv1

#参数解释
--no-site-packages 不要任何的第三方包
--python 是指定一个解释器 我们选的是 python3
venv1 是虚拟环境文件夹的名字, 自定义

3、进入虚拟环境目录, 激活虚拟环境
source 是 linux 的读取命令, 读取一个脚本文件, 激活虚拟环境
source
/opt/allenv/venv1/bin/activate

4、虚拟环境使用原理是, 修改了 PATH 变量, 根据 pATH 的优先级, 使用解释器
echo $PATH

5、激活虚拟环境, 在 venv1 下创建 django1.11.9 项目
pip3 install django
==1.11.9

6、再开一个窗口, 创建 venv2, 用于创建 django2 的项目
django
-amind startproject mydjango01
7、退出虚拟环境的命令
deactivate

解决 python 的环境一致性问题

(将 windows 中解释器的模块, 导出到一个文件, 然后发送给 linux 一个新的虚拟环境安装即可)

1. 在 windows 中导出所有的模块信息
    pip3 freeze >  requirements.txt 

2. 将次文件, 发送给 linux 服务器, 可选 lrzsz 或 scp

3. 在 linux 中安装即可
# 相对路径安装
pip3 install -i https://pypi.douban.com/simple -r requirements.txt
# 绝对路径安装
pip3 install -i https://pypi.douban.com/simple -r /opt/Python-3.6.2/requirements.txt

window 中也创建了虚拟环境, 并且模块都在虚拟环境下
想要导出这个虚拟环境中的模块, 给 linxu

步骤:
1. 第一步, 在 windows 中激活虚拟环境, 在虚拟环境下
pip3 freeze >  requirements.txt 

2. 将次文件, 发送给 linux 服务器, 可选 lrzsz 或 scp

3. 在 linux 中安装即可
pip3 install
-i https://pypi.douban.com/simple -r requirements.txt

virtualenvwrapper 工具

1、安装工具 (退出虚拟环境)

1
pip3 install -i https://pypi.douban.com/simple  virtualenvwrapper

2、配置用户个人变量配置文件, 每次开机都加载这个 virtualevnwrapper 工具

1
2
3
4
5
6
7
8
9
10
11
12
13
#系统变量配置文件
/etc/profile 
#个人用户变量配置文件,在用户家目录下找到这个~/.bash_profile文件,写入如下配置
vim  ~/.bash_profile    #打开文件,写入如下变量
 
#设置virtualenv的统一管理目录
export WORKON_HOME=~/Envs  
#添加virtualenvwrapper的参数,生成干净隔绝的环境
export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages'  
#指定python解释器
export VIRTUALENVWRAPPER_PYTHON=/opt/python36/bin/python    
#只有这一步,才是让这个工具生效的!!!!!!!
source /opt/python36/bin/virtualenvwrapper.sh

3、退出会话, 重新登录, 查看是否加载了 virtualenvwrapper 工具

1
deactivate

4、工具创建后, 使用命令管理

1
2
3
4
5
4.工具创建后,使用命令管理
#创建虚拟环境 
#创建虚拟环境后会自动激活
mkvirtualenv  django1
mkvirtualenv  django2

5、激活虚拟环境

1
2
#激活虚拟环境
workon  虚拟环境的名字(支持tab补全) 
lsvirtualenv   #列出所有虚拟环境的目录

cdvirtualenv   #进入已激活的虚拟环境的目录

cdsitepackages  #进入虚拟环境下的第三方模块目录