Python 学习之登录注册

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
def register(userinfo, name, passwd):
with open(userinfo, mode="r+", encoding="utf-8") as f1:
for line in f1:
# print(line.split("")[0])
if line.split("")[0] == name:
return 0,"{0}用户已注册,请更换其他用户名".format(name)
f1.write(name+""+passwd+"\n")
return 1,"注册成功,用户名是:{0},密码是:{1}".format(name,passwd)


def login(userinfo, name, passwd):
with open(userinfo, mode="r", encoding="utf-8") as f1:
for line in f1:
# print(line.split("")[0])
# print(line.split("")[1].strip())
if name == line.split("")[0]:
if passwd == line.split("")[1].strip():
return 1,"用户名和密码正确,登录成功",0
else:
return 0,"{0}用户名密码错误,请检查".format(name),"loginerror"
return 0, "{0}用户名还没注册,请先注册".format(name),0

# flag = 1
# while flag:
# name = input("请输入用户名:")
# passwd = input("请输入密码:")
# msg = register("userinfo", name, passwd)
# flag = msg[0]
# print(msg[1])

name = input("请输入用户名:")
count = 1
while count <=3:
passwd = input("请输入密码:")
msg = login("userinfo", name, passwd)
if msg[0] == "1":
print(msg[1])
break
else:
if msg[2] == "loginerror":
print(msg[1])
print("已尝试{0}次,还剩余{1}次".format(count, 3 - count))
count += 1
else:
print(msg[1])
break

Shell 简单判断系统类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
if [ -e /etc/redhat-release ]; then
OS=CentOS
[ -n "$(grep ' 7\.' /etc/redhat-release 2> /dev/null)" ] && OS_Ver=7
[ -n "$(grep ' 6\.' /etc/redhat-release 2> /dev/null)" ] && OS_Ver=6
elif [ -n "$(grep -i 'Debian' /etc/issue 2> /dev/null)" ]; then
OS=Debian
elif [ -n "$(grep -i 'Ubuntu' /etc/issue 2> /dev/null)" ]; then
OS=Ubuntu
else
echo "UnknownOS"
fi
echo $OS
echo $OS_Ver

Python 冒泡排序分析总结

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
lst = [5,1,4,6]
# print(lst)
count = 0
while count < len(lst):
i = 0
while i < len(lst) - 1:
print("第{0}次外层循环的内层循环第{1}次:".format(count+1, i+1))
if lst[i] > lst[i + 1]:
print("lst[{0}]={2},lst[{1}]={3},{2}大于{3}交换".format(i, i + 1, lst[i],lst[i + 1]))
lst[i] , lst[i + 1] = lst[i + 1] , lst[i]
print("lst={0}".format(lst))
else:
print("lst[{0}]={2},lst[{1}]={3},{2}不大于{3},不交换lst={4}".format(i, i + 1, lst[i],lst[i + 1],lst))
i = i + 1
print("第{0}次外层循环结束lst={1}".format(count+1,lst))
count = count + 1
print(lst)

结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
第1次外层循环的内层循环第1次:
lst[0]=5,lst[1]=1,5大于1交换
lst=[1, 5, 4, 6]
第1次外层循环的内层循环第2次:
lst[1]=5,lst[2]=4,5大于4交换
lst=[1, 4, 5, 6]
第1次外层循环的内层循环第3次:
lst[2]=5,lst[3]=6,5不大于6,不交换lst=[1, 4, 5, 6]
第1次外层循环结束lst=[1, 4, 5, 6]
第2次外层循环的内层循环第1次:
lst[0]=1,lst[1]=4,1不大于4,不交换lst=[1, 4, 5, 6]
第2次外层循环的内层循环第2次:
lst[1]=4,lst[2]=5,4不大于5,不交换lst=[1, 4, 5, 6]
第2次外层循环的内层循环第3次:
lst[2]=5,lst[3]=6,5不大于6,不交换lst=[1, 4, 5, 6]
第2次外层循环结束lst=[1, 4, 5, 6]
第3次外层循环的内层循环第1次:
lst[0]=1,lst[1]=4,1不大于4,不交换lst=[1, 4, 5, 6]
第3次外层循环的内层循环第2次:
lst[1]=4,lst[2]=5,4不大于5,不交换lst=[1, 4, 5, 6]
第3次外层循环的内层循环第3次:
lst[2]=5,lst[3]=6,5不大于6,不交换lst=[1, 4, 5, 6]
第3次外层循环结束lst=[1, 4, 5, 6]
第4次外层循环的内层循环第1次:
lst[0]=1,lst[1]=4,1不大于4,不交换lst=[1, 4, 5, 6]
第4次外层循环的内层循环第2次:
lst[1]=4,lst[2]=5,4不大于5,不交换lst=[1, 4, 5, 6]
第4次外层循环的内层循环第3次:
lst[2]=5,lst[3]=6,5不大于6,不交换lst=[1, 4, 5, 6]
第4次外层循环结束lst=[1, 4, 5, 6]
[1, 4, 5, 6]

主要说明冒泡排序流程,对于列表其实有更简单方法排序

1
2
3
lst = [5,1,4,6]
lst.sort()
print(lst)

Web.config 规则实例不完全整理

例子1:配置https 301跳转https

  • stopProcessing 匹配成功不继续匹配
  • ignoreCase 忽略大小写
  • MatchAny 或 MathAll 且
  • negate 取反

具体规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="301" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTP_FROM_HTTPS}" pattern="^on$" negate="true" />
<add input="{HTTP_HOST}" pattern="^www.idiyrom.com$" negate="true" />
</conditions>
<action type="Redirect" url="https://www.idiyrom.com/{R:1}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

例子2:手机站m.idiyrom.com 不跳转到https

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="301" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_FROM_HTTPS}" pattern="^on$" negate="true" />
<add input="{HTTP_HOST}" pattern="^m.idiyrom.com$" negate="true" />
</conditions>
<action type="Redirect" url="https://www.idiyrom.com/{R:1}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

例子3:设置仅允许某个目录下某个后缀文件访问 如仅允许上传目录下jpg等图片访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" ?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="forbiddenhtml">
<match url="^(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_URI}" pattern="upload" ignoreCase="false" />
<add input="{URL}" pattern="^.*(.jpg)" ignoreCase="false" negate="true" />
</conditions>
<action type="Redirect" url="https://www.ropon.top/" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

PyCharm 安装设置及优化

1、访问http://www.jetbrains.com/pycharm/download/ 按如附图选择下载安装包


2、安装 以下演示的是pycharm-professional-2018.2.4.exe 安装没有什么特别,直接点击Next即可,其中主要有2个需要调整,一个是根据当前操作系统选择对应位数,勾选py后缀文件使用 PyCharm打开


3、设置 激活及开始设置引导根据提示操作,以下是其他优化设置 点击 Create New Project 然后根据以下截图配置


4、优化 设置编辑器字体颜色 Files-Setting-Editor-Font 定义Python模板文件

1
2
3
4
5
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : ${DATE} ${TIME}
# @Author : Ropon
# @File : ${NAME}.py

5、常用快捷键总结 a、Ctrl + /     快速注释选中的内容 b、Ctrl + d    快速复制粘贴选中的内容 c、Ctrl + Shift +F10    运行 d、选中块按Tab 批量缩进,选中块按Shift+Tab取消批量缩进


PS 小彩蛋 以下表达式值是

1
2
3
4
5
print (3 > 1 and 2 or 2 < 3) #2
print (3 < 1 and 2 or 2 < 3) #True
print (2 and 3) #3
print (4 or 1) #4
print (1 or 2 < 1 ) #1

总结:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
x or y 
说明:
如果x为零,返回y的值
如果x为非零,返回x的值
比如:
1 or 2 返回的是1
0 or 3 返回的是3

x and y
说明:
and 与or相反
也就是说如果x为零,返回x的值
如果x为非零,返回y的值
比如:
1 and 2返回的是2
0 and 2返回的是0

SSH免密码双向登录

实现原理

使用一种被称为”公私钥”认证的方式来进行ssh登录。”公私钥”认证方式简单的解释是:

首先在客户端上创建一对公私钥(公钥文件:/.ssh/id_rsa.pub;私钥文件:/.ssh/id_rsa),然后把公钥放到服务器上(~/.ssh/authorized_keys),自己保留好私钥。当ssh登录时,ssh程序会发送私钥去和服务器上的公钥做匹配。如果匹配成功就可以登录。


在A服务器生成证书

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/ropon_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/ropon_rsa.
Your public key has been saved in /root/.ssh/ropon_rsa.pub.
The key fingerprint is:

ll ~/.ssh/
total 12
-rw-r--r-- 1 root root 404 Sep 11 23:35 known_hosts
-rw------- 1 root root 1766 Sep 12 01:49 ropon_rsa
-rw-r--r-- 1 root root 396 Sep 12 01:49 ropon_rsa.pub


ropon_rsa 私钥文件,ropon_rsa.pub公钥文件


将公钥证书ropon_rsa.pub复制到B服务器/root/.ssh子目录下,同时将文件名更换为authorized_keys,此时需要输 入B服务器的root用户密码(还未建立信任关系)。建立了客户端到服务器端的信任关系后,A服务器就可以不用再输入密码,就可以从B服务器端拷贝数据。

scp -r -PSSH端口 ~/.ssh/ropon_rsa.pub x.x.x.x:/root/.ssh/authorized_keys

提示:scp: /root/.ssh/authorized_keys: No such file or directory 请先到目标服务器使用mkdir /root/.ssh命令创建目录

然后使用ssh -i ropon_rsa -pSSH端口 x.x.x.x 免密码登录

同理要实现SSH免密码双向链接,在B服务器创建证书,然后将公钥文件拷贝到A服务器/root/.ssh/authorized_keys目录

另外本地客户端比如putty、xshell 使用密钥文件登录,拷贝私钥文件ropon_rsa到本地,SSH连接时选择对应秘钥文件即可 创建时设置密码,输入对应密码然后连接。

PS: 如果链接慢,关闭DNS反查 cat /etc/ssh/sshd_config UseDNS no

设置仅使用秘钥登录 cat /etc/ssh/sshd_config PasswordAuthentication no

Windows下排查php-cgi无法使用思路

1、先检查是否iis有异常 是否加载异常dll,比如安全狗、云锁、360网站卫士等 2、检查php环境是否有异常

1
2
3
4
进入cmd  
d:
cd D:\SOFT_PHP_PACKAGE\php5.3
php-cgi.exe . -c d:\wwwroot\xxxx\index.php #使用当前目录下php.ini 执行对应php文件

3、检查权限

对应php目录需要给everyone 读权限


fcgiext.ini 文件解读

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[PHP53]
ExePath=D:\SOFT_PHP_PACKAGE\php5.3\php-cgi.exe
InstanceMaxRequests = 10000
ActivityTimeout = 300
RequestTimeout = 600
EnvironmentVars=PHP_FCGI_MAX_REQUESTS:200,PHPRC:D:\SOFT_PHP_PACKAGE\php5.3\,MonitorChangesTo=D:\SOFT_PHP_PACKAGE\php5.3\php.ini
[PHP54]
ExePath=D:\SOFT_PHP_PACKAGE\php5.4\php-cgi.exe
InstanceMaxRequests = 10000
ActivityTimeout = 300
RequestTimeout = 600
EnvironmentVars=PHP_FCGI_MAX_REQUESTS:200,PHPRC:D:\SOFT_PHP_PACKAGE\php5.4\,MonitorChangesTo=D:\SOFT_PHP_PACKAGE\php5.4\php.ini

[Types]
PHP = PHP53 #使用CGI默认使用php5.3
PHP:10236=PHP54 #指定具体站点使用php5.4,10236 站点ID

Centos/Ubuntu/Debian系统数据盘一键分区一键扩容脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#!/bin/bash
#一键分区
#一键扩容
#用法:bash homeV2.sh

#v1.1.20180914
#新增避免重复同时运行
#新增日志记录

rsname=homeV2 #shell名称
LOCKfile=/root/.$(basename $0).lock
LOGfile=/root/.$(basename $0).log

Echo()
{
case $1 in
success) flag="\033[1;32m"
;;
failure) flag="\033[1;31m"
;;
warning) flag="\033[1;33m"
;;
msg) flag="\033[1;34m"
;;
*) flag="\033[1;34m"
;;
esac
if [[ $LANG =~ [Uu][Tt][Ff] ]]
then
echo -e "${flag}${2}\033[0m"
else
echo -e "${flag}${2}\033[0m" iconv -f utf-8 -t gbk
fi
#写日志
[ "${3}A" == "LogA" ] && Shell_log $2
}

Shell_log(){
LOG_INFO=$1
Echo "msg" "$(date "+%Y-%m-%d") $(date "+%H:%M:%S"):$rsname:$LOG_INFO" >> $LOGfile
}

Shell_lock(){
touch $LOCKfile
}
Shell_unlock(){
rm -f $LOCKfile
}
Exit(){
Shell_unlock
exit
}

CheckWDCP()
{
service httpd $1
service nginxd $1
service mysqld $1
service pureftpd $1
[ -e /etc/init.d/wdcp ] && service wdcp $1
[ -e /etc/init.d/wdapache ] && service wdapache $1
[ -e /etc/init.d/redis_6379 ] && service redis_6379 $1
[ -e /etc/init.d/memcached ] && service memcached $1
}

YunPanMBR()
{
Echo "msg" "有挂载云盘$1且没有分区,是否需要一键分区。" "Log"
fstab_file="/etc/fstab"
read -p "[y/n]: " autoyunpan
while [[ ! $autoyunpan =~ ^[y,n]$ ]]
do
Echo "warning" "输入错误,只能输入y或n" "Log"
read -p "[y/n]: " autoyunpan
done
if [ "$autoyunpan" == 'y' ];then
yunpandev=$1
fdisk $yunpandev << EOF
n
p
1
2048

w
EOF
sleep 5
mkfs.ext4 ${yunpandev}1
Echo "msg" "请输入挂载点,比如:/yunpan" "Log"
read -p ": " mountdir
[ ! -d "$mountdir" ] && mkdir -p $mountdir
echo "${yunpandev}1$mountdirext4 defaults0 0" >>$fstab_file
mount -a
df -vh
Echo "success" "$yunpandev一键分区成功,挂载点是$mountdir" "Log"
fi
}


Auto()
{
tempdev=`ls /dev/vd[b-z]`
Echo "msg" "请输入设备名,比如以下设备名,扩容数据盘[home分区]/dev/vdb请直接回车" "Log"
Echo "msg" "$tempdev" "Log"
read -p ":" devpart
[ -z "$devpart" ] && devpart="/dev/vdb"
while [[ ! -e "$devpart" ]]
do
Echo "warning" "输入设备名错误,请重新输入" "Log"
read -p ":" devpart
done
data_part=`df -vh grep ${devpart}1awk '{print $6}'`
Swap=`free -m awk '/Swap:/{print $2}'`
Swapdir=$(cat /etc/fstab grep swapawk '{print $1}')
[ "$Swap" -ne '0' ] && swapoff $Swapdir
[ -d /www/wdlinux/wdcp ] && Echo "msg" "预装WDCP面板系统,正在停止WDCP相关服务。" && CheckWDCP stop
which fuser >/dev/null 2>&1
[ $? -ne 0 ] && yum -y install psmisc fuser
fuser -m $data_part -k
umount $data_part
[ $? -ne 0 ] && Echo "warning" "取消$data_part挂载失败,程序自动退出,请手动操作扩展" "Log" && [ -d /www/wdlinux/wdcp ] && CheckWDCP start && Exit
Startflag=`parted $devpart printsed -n '/primary/p'awk '{print $2}'`
parted $devpart printgrep primary > /parted.txt
[ ! -e /parted.txt ] && Echo "warning" "备份分区表文件不成功,程序自动退出,请手动操作扩展" "Log"
parted $devpart rm 1
yesparted $devpart mkpart primary $Startflag 100%
[ $? -ne 0 ] && Echo "warning" "分区扩容失败,请手动操作扩展" "Log" && Exit
Echo "msg" "如果硬盘较大,时间可能会很长,请耐心等待!" "Log"
resize2fs -f ${devpart}1
mount -a
[ "$Swap" -ne '0' ] && swapon $Swapdir
[ -d /www/wdlinux/wdcp ] && Echo "msg" "预装WDCP面板系统,正在启动WDCP相关服务" "Log" && CheckWDCP start
df -vh
Echo "success" "$devpart扩容成功" "Log"
Exit
}

Main()
{
if [ -e "/dev/vdc" ] ;then
for devname in `ls /dev/vd[c-z]`
do
if [ -e "$devname" ] && [ ! -e "${devname}1" ] ;then
YunPanMBR $devname
fi
done
fi
Echo "msg" "是否需要扩容磁盘" "Log"
read -p "[y/n]: " autodisk
while [[ ! $autodisk =~ ^[y,n]$ ]]
do
Echo "warning" "输入错误,只能输入y或n" "Log"
read -p "[y/n]: " autodisk
done
if [ "$autodisk" == 'y' ];then
Auto
fi
}
if [ -f "$LOCKfile" ];then
Echo "warning" "核实脚本正在运行中,请勿重复运行,若是之前强行中断引起的,请手工清理$LOCKfile" "Log" && exit
else
Echo "msg" "首次运行脚本,将自动创建锁文件然后继续,避免在执行中重复运行脚本。" "Log"
Shell_lock
fi
Main
Exit

Windows环境下安装mysql5.7

1、注意:安装mysql5.7 需要VC13,请访问以下链接https://www.microsoft.com/zh-cn/download/details.aspx?id=40784下载,注意下载与mysql解压包相同位数版本, 这里用的32位安装包; 2、访问以下链接https://dev.mysql.com/downloads/file/?id=478883 下载mysql-5.7.23-win32.zip 解压到D:\mysql目录


my.ini 简单范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[mysql]  
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=D:\mysql\mysql5.7
# 设置mysql数据库的数据的存放目录
datadir=D:\mysql\mysql5.7\data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

mysql5.7 压缩包没有初始化数据库,默认没有data目录,请使用以下命令初始化并会生成随机root密码,请先记录

1
mysqld --initialize --console

配置系统环境变量“d:\mysql\mysql5.7\bin”,开始安装服务

1
2
3
4
5
6
7
8
9
mysqld --install MySQL57

net start MySQL57

#使用前需要重置root密码,使用之前初始化生成随机密码登录mysql执行以下命令修改root密码

set Password=Password('idiyrom.com'); 

#其中idiyrom.com 就是修改后的密码

注意如果使用普通用户允许mysql5.7,上级根目录需要给everyone或者普通用户读的权限,演示安装的的目录是d:\mysql\mysql5.7\bin,需要给d盘everyone或者普通用户读的权限。另外通过bat命令一键安装时,注意my.ini 需要配置

1
tmpdir=D:\mysql\mysql5.7\tmp