解决redis中的pnscan木马入侵问题


#服务器进程飙升,服务器突然链接超时,登陆不了,重启服务器以后查看系统进程
#同事在开放redis远程链接,没有设置密码,安全组也没有做到位
1、杀掉进程

     top 找到pnscan 的pid
     kill -9 pid

2、删除文件

     找到进程对应的文件 ps aux|grep pnscan 
     删掉文件。
注:redis启动一定要设置密码。在redis.conf 中 requirepass XXX


怎么判断是被ddos攻击还是cc攻击呢?


**DDOS的全称:**
Distributed Denial of Service 中文意思是分布式拒绝服务。
该攻击方式利用目标系统网络服务功能缺陷或者直接消耗其系统资源。使得该目标系统无法提供正常的服务。

**CC的全称:**
Challenge Collapsar 中文意思是挑战黑洞。
CC攻击的原理是通过代理服务器或者大量肉鸡模拟多个用户访问目标网站的动态页面。制造大量的后台数据库查询动作,消 
耗 
目标CPU资源,造成拒绝服务。
 
**二者的区别**
针对对象 主要是针对对象的不同。DDOS主要针对IP的攻击,而CC攻击的主要是网页。
我们该怎么做? 在一台虚拟主机里有几百个网站,这些网站类型复杂,也有可能有些类型的网站容易被同行打击。

如果针对服务器IP进行攻击,那这台服务器上的所有网站将瘫痪。
另外在SEO层面上,如果该IP段有正被惩罚的网站存在,那这个IP段的网站同样会受牵连。
1、服务器连接不到,网站也打不开     
2、服务器CPU被大量占用
3、服务器带宽被大量占用
4、域名ping不出IP
这也是为什么很多在同一个服务器上的网站优化难度大的其中原因。 我们永远无法预知DDOS攻击或CC攻击什么时候会来 
袭,却又无法完全避免。

D是针对服务器的,而CC是针对域名的,服务器正常,域名不能打开那就是C了
我们能做的是在洪水般的DDoS/CC攻击来临前,做好完全的防护措施。

linux 记录用户操作并录入日志


1. 添加bash全局配置文件:
cd /etc/profile.d
vi log_command.sh

输入如下内容:

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]* 
[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

2. 添加rsyslog配置文件bash.conf:

vi /etc/rsyslog.d/bash.conf

填写如下内容:

local6.*    /var/log/commands.log

3. 重启rsyslog服务:

systemctl restart rsyslog

4. 添加logrotate文件

cd /etc/logrotate.d

vi syslog

添加一行:

/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
/var/log/commands.log #添加这个

{
missingok
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}

需要退出当前用户重新登录才能看到/var/log/commands.log


python基础教程第四章 列表和字典


#列表
list=['小明','18','1.70']
#一个列表需要用中括号[ ]把里面的各种数据框起来,里面的每一个数据叫作“元素”。每个元素之间都要用 
英文逗号隔开

#从列表提取单个元素
#这就涉及到一个新的知识点:偏移量。列表中的各个元素,好比教室里的某排学生那样,是有序地排列 
的,也就是说,每个元素都有自己的位置编号(即偏移量)。
list  =  ['小明','18','1.70']
#从上图可得:1.偏移量是从0开始的,而非我们习惯的从1开始;2.列表名后加带偏移量的中括号,就能取 
到相 
应位置的元素。
#我们可以通过偏移量来对列表进行索引(可理解为搜索定位),读取我们所需的元素。
students = ['小明','小红','小刚']
print(students[0])  

#从列表提取多个元素
#一个提醒:下列:左右两边的数字指的是列表中元素的偏移量,记住偏移量(索引)始终是从0开始的。
list2 = [5,6,7,8,9]
print(list2[:])
# 打印出[5,6,7,8,9]
print(list2[2:])
# 打印出[7,8.9]
print(list2[:2])
# 打印出[5,6]
print(list2[1:3])
#打印出[6,7]
print(list2[2:4])    
#打印出[7,8]

#给列表增加/删除元素
# 请运行以下代码:报错后,可读一下报错信息,然后将第6行注释掉再运行。
list3 = [1,2]
list3.append(3)
print(list3)

#list3.append(4,5)#append后的括号里只能接受一个参数,但却给了两个,也就是4和5。所以,用 
append()给列表增加元素,每次只能增加一个元素
list3.append([4,5])
print(list3)

students = ['小明','小红','小刚','小美']
del students[2]
print(students)


#数据类型:字典
scores = {'小明':95,'小红':90,'小刚':90}
#字典和列表有3个地方是一样的:1.有名称;2.要用=赋值;3.用逗号作为元素间的分隔符
#列表中的元素是自成一体的,而字典的元素是由一个个键值对构成的,用英文冒号连接。如'小明':95, 
其 
中我们把'小明'叫键(key),95叫值(value)。
#这样唯一的键和对应的值形成的组合,我们就叫做【键值对】,上述字典就有3个【键值对】:'小 
明':95、'小红':90、'小刚':90
#如果不想口算,我们可以用len()函数来得出一个列表或者字典的长度(元素个数),括号里放列表或字 
典名称。
#直接运行代码即可
students = ['小明','小红','小刚']
scores = {'小明':95,'小红':90,'小刚':90}
print(len(students))
print(len(scores))
#打印小明成绩
scores = {'小明': 95, '小红': 90, '小刚': 90}
print(scores['小明'])

#给字典增加/删除元素
# 直接运行下面的代码,留意字典以及新的键值对是如何增加的:
album = {'周杰伦':'七里香','王力宏':'心中的日月'}
del album['周杰伦']
print(album)

album['周杰伦'] = '十一月的萧邦' #增加
print(album)
print(album['周杰伦'])
#删除字典里键值对的代码是del语句del 字典名[键],而新增键值对要用到赋值语句字典名[键] = 值
scores = {'小明':95,'小红':90,'小刚':90}

#列表和字典的不同点
#列表中的元素是有自己明确的“位置”的,所以即使看似相同的元素,只要在列表所处的位置不同,它们就 
是两个不同的列表
#字典相比起来就显得随和很多,调动顺序也不影响。因为列表中的数据是有序排列的,而字典中的数据是 
随机排列的。
students1 = ['小明','小红','小刚']
students2 = ['小刚','小明','小红']
print(students1 == students2)  #False

scores1 = {'小明':95,'小红':90,'小刚':100}
scores2 = {'小刚':100,'小明':95,'小红':90}
print(scores1 == scores2)  #True

#在列表和字典中,如果要修改元素,都可用赋值语句来完成
list1 = ['小明','小红','小刚','小美']
list1[1] = '小蓝'
print(list1)

dict1 = {'小明':'男'}
dict1['小明'] = '女'
print(dict1)   

#多级嵌套的列表嵌套列表  取出小红
students = [['小明','小红','小刚','小美'],['小强','小兰','小伟','小芳']]
print(students[1][3])

#字典嵌套字典。
scores = {
    '第一组':{'小明':95,'小红':90,'小刚':100,'小美':85},
    '第二组':{'小强':99,'小兰':89,'小伟':93,'小芳':88}
    }
print(scores['第二组']['小芳'])

#列表和字典相互嵌套的情况
# 最外层是大括号,所以是字典嵌套列表,先找到字典的键对应的列表,再判断列表中要取出元素的偏移 
量
students = {
    '第一组':['小明','小红','小刚','小美'],
    '第二组':['小强','小兰','小伟','小芳']
    }
print(students['第一组'][3])
#取出'第一组'对应列表偏移量为3的元素,即'小美'

# 最外层是中括号,所以是列表嵌套字典,先判断字典是列表的第几个元素,再找出要取出的值相对应的 
键
scores = [
    {'小明':95,'小红':90,'小刚':100,'小美':85},
    {'小强':99,'小兰':89,'小伟':93,'小芳':88}
    ]
print(scores[1]['小强'])
#先定位到列表偏移量为1的元素,即第二个字典,再取出字典里键为'小强'对应的值,即99。

#我们知道了列表和字典的不同:列表的基本单位是元素,而字典里是键值对。所以,两者提取数据的方式 
也不同。
#你可以通过头两个练习来验证自己已经掌握了。
#而在第三道练习,你会学会提取元组里的数据
#取出love
list1 = [{'嫉妒':'envy'},{'恨':'hatred'},{'爱':'love'}]
print(list1[2]['爱'])

dict1 = {1:['cake','scone','puff'],2:['London','Bristol','Bath'],3: 
['love','hatred','envy']}
print(dict1[3][0])

#元组(tuple)元组和表格很相似,不过,它是用小括号来包的
tuple1 = ('A','B')
list2 = [('A','B'),('C','D'),('E','F')]

print(tuple1[0])
print(list2[1][1])

# 从代码里,也可看出:1.元组内数据的提取也是用偏移量;2.元组也支持互相嵌套。
#元组的写法是把数据放在小括号()中,它的用法和列表用法类似,主要区别在于列表中的元素可以随时修 
改,但元组中的元素不可更改。


#练习要求
#在未来世界里,一个新建的童话镇吸引了不少人入住。
#不过,在人群里隐藏着一只狼,会威胁大家的安全。
#童话镇的镇长希望你能找到它,并揭发其身份。
#用程序语言就是说:列表中有个字符串是“狼”,将其打印出来吧。
ownee = [
    {'海底王国':['小美人鱼''海之王''小美人鱼的祖母''五位姐姐'],'上层世界':['王子','邻国公 
主']},'丑小鸭','坚定的锡兵','睡美人','青蛙王子',
[{'主角':'小红帽','配角1':'外婆','配角2':'猎人'},{'反面角色':'狼'}]
]
print(ownee[5][1]['反面角色'])

python基础教程第三章 input()函数的使用


#input()函数的使用
input('请铲屎官输入宠物的名字:')
#input()函数是输入函数。就上面例子来讲,它需要你输入针对括号内'请铲屎官输入你宠物的名字:'的 
答案。

#input()函数结果的赋值
name = input('请铲屎官输入宠物的名字:')
print('I Love '+name +'!')
#将input()函数的执行结果(收集的信息)赋值给变量name
choice = input('请输入您的选择:')
#变量赋值
if choice == '1':
#条件判断:条件1
    print('霍格沃茨欢迎您的到来。')
    #条件1的结果
else:
#条件判断:其他条件
    print('您可是被梅林选中的孩子,我们不接受这个选项。')
    #其他条件的结果

#input()函数的数据类型
#对于input()函数来说,不管我们输入的回答是什么,不管你输入的是整数1234,还是字符串我爱摩卡, 
input()函数的输入值(搜集到的回答),永远会被强制性地转换为字符串类型。Python3固定规则

#input()函数结果的强制转换
#input()函数的输入值在某些情况下,是可以变为整数的
#choice = int(input('请输入您的选择:'))
#将输入值强制转换为整数,并赋值给变量choice
age = int(input('你多大了呀?'))
#将输入的岁数(字符串),强制转换为整数
if age > 20:
#当年龄(整数)大于20(整数)时
print('在我心里你永远是个宝宝啊')
#打印if条件下的结果
else:
#当年龄(整数)小于20(整数)时
    print('你果然是个真·宝宝!')
    #打印else条件下的结果

#例子
#哈利·波特在对角巷购买宠物时犯难了,他不知道该给自己的猫头鹰起什么名字。现在请你帮助哈利·波 
特,为他的猫头鹰起一个名字。
name=input('请给它取个名字:')
print('哈利波特的猫头鹰叫'+name)

#游戏规则如下:
#如果罗恩一天吃超过10个巧克力蛙,罗恩要给哈利100块;
#如果罗恩一天吃小于等于10个的巧克力蛙,哈利就给罗恩100块。  

#题目要求:
#请你写出一段代码:
#当随机输入罗恩一天吃的巧克力蛙数量时,可以判断出这天,是罗恩给哈利钱,还是哈利给罗恩钱,并打 
印出来。
luoen = input('今天吃了多少巧克力:')
if int(luoen) > 10:
    print('罗恩要给哈利壹佰块')
else:
    print('哈利就给罗恩壹佰快')


#注意:以下背景与题目要求相关
#小精灵:您好,欢迎古灵阁,请问您需要帮助吗?需要or不需要?
#你:需要
#小精灵:请问您需要什么帮助呢?1 存取款;2 货币兑换;3 咨询
#你:2
#小精灵:金加隆和人民币的兑换率为1:51.3,即一金加隆=51.3人民币
#小精灵:请问您需要兑换多少金加隆呢?
#(你说了一个数字N)#
# 小精灵:好的,我知道了,您需要兑换(你说的数字N)金加隆。
#小精灵:那么,您需要付给我(你说的数字N*51.3)人民币。  

#注1:如果选择不需要帮助,小精灵会礼貌地说'好的,再见。'
#注2:  如果选择帮助【1 存取款】,小精灵会推荐你去存取款窗口;如果选择帮助【3 咨询】,小精灵会 
推荐你去咨询窗口。  
name = input('您好,欢迎古灵阁,请问您需要帮助吗?天猫精灵将为你服务,请回答需要or不需要?')
if name == '需要':
    name1 = input('请问您需要什么帮助呢?请输入对应的数字:1 存取款;2 货币兑换;3 咨询')
    if name1 == '2':
        print('金加隆和人民币的兑换率为1:51.3,即一金加隆=51.3人民币')
        name2 = input('请问您需要兑换多少金加隆呢?')
        print('好的,我知道了,您需要兑换'+name2+'金加隆。')
        name3 = int(name2)*int(51.3)
        print('那么,您需要付给我'+str(name3)+'人民币。 ')
    elif name1 == '1':
        print('小精灵推荐你去存取款窗口')
    elif name == '3':
        print('小精灵推荐你去咨询窗口')
elif name == '不需要':
    print('好的,再见。')