本文主要介绍在Linux(CentOS)下将Python的版本升级为3.6.2的方法
众所周知,在2020年python官方将不再支持2.7版本的python,所以使用3.x版本的python是必要的,但是linux中默认安装的python一般是2.6和2.7版本的,要是使用linux下的python就很有必要升级一下
进入正题
1.检查确认系统的相关信息
[root@zstest1 ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@zstest1 ~]# uname -a
Linux zstest1 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
[root@zstest1 ~]# python -V
Python 2.6.6
我的进行软件升级系统是CentOS6.5-x86_64的,内核2.6.32,当前的python版本号为2.6.6
2.下载安装Python-3.6.2
1) 下载Python-3.6.2.tgz软件包
[root@zstest1 ~]# mkdir -p /server/tools/
[root@zstest1 tools]# cd /server/tools/
[root@zstest1 tools]# wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz
2) 解压编译安装
[root@zstest1 tools]# tar -xf Python-3.6.2.tgz
[root@zstest1 tools]# cd Python-3.6.2
[root@zstest1 Python-3.6.2]# ./configure
[root@zstest1 Python-3.6.2]# make
[root@zstest1 Python-3.6.2]# make install
# 如果编译出错,需要检查make,gcc等是否安装好
yum install make gcc gcc-c++
3) 安装完成,需要更改默认的python版本
# 检查当前默认的python2,默认自带的python位置在”/usr/bin/“目录下
[root@zstest1 Python-3.6.2]# ll /usr/bin/python*
-rwxr-xr-x 2 root root 9032 11月 22 2013 /usr/bin/python
lrwxrwxrwx. 1 root root 6 3月 20 2016 /usr/bin/python2 -> python
-rwxr-xr-x 2 root root 9032 11月 22 2013 /usr/bin/python2.6
# 检查新安装的python3,默认编译安装的python位置在”/usr/local/bin/“目录下
[root@zstest1 Python-3.6.2]# ll /usr/local/bin/python*
lrwxrwxrwx 1 root root 9 10月 31 16:48 /usr/local/bin/python3 -> python3.6
-rwxr-xr-x 2 root root 9630001 10月 31 16:48 /usr/local/bin/python3.6
lrwxrwxrwx 1 root root 17 10月 31 16:48 /usr/local/bin/python3.6-config -> python3.6m-config
-rwxr-xr-x 2 root root 9630001 10月 31 16:48 /usr/local/bin/python3.6m
-rwxr-xr-x 1 root root 3066 10月 31 16:48 /usr/local/bin/python3.6m-config
lrwxrwxrwx 1 root root 16 10月 31 16:48 /usr/local/bin/python3-config -> python3.6-config
# 修改默认的python
# 删除旧的python的软连接,创建新的python2和python3的软连接
[root@zstest1 Python-3.6.2]# cd /usr/bin/
[root@zstest1 bin]# rm -f python2
[root@zstest1 bin]# mv python python2.6.ori
[root@zstest1 bin]# ln -s python2.6 python2
[root@zstest1 bin]# ln -s /usr/local/bin/python3 /usr/bin/python
4) 检查修改后的python版本
[root@zstest1 bin]# python -V
Python 3.6.2
[root@zstest1 bin]# python2 -V
Python 2.6.6
[root@zstest1 bin]# python3 -V
Python 3.6.2
# 可以看到,默认打开的python版本已经是3.6.2,至此python的版本已经升级成功
3.后续的软件问题处理
# python的默认版本修改为3.x之后,系统对于yum的调用会出问题,所以需要修改下yum的相关配置
[root@zstest1 bin]# vim /usr/bin/yum
# 需要检查确认以下配置
#!/usr/bin/python2
# 这样,修改后的yum依然可以调用python2.6.6的python,在使用yum安装软件时就不会报错了
# 以上是在CentOS6.5系统上进行的python版本升级,CentOS7.2上面的默认python版本为2.7.5,可以使用相同的方法进行修改,不过CentOS7.2的python链接稍有不同,需要注意
[root@centos72 ~]# ll /usr/bin/python*
lrwxrwxrwx. 1 root root 7 10月 26 2016 /usr/bin/python -> python2
lrwxrwxrwx. 1 root root 9 10月 26 2016 /usr/bin/python2 -> python2.7
-rwxr-xr-x. 1 root root 7136 11月 20 2015 /usr/bin/python2.7
# 另外就是,CentOS7.2还有另外一个文件需要修改
[root@centos72 ~]# vim /usr/libexec/urlgrabber-ext-down
# 检查确认以下配置:
#!/usr/bin/python2
1.安装相关依赖
sudo yum install openssl-devel -y
sudo yum install zlib-devel -y
2.安装setuptools
wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-19.6.tar.gz#md5=c607dd118eae682c44ed146367a17e26
tar -zxvf setuptools-19.6.tar.gz
cd setuptools-19.6
sudo python setup.py build
sudo python setup.py install
3.安装pip
wget --no-check-certificate https://pypi.python.org/packages/source/p/pip/pip-8.0.2.tar.gz#md5=3a73c4188f8dbad6a1e6f6d44d117eeb
tar -zxvf pip-8.0.2.tar.gz
cd pip-8.0.2
python setup.py build
sudo python setup.py install
ModuleNotFoundError: No module named 'twisted.persisted'
使用scrapy提示报错 pip安装多次无果
解决方法:(pip/pip3)
1.pip uninstall twisted
2.wget https://twistedmatrix.com/Releases/Twisted/17.9/Twisted-17.9.0.tar.bz2
3.tar -xvf Twisted-17.9.0.tar.bz2
4. cd Twisted-17.9.0
5.python setup.py install
总结:如果出现了错误需要重新安装的时候都要重新对python进行编译
出现错误:
Traceback (most recent call last):
File "/usr/bin/firewall-cmd", line 24, in
from gi.repository import GObject
ModuleNotFoundError: No module named 'gi'
原因:由于firewall使用的是python2,当前系统被修改默认环境为python3。
解决方案:
修改文件:
/usr/sbin/firewalld
/usr/bin/firewall-cmd
修改内容:
将#!/usr/bin/python变更为/usr/bin/python2.7
查看正在监听的端口:
netstat -nltp
-n 以数字形式显示地址和端口号。
-p 显示与连接有关的程序名和pid
-t 显示与TCP网络协议相关的选项
-l 仅仅只显示监听的选项
centos7.0防火墙操作:
安装firewall插件:yum install firewalld firewalld-config
配置文件:/etc/firewalld/
查看版本:firewall-cmd --version
查看帮助:firewall-cmd --help
查看区域信息:firewall-cmd --get-active-zones
查看指定接口所属区域信息:firewall-cmd --get-zone-of-interface=eth0
拒绝所有包:firewall-cmd --panic-on
取消拒绝状态:firewall-cmd --panic-off
查看是否拒绝:firewall-cmd --query-panic
查看防火墙状态:firewall-cmd --state
开启防火墙:systemctl start firewalld
关闭防火墙:systemctl stop firewalld
设置开机启动:systemctl enable firewalld
停止并禁用开机启动:sytemctl disable firewalld
重启防火墙:firewall-cmd --reload
查看指定区域所有开启的端口号
firewall-cmd --zone=public --list-ports
在指定区域开启端口(如80端口号,命令方式)
firewall-cmd --zone=public --add-port=80/tcp --permanent
重新启动防火墙
firewall-cmd --reload
参数说明:
–zone 作用域
–add-port=8080/tcp 添加端口,格式为:端口/通讯协议
–permanent #永久生效,没有此参数重启后失效
在指定区域开启某个范围的端口号(如18881~65534,命令方式)
firewall-cmd --zone=public --add-port=18881:65534/tcp --permanent
重新启动防火墙
firewall-cmd --reload
为什么选择FirewallD?
firewalld是centos7的一大特性,最大的好处有两个:支持动态更新,不用重启服务;第二个就是加入了防火墙的“zone”概念 ,实现多个区域的使用不同的规则。firewalld有图形界面和工具界面,由于我在服务器上使用,图形界面请参照官方文档,本文以字符界面做介绍。
以下记录来自Centos7.2系统:
firewalld 防火墙常用命令:
安装方法:
yum install firewalld firewall-config -y
使用tab键补全命令提示:
yum -y install bash-completion
图形界面:firewall-config
启动方法:
systemctl start firewalld
systemctl enable firewalld
Firewalld所有的配置及查看方法都通过命令firewalld-cmd [参数]来完成。
查看规则列表[所有]
firewalld-cmd --list-all
只列出通过端口添加的规则
firewall-cmd --list-ports
查看指定区域(public)的以端口方式添加的规则
firewall-cmd --zone=public --list-ports
只列出通过服务名添加的规则[默认当前激活的公共区域]
firewall-cmd --list-services
查看指定区域(public)的以服务名添加的规则
firewall-cmd --zone=public --list-services
查看所有区域的规则情况
firewall-cmd --list-all-zones
查看firewalldl默认支持的所有服务名列表
firewall-cmd --get-services
说明:firewall-cmd --reload
—reload 命令会删除所有运行时配置并应用永久配置。因为 firewalld 动态管理规则集,所以它不会破坏现有的连接和会话。
添加常用服务,会添加到默认的区域
以下四个规则重启服务会消失,只能临时生效,也是立刻生效的,如果要永久保存的规则就要添加参数:
—permanent,添加此参数后不会立刻生效。需要重载或重启服务才生效。
firewall-cmd --add-service=ftp #开放 ftp 服务规则
firewall-cmd --add-service=mysql # 开放mysql端口规则
firewall-cmd --add-service=http # 开放http端口规则
firewall-cmd --add-service=ssh # 开放ssh端口规则
添加常用端口,默认会添加到默认的区域
firewall-cmd --add-port=3306/tcp # 开放tcp访问3306规则
firewall-cmd --add-port=22/tcp # 开放tcp访问22规则
firewall-cmd --add-port=80/tcp # 开放tcp访问80规则
firewall-cmd --add-port=443/tcp # 开放tcp访问443规则
firewall-cmd --zone=public --add-port=4990-4999/udp #添加4990-4999 udp端口
移除规则
firewall-cmd --remove-service=http # 移除http端口规则
firewall-cmd --remove-port=80tcp # 移除通过tcp访问3306规则
firewall-cmd --add-port=233/udp # 开放通过udp访问233规则
永久关闭 ftp 服务: 删除、移除
firewall-cmd --remove-service=ftp --permanent
查询服务的启用状态[返回值yes/no]
firewall-cmd --query-service ftp
将同一台服务器上80端口的流量转发至8080
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
查看效果:
[root@centos-test03-0001 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client ssh
ports: 8001/tcp
protocols:
masquerade: no
forward-ports: port=80:proto=tcp:toport=8080:toaddr=
sourceports:
icmp-blocks:
rich rules:
如果要将端口转发到另外一台服务器上,在需要的区域中激活 masquerade
firewall-cmd --zone=public --add-masquerade
添加转发规则。
例子中是将本地的80端口的流量转发到IP地址为:10.0.10.15 的远程服务器上的8080端口。
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=10.0.10.15
伪装IP
防火墙可以实现伪装IP的功能,下面的端口转发就会用到这个功能。
firewall-cmd --query-masquerade # 检查是否允许伪装IP
firewall-cmd --add-masquerade # 允许防火墙伪装IP
firewall-cmd --remove-masquerade # 禁止防火墙伪装IP
防火墙的区域:zone
区域”是针对给定位置或场景(例如家庭、公共、受信任等)可能具有的各种信任级别的预构建规则集。不同的区域允许不同的网络服务和入站流量类型,而拒绝其他任何流量。 首次启用 FirewallD 后,public 将是默认区域。
区域也可以用于不同的网络接口。例如,要分离内部网络和互联网的接口,你可以在 internal 区域上允许 DHCP,但在external 区域仅允许 HTTP 和 SSH。未明确设置为特定区域的任何接口将添加到默认区域。
查看所有区域中的配置:
firewall-cmd --list-all-zones
查看当前系统中默认使用哪个区域:
firewall-cmd --get-default-zone
显示当前系统网络接口使用哪个区域:
firewall-cmd --get-active-zones
修改默认区域:使用tab键会显示有哪些区域
[root@k8s-node1 ~]# firewall-cmd --set-default-zone=internal
block dmz drop external home internal public trusted work
修改后即时生效,而且reload、重启后也是生效的。
获取指定区域的所有配置
firewall-cmd --zone=public --list-all
如果有多个网络接口可以通过此方法配置:
firewall-cmd --zone=home --change-interface=eth0
设置区域为home的接口为eth0
危险命令:[立即生效]
拒绝所有包:firewall-cmd --panic-on
取消拒绝状态: firewall-cmd --panic-off
查看是否拒绝: firewall-cmd --query-panic
如果是远程的机器执行上面的规则会立刻断开网络连接,必须紧记不能随便执行。如果你只是虚拟机或者物理机器登陆就可以执行来调试。
如果防火墙配置了规则很多如果清空规则呢?firewalld默认没有命令来清空规则。但是我们可以通过编辑配置文件来清除规则。
/etc/firewalld/zones/ 此处为配置生效后保存的配置文件,一般建议修改前先备份。
修改完重启服务或者重载服务。
所有的默认规则都可以在此目录找到:
/usr/lib/firewalld/
简单的方法就是复制默认目录下的规则到配置目录下:
cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
配置文件中包含了服务名,端口,还有就是服务的相关说明,需要注意的时表示服务,表示区域,它们都是按目录进行了区分的。
[root@openresty zones]# cat /usr/lib/firewalld/services/ssh.xml
SSH
Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.
上面的方法都是添加允许通过防火墙的规则。那么怎么添加拒绝的呢?
添加禁止响应ping
firewall-cmd --permanent --add-rich-rule='rule protocol value=icmp drop'
如何查看是否有此规则[等号后面跟详细的名称]
firewall-cmd --query-rich-rule='rule protocol value='icmp' drop'
删除方法:
firewall-cmd --remove-rich-rule='rule protocol value=icmp drop'
添加拒绝某个IP访问ssh端口。
firewall-cmd --add-rich-rule "rule family=ipv4 source address=10.0.10.1 service name='ssh' reject"
我更喜欢直接丢弃:
firewall-cmd --add-rich-rule "rule family=ipv4 source address=10.0.10.1 service name='ssh' drop"
说明:
rule :规则
family:ipv4 指定ipv4的地址
source address=10.0.10.1 要拒绝的IP,可以是IP或者是IP段
service name=’ssh’指定的是ssh服务
drop :就是此条规则的执行方法是丢弃
也可以这样写
firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.10.1 port port=22 protocol=tcp reject'
如果要放行直接修改后面的reject为accept即可。
======================================================
表示允许来自此IP允许通过防火墙
firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.10.1" accept'
允许一个IP(10.0.10.1)仅能通过指定端口(8080-8090)访问到目标(10.0.10.13):
firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.10.1" destination address="10.0.10.13/32" port port="8080-8090" protocol="tcp" accept'
如果要移除规则相对麻烦些,要输入后面详细的记录:
firewall-cmd --remove-rich-rule='rule family="ipv4" source address="10.0.10.1" destination address="10.0.10.13/32" port port="80" protocol="tcp" accept'
不过发现它这个引号和单引号不像shell 那样要求非常严格,只要是对应出现就好了。
最后说明:
如果规则中没有加入参数:—permanent都是即时生效的,而且reload或者重启服务后都不会再有记录。
而加入了参数:—permanent后需要手动reload或者重启服务才生效。 同时可以加入—zone 应用于于哪个区域的参数。