Nginx - HTTP server / wsgi
MySQL - Persestence/RDB 关系型数据库 SQL语言 持久化 方便、快速的存取 保证数据的有效性
Cluster 集群,N个服务器 + Nginx/Load Balance 负载均衡 + Keepalived 热备
Redis - High Speed Cache/NoSQL(= Not Only SQL)高速缓存服务
查看进程:ps - process state
新增用户:adduser
修改/新增密码:passwd + 用户名
切换用户:su - switch user
重启:reboot/init 6
关机:shutdown/init 0
显示连接用户:who/who am i/w
历史命令:history
执行历史命令:!+ 历史编号
查看当前工作路径:pwd - print working directory
切换目录:cd - change directory
列出当前目录下的文件:ls - list directory contents
列出当前目录下的文件(含隐藏文件):ls -a
以长格式列出当前目录下的文件:ls -l 或 ll
以长格式列出当前目录下的文件(含隐藏文件):ls -la 或ls -l -a
注:长格式中:‘r - read读 w - write写 x - execute执行’
查看内容前n行(不写-n,默认前10行):head -n 文件名
查看内容后n行(不写-n,默认后10行):tail -n 文件名
回到当前用户主目录:cd ~
以.开头的文件或文件夹为隐藏文件
查看文件里面的内容:cat + 文件名
查看命令手册(manual):man + 命令
查看命令详细信息(information):info + 命令
查看命令简略帮助信息:命令 + –help
(–help|less 或–help|more 一页页的显示)
创建空文件:touch +文件名
删除文件:rm + 文件名
强制删除文件:rm -f +文件名
创建文件夹: mkdir + 文件名
删除空文件夹: rmdir + 文件名
强制删除文件夹: rm -rf + 文件名
回声命令:echo
拷贝:cp +文件名 a/修改后文件名(不写则默认不改文件名)
剪切/改名字:mv +文件名 a/修改文件名(不写则默认不改文件名)
往文件内写入内容: echo ‘内容’ > 文件名
比较两个文件内的内容,找出不同:diff A文件名 B文件名
字符统计,查出文件内字符数量:wc +文件名
结果(行数,单词数,字符数(含末尾光标))
字符统计,查出文件内指定字符数量:grep -o 字符名 文件名|wc -l
检查文件类型:file + 文件名
联网:wget +域名
联网下载指定文件名:wget +域名 -O +文件名
查找文件内指定内容:cat +文件名|grep +内容
文件内容去重:uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][–help][–version][输入文件][输出文件]
uniq +文件名 去除文件内的重复内容
uniq -c 文件名 检查文件并删除文件中重复出现的行,并在行首显示该行重复出现的次数
文件内容排序:sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][–help][–verison][文件]
sort +文件名 文件内的排序
压缩:gzip +文件名
解压缩:gunzip +文件名
一起归档:tar -cvf 指定文件名 +需归档文件名(*.txt即所有的txt格式文件)
解档: tar -xvf 指定文件名
命令所在路径:which +命令
查看所有包含该命令所在路径:whereis +文件名
日历:cal +年份
录制脚本(记录操作):script +文件名(默认为typescript)
(退出:exit)
同一Linux不同用户相互之间可以发信息:write +用户名
可以直接发送警告:wall +内容 (所有用户都可以收到)
杀掉进程:kill +进程号
强制杀掉进程:kill -9 +进程号
新增/修改当前用户权限:chmod u+x +文件名
(x:执行;r:读;w:写)
去掉当前用户权限: chmod u-x +文件名
同组用户增加权限:chmod g+x +文件名
其他用户增加权限:chmod o+x +文件名
所有用户修改权限为可读可写可执行:chmod 777 +文件名
(-rwxrwxrwx 当前用户、同组用户、其他用户 二进制:111 111 111 也就是777)
执行文件:./文件名
python2中可读汉字(页首写):#* coding:utf-8 *
移除软件:remove
查进程:ps -aux 或ps -ef
列出安装的软件:yum list installed
centos 7 防火墙:firewalld
查看防火墙状态:firewall-cmd –state
查看服务状态:systemctl status 服务名
停止防火墙:systemctl stop firewalld
系统控制(centos7): systemctl
重启防火墙:firewall-cmd –reload
那怎么开启一个端口呢
添加
firewall-cmd –zone=public –add-port=80/tcp –permanent (–permanent永久生效,没有此参数重启后失效)
重新载入
firewall-cmd –reload
查看
firewall-cmd –zone= public –query-port=80/tcp
删除
firewall-cmd –zone= public –remove-port=80/tcp –permanent
(其它低版本:servies)
安装rpm文件:rpm -iv 文件名
查看端口状态:netstat -na|grep 端口号
查看端口号及其进程:netstat -nap|grep 端口号
将信息放入指定文件:netstat -nap > 文件名
将错误信息放入指定文件:netstat -nap 2> 文件名
停止nginx:nginx -s stop
远程连接到其他服务器:ssh 用户名@IP地址
网络拷贝
本地复制到远程:scp 地址及文件名 用户名@IP地址:下载到指定地址及文件名
远程复制到本地:scp 用户名@IP地址:地址及文件名 下载到指定地址及文件名
上传与下载前奏:sftp 用户名@IP地址
下载:get 文件名
上传:put 文件名
nat:网络地址转换
路由器端口映射:外网可以访问内网
找当前目录下文件:find -name 文件名
找内容(n为行号,R为递归的寻找,均可省略):grep “字符” 文件名 -n -R
xargs
创建符号链接(硬链接。新建一个链接B指向A,AB都是打开同一文件):ln 文件名A 文件名B
注:此处A和B都指向文件源,删除一个,另一个不受影响,相当于不占用空间的情况下做了备份
软链接(相当于windws下的快捷方式,新建一个链接B,为A的快捷方式):ln -s 文件名A 文件名B
redis后台运行(多一个&):redis-sever myredis.conf &
redis后台运行(重定向,输出到指定文件):redis-server myredis.conf > 文件名 &
后台运行的任务放到前台(%后面的数字代表第几个任务):fg %1
启动服务端:redis-cli
输密码:auth 密码
访问
计划任务定时执行:crontab
进入当前用户的工作表编辑:crontab -e
每行是一个命令:时间+动作 ==> * * * * * 动作
号分别代表:分(0-59)、时(0-23)、日(1-31)、月(1-12)、 周(0-6,0代表周日) ==> * * * *
*取值范围内所有的数字
/每过多少个数字
-从X到Z
,散列数字
例:45 4 1,10,22 5 */ect/init.d/smb restart
意思是:5月的1、10、22日的4点45重启smb
自己写的程序开机自启
方法一:
cd /etc
vi rc.local
添加要执行的程序地址:
例如:/home/xl/./hello.py
那么开机就会执行该python程序(前提hello.py改为可执行)
方法二、
可以利用crontab实现
方法三、
系统服务的启动就是通过“/etc/rc.d/init.d”中的脚本文件实现的。我们也可以写一个自己的脚本放在这里。
脚本文件的内容也很简单,类似于这个样子(例如起个名字叫做“hahad”):
. /etc/init.d/functions
start() {
echo “Starting my process ”
cd /opt
./haha.sh
}
stop() {
killall haha.sh
echo “Stoped”
}
写了脚本文件之后事情还没有完,继续完成以下几个步骤:
chmod +x hahad #增加执行权限
chkconfig –add hahad #把hahad添加到系统服务列表
chkconfig hahad on #设定hahad的开关(on/off)
chkconfig –list hahad #就可以看到已经注册了hahad的服务
这时候才完成了全部工作。
取得进程号并关闭
ps -aux|grep 进程名|awk ‘{print $2}’|xargs kill
在任意目录下都可以执行mycal ==> ln -s /root/mycal /usr/bin/mycal
root文件夹下所有可执行程序在任意目录下都可执行:
cd ~
vi .bash_profile
在bin后加:/root
定义用户登录可执行的动作:
vi .bash_profile
export PASH 的下一行添加动作就可以了
例如:
echo Welcome to my world!
定义开机执行的动作:
cd /etc
vi rc.local
最后一行添加动作就可以了
例如:nginx
创建文件:vi +文件名(若有则打开该文件)
i
esc
在命令行时:
:set nu :列号
:set nonu :取消列号
:syntax on:高亮语法
:set ts=4 制表键改成4个空格
dd:删整行
dw:删一个单词
u:撤销
5dd:删5行
G:到最后一行
gg:到第一行
100G:到100行
/字符 查找字符
n 重复上一个搜寻
:1,$s/word1/word2/g ==>从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !(常用)【g全局搜索,gc为全局搜索且每次修改需确认 gice==> 全局,忽略大小写,修改需确认,不显示错误】
开始录制宏(宏的名字只能是abcd中的一个):qa
结束录制:q
宏录制的内容重复执行n遍:n@a
用正则表达式需转义\
定义缩写书写方式,即短缩写代替长的代码,下次使用直接可以调出:
命令模式下: :abbr 字符 长字符
(退出后,下次进入就么没有了)
定义快捷键,命令模式下:
:map 快捷键 命令A
注:关系型数据库 ==> 关系代数 + 集合论
用二维表组织数据
SQL ==> 自己的编程语言 ==> 结构化查询语言
安装数据库客户端及服务器:yum install mariadb-server mariadb
启动数据库服务器:systemctl start mariadb
停止数据库服务器:systemctl stop mariadb
连接本地数据库服务器:mysql -u root -p
连接其他用户的数据库服务器:mysql -h ip地址 -u 用户名 -p
显示所有数据库:show databases; (有分号哦)
要使用mysql数据库:use mysql
查看表内所有行所有列:select * from user;
查询用户名、连接方、密码:select user, host, password from user;
修改连接方访问,远程连接(%为所有人):update user set host=’%’ where host=’xxx’ and user=’root’;
查看网络端口是否正常:netstat -na|grep 端口号
数据库服务开机自启:systemctl enable mariadb
取消数据库服务开机自启:systemctl disable mariadb
– SQL: Structured Query Language
– DDL: create / drop / alter
– DML: insert / delete / update
– DQL: select
– DCL: grant / revoke
自增:auto_increment
通过主键id 与外键sid 将多个表格联系起来 进行查询(例如:学生,班级,信息三个表格)
select * from table1 t1, table t2, table3 t3
where name=” and t1.id=t2.sid and t3.sid=t2.id
倒序查询:select * from student order by (-id);
desc 看表的结构
函数返回表中的记录数:count(*)
根据一个或多个列对结果集进行分组: group by()
modify 修改类型:alter table 表格名称 modify 项目名称 改后的类型;
change 修改类型:alter table 表格名称 change 改前的项目名称 改后的名称 改后的类型;
关键字==>max,min,avg,求最大值,最小值,平均值: select 关键字 from student;
给表TbSC添加外键约束;
(on delete cascade – 主键删除时此外键也删除)
(on update cascade – 主键更新改变时外键也更新)
(on delete set null – 主键删除时,外键值设置为null)
alter table TbSC add constraint fk_cid foreign key (sid) references bStudent(stuid) on delete cascade on update cascade;
where 里面不能写聚合函数直接判断,但是having可以:
select * from A group by XX having avg(XXX)>=90;
表达式:IF( expr1 , expr2 , expr3 )
expr1条件,条件为true,则值是expr2 ,false,值就是expr3
IFNULL( expr1 , expr2 )
在 expr1 的值不为 NULL的情况下都返回 expr1,否则返回 expr2
– SQL (结构化查询语言-Structure Query Laguage)
– DDL (数据定义语言)creat 创建/ drop 删除 /alter 修改
– DML
– DQL
– DCL
– 创建comany数据库
drop database if exists company;
create database company default charset utf8;
– 关系型数据库用二维表组织数据
– 关系型数据库有自己的编程语言
– 切换到campany数据库
use company;
– 创建部门表
– 能够唯一确定一条记录的列可以设置为主键
– 删表
drop table if exists tb_dept;
create table tb_dept
(
deptno integer not null comment ‘部门编号’,
dname varchar(20) not null comment ‘名称’,
dloc varchar(10) comment ‘所在地’,
primary key (deptno)
);
alter table tb_dept add ddate date not null comment ‘成立日期’;
– 向部门表添加数据
insert into tb_dept values (10, ‘财务部’, ‘成都’,now());
insert into tb_dept (deptno, dname) values (20, ‘研发部’);
insert into tb_dept (deptno, dname) values (30, ‘销售1部’), (40, ‘销售2部’), (50, ‘后勤部’);
– 删除数据(注意:一定要带上条件)
delete from tb_dept where deptno=50;
update tb_dept set dloc=’深圳’, ddate=’2018-4-1’ where deptno=30;
update tb_dept set dloc=’成都’, ddate=’2018-4-3’ where deptno=20 or deptno=40;
– 查所有行所有列
select * from tb_dept;
– 投影
select deptno, dname from tb_dept;
– 别名
select deptno as 部门编号, dname as 部门名称 from tb_dept;
– 筛选
select deptno, dname from tb_dept where dloc=’深圳’;
连接redis客户端并解决中文乱码问题:
redis-cli –raw
redis五大类型:string类型 hash list set zset
set p 1 设置 p的值为1
get p 获取p的值
incr p 整数加1
decr p 整数减1
字符串(string):
增:
1.设置新值并覆盖原有值:
set 键 键值
2.设置值,取值同时进行(取到的值是设置之前的值):
getset 键 键值
3.设置值,并制定存在时间,在存在时间内才能取到该值:
setex 键 时间 键值
4.只有在该键不存在时,为该键设置新值:
setnx 键 键值
5.批量设置键:
mset 键 键值 键 键值 …
删:
1.删除已有键:
del 键
改:
1.若键不存在则新建并返回值的长度,若键存在则追加在键值末尾并返回追加后值得长度:
append 键 键值
2.若值不存在则新建并将值设为0并+1返回加后的值,若存在则值+1返回加后的值:
incr 键
注:incrby 键 值 和上面的区别在于加的值不是1而是这里面的值
注:decrby 键 值 和incrby相反,这里是减
decr 键 和incr相反,这里是减
3.用指定的字符串覆盖给定 key 所储存的字符串值,覆盖的位置从偏移量 offset+1(offset为数字) 开始:
注:如果offset比当前key对应string还要长,那这个string后面就补0以达到offset。不存在的key被认为是空字符串
setrange 键 offset 指定字符
查:
1.判断该键是否存在,存在则返回1,不存在则返回0:
exists 键
2.获取键对应的值:
get 键
3.获取指定键的值的字符长度(空字符串返回0):
strlen 键
4.查看指定键的剩余存活时间(秒数),若键存在但未设置时间返回-1,若键不存在则返回-2:
ttl 键
哈希(hash):
新增与赋值:hset 哈希名 键 键值
获取所有:hgetall 哈希名
获取所有键:hkeys 哈希名
获取所有值:hvals 哈希名
删除键:hdel 哈希名 键
列表(list):
左插入:lpush 列表名 键值
右插入: rpush 列表名 键值
左删除:lpop 列表名
右删除:rpop 列表名
查:lrange 列表名 开始位置 结束位置
集合(set):
新增和赋值:sadd 集合名称 键值
查长度:scard 集合名称
删除(随机删除):spop 集合名称
查看集合:smembers 集合名称
有序集合(zset):
新增和赋值:zadd 集合名称 键值 排序时返回的值K
获取键值:zscore 集合名称 排序时返回的值K
从小到大排序(返回的是K):zrange 键
从大到小排序(返回的是K):zrevrange 键
获取页面源码:
1.requests
2.beautifulsoup bs4
3.scrapy
# ENTAC
# 验证用户名
# 版本控制:
# 1.Subversion 必须有中央服务器
# 2.Git 可以先在本地同步d
# git --version 确认是否安装Git
# git init 加入版本控制
# git add. 添加
# git status 查看状态
# git commit -m '项目的初始版本' 提交并写原因
# git log 查看日志
# git reset HEAD^ 回到上一版本
# git reset 版本号 回到对应版本号的版本
# git remote add origin 网址 给远端仓库建立联系
# git pull 网址 与服务器上代码同步
# git push origin master 往服务器上传代码
# git clone 网址 下载项目
# git rm 文件名 删除文件
# git check out 文件名 重新拿出文件
# git branch 查看分支
# git branch 名称 建立分支
# git checkout 名称 切换至该名称的分支
# git merge 分支名称 合并分支到主线
=============================04-20=================================
# git checkout -b 名称 创建分支并切换至该分支
# git branch -d 名称 删除本地分支
# git push origin --delete 分支名 删除远端分支
# git commit -am '' 合并add和commit操作
# git diff 分支1 分支2 比较分支之间的不同
# git merge 合并
# git tag -a 版本号 -m '注解' 打tag标签
# git push origin 版本号 推送版本号
# git push origin --delete tag 版本号 删除上传的版本号
# git tag -d 版本号 删除本地版本号
# git tag 查看标签
# git stash 加入缓存(修改才行,新建文件不行)
# git stash list 查看缓存
# git stash apply 缓存号 释放缓存直当前目录
ctrl + insert 复制
shift + insert 粘贴
创建秘钥 ssh-keygen t rsa -C 用户名
# 登陆(redis + mysql)
# 1. pip install redis
# 2. 连接mysql
# 3. 连接redis
# import redis
# redis.Redis()
# 4. python xxx.py argv1 argv2
# import sys
# sys.argv[1]
# 5. 访问redis, 判断输入的姓名和密码和redis中保存的用户名和密码是否匹配
# 6. 和redis不匹配,则查询mysql, select操作
# 7. mysql有查询结果的话,则更新到redis中,反之则没该用户
import sys
import pymysql
import redis
def con_mysql(sql):
db = pymysql.connect(
host = '这里填服务器或虚拟机IP',
user = '服务器或虚拟机登录名',
passwd = '服务器或虚拟机登陆密码',
port = 3306,
db = '数据库名称',
charset = 'utf8')
cursor = db.cursor()
cursor.execute(sql)
data = cursor.fetchall()
db.close()
return data
def con_redis(name, passwd):
r = redis.Redis(host = 这里填服务器或虚拟机IP', port = 6379, password = 'redis数据库密码')
r_name = r.hget('user', 'nam')
r_passwd = r.hget('user', 'passwd')
# 类型转换,将类型转换为utf8
r_name = r_name.decode('utf8')
r_passwd = r_passwd.decode('utf8')
# print(r_name, r_passwd)
if name == r_name and passwd == r_passwd:
return True, '欢迎回来, %s!' % name
else:
return False, '用户名或密码错误!'
def main():
# print(con_mysql('select * from stu'))
# print(con_redis())
# 获取传入的姓名和密码参数
name = sys.argv[1]
passwd = sys.argv[2]
#传入redis中, 进行校验
result = con_redis(name, passwd)
# result[0] 返回第一个False结果
if not result[0]:
# 查询mysql数据库
sql = '''select * from stu where nam = '%s'
and passwd = '%s' ''' % (name, passwd)
data = con_mysql(sql)
if data:
r = redis.Redis(host = '这里填服务器或虚拟机IP', port = 6379, password = 'redis数据库密码')
r.hset('user', 'nam', name)
r.hset('user', 'passwd', passwd)
print('刷新redis, 登陆成功!')
else:
print('用户名和密码错误!')
else:
print('redis中数据正确,登陆成功!')
if __name__ == '__main__':
main()