关于python3中文编码的问题的解决及一个方便查询whois的小程序

今天写了个查whois信息的小程序,在python3命令行测试,是正常的,但一用到print命令,就输出乱码,网上找了一些文章,还是觉得这篇写的最准确,共享出来

https://www.cnblogs.com/gjq168/p/9262559.html

说说这个程序,用到的是python-whois 0.7.1模块,之前查询whois信息,总是需要去网站输入,比较麻烦,现在用python3,方便多了,代码公开一下,名字是testwhois.py


#!/usr/bin/python3
# -*- coding: utf-8 -*-

import whois
import sys

w = whois.whois(sys.argv[1])
data = w.text.encode("utf-8").decode("utf-8")
print(data)

使用方法:
./testwhois.py www.163.com

用 Python3.6.9 搭建 HTTP 服务

本文讲述如何用python3.6.9创建基础的 HTTP SERVER,将Python版本写出是为了更准确描述。

(1) 命令行
假设我的HTML页面在/home/httpd下


cd /home/httpd
python3 -m http.server 8000 //8000是默认端口,可以修改为80

网站默认的主文件是 index.htm/inex.html,内容如下


<html>
<head>
<title>techlife.com.cn</title>
</head>
<body>
Techlife 开源/开放
</body>
</html>

用如下命令测试


python3 -m http.server 80

服务器提示
Serving HTTP on 0.0.0.0 port 80 (https://0.0.0.0:80/) …

用浏览器访问服务器IP,会发现是乱码,为了避免中文编码的问题,需要修改index.html,在 html 和 head 标签中间增加如下一行


<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

继续访问,中文正常显示,简单的HTTP服务搭建成功。

有几个有用的命令,在这里一并给出


python3 -m http.server 80 --bind 127.0.0.1 //绑定IP地址,多用于一个服务器上有多个IP的情景
python3 -m http.server --directory /tmp/ //绑定目录,默认端口8000

如果想让页面支持程序交互(CGI),用命令行启动应如下编写


python3 -m http.server 80 --cgi

下面用一个不含参数的提交页面来举例说明
首先构建一个test.html,内容如下


<HTML>
<BODY>
<FORM ACTION = "/cgi-bin/test.py">
<INPUT TYPE = submit>
</FORM>
</BODY>
</HTML>

cgi-bin目录中的test.py,内容如下


#!/usr/bin/python3

import cgi
print('Content-Type:text/html\n\n')
print('hello cgi')

用不带CGI命令参数启动测试,点击提交按钮后,页面直接显示出test.py的内容,也就是说无法解析CGI,如下图

用带CGI命令参数启动测试,点击提交按钮后,页面直接显示test.py执行的结果,也就是说成功解析了cgi,如下图

(2)用Python程序编写简单的 HTTP 服务端
用python程序编写避免了使用命令时,执行窗口一旦关闭,HTTP 服务也随之关闭的问题

先构建一个简单的 Server.py 程序,这个是无法解析CGI的


#!/usr/bin/python3
#--coding:utf-8--

import http.server
import socketserver

PORT = 80

Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()

可以解析CGI的程序如下,我给它起名叫 run_server.py


#!/usr/bin/python3
#--coding:utf-8--

from http.server import HTTPServer, CGIHTTPRequestHandler

port = 80

httpd = HTTPServer(('', port), CGIHTTPRequestHandler)
print("Starting simple_httpd on port: " + str(httpd.server_port))
httpd.serve_forever()

如何让它们在SHELL窗口关闭以后还能继续运行呢,我在/etc/rc.local里加了如下一句话


nohup python3 -u /home/html/run_server.py params1 > nohup.out 2>&1 &

也可以直接在SHELL里执行,然后把窗口关闭,刷新页面试试。

至此,此篇结尾,以上这些例子,大家可以测试,多测试多掌握,有问题一起沟通。

RHEL8 安装 python3.6.9(191023更改,加入Python3.8安装)

Python 3.6.9 – July 2, 2019 新放出的安全补丁版本,正好整了一台RHEL8,装上测试一下

首先因为pip3安装模块需要使用SSL,否则会报SSL连接错误,所以需要先安装openssl-devel


yum -y install openssl-devel

然后安装 Python 3.6.9


3.6.9版本
./configure --prefix=/usr/local/python3 --enable-optimizations --with-ssl
make;make install

3.8版本
./configure --prefix=/usr/local/python3 --enable-shared --enable-optimizations --with-libs='/usr/lib64/libcrypto.so /usr/lib64/libssl.so' --with-ssl-default-suites=openssl  --disable-ipv6

cd /usr/bin/
ln -s /usr/local/python3/bin/python3
ln -s /usr/local/python3/bin/pip3

Looking in links: /tmp/tmp6u244lwp
Collecting setuptools
Collecting pip
Installing collected packages: setuptools, pip
Successfully installed pip-18.1 setuptools-40.6.2

结束安装时会自动安装setuptools 以及 pip

附(引用,原文在https://blog.csdn.net/iodjSVf8U1J7KYc/article/details/85241988 ):

从 RHEL 8 Beta 开始不再强调“系统 Python”,不再默认一个 Python 版本。他们使用模块化的 Application Streams 设计,结合 Python 可多版本同时安装的特点,将为用户提供多个版本 Python 的选项,并且可以从标准存储库轻松安装到标准位置,用户可以选择他们想要在任何给定用户空间中运行的 Python 版本。

Application Streams 是在 RHEL 8 中引入的一类存储库,它提供用户可能希望在给定用户空间中运行的所有应用程序,它是在物理存储库中创建的多个虚拟存储库。

这种变化之后,用户想要使用 Python,需要直接指定 Python3 或者 Python2,而不是直接 Python。同时 yum install python 将返回 404,因为它同样需要指定安装版本。建议使用 yum install @python36 或 yum install @python27 安装推荐软件包,而如果只需要 Python 二进制文件,则可以使用 yum install python3 或 yum install python2。此外,pip 等工具也有变化,比如 Python3 将安装在 pip3 路径下,而不是没有版本指定的 pip 路径。

Red Hat 解释,除了提升用户体验,这种方案还让方便了系统维护人员,因为不会被锁定在系统中老版本的 Python 上,那么他们可以自由地利用新版本的语言功能与性能改进等优势。

Centos中dig命令的使用

一、安装

yum install bind-utils -y

二、使用

(1)指定某DNS查询一个域名。以www.people.cn为例。

dig www.people.cn @dns address

(2)查询A记录

dig www.people.cn A +noall +answer @dns address

(3)查询权威DNS

dig www.people.cn NS +noall +answer @dns address

后面有其他继续增加

用VMware VCenter vami 升级不稳定的问题

当然,前提是保证VCenter这个机器可以上外网,然后根据我们的实验,升级确实和DNS有关系

转储的时候使用114.114.114.114 的时候大概10%以内会提示下载失败;
转储的时候使用8.8.8.8 (国内劫持) 的时候大概40%以内会提示下载失败;

然而
转储的时候使用1.1.1.1 的时候正常下载;

不能登陆 VMware VCenter vami (5480端口)

我们有一台VCenter,最近需要升级,但是打开5480端口,输入正确的用户名和密码,系统提示错误,解决方法如下

打开 VCenter ssh 服务 ,用如下命令查询服务是否都是启动状态

service-control –status

确保 applmgmt 服务是启动的,如果状态是masked 或 closed 需要用命令启动

service-control –start applmgmt

具体参考
https://communities.vmware.com/message/2785375

Flashfxp的版本影响Pureftpd的表现

今天接到业务部门电话,ftp登录不了,报错,还有一些中文的文件夹突然进不去了,因为我最近刚升级了Pureftpd,所以赶紧查询服务状态和日志文件,一切都正常,业务部门的几个账户我这里也都正常,所以怀疑是业务部门的网络有问题。

去业务部门查看,测试网络结果都正常,上网也没问题,但他们用的系统还是Win XP ,又开始怀疑是不是Win XP 系统造成的,结果业务部门说其余还有两台也同样登录不了,Win 7 的系统,看来又排除了系统问题。

最后实在有没有其他情况了,只能从FTP客户端看起来了,他们用的Flashfxp的版本已经很老了,更新了Flashfxp后,一切问题都解决了。

竟然,Flashfxp的版本还能影响连接Pureftpd,又或许是Pureftpd升级后,必须使用最新的Flashfxp,可话说,Flashfxp 5.4.0 这个版本好多年没更新了吧。

Pureftpd+Mysql中的status参数不管用的解决方法

现象:Pureftpd+Mysql中的status参数设置为0表示账户不启用,1表示正常使用,重新安装了Pureftpd+Mysql后这个参数不起作用了

解决:pureftpd-mysql.conf 中有关于 Pureftpd 调用 Mysql 中各参数的简单例子,修改这里即可,下面是我的文件中的,大家按照自己的数据库列名字修改即可,把默认的注释掉,默认的是没有status以及ipaccess参数的

#ADD
MYSQLGetPW SELECT Password FROM users WHERE USER="\L" AND STATUS="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetUID SELECT Uid FROM users WHERE USER="\L" AND STATUS="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetGID SELECT Gid FROM users WHERE USER="\L" AND STATUS="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetDir SELECT Dir FROM users WHERE USER="\L" AND STATUS="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetQTAFS SELECT QuotaFiles FROM users WHERE USER="\L" AND STATUS="1" AND (ipaccess = "*" OR ipaccess LIKE"\R")
MySQLGetQTASZ SELECT QuotaSize FROM users WHERE USER="\L" AND STATUS="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetRatioUL SELECT ULRatio FROM users WHERE USER="\L" AND STATUS="1" AND (ipaccess ="*" OR ipaccess LIKE "\R")
MySQLGetRatioDL SELECT DLRatio FROM users WHERE USER="\L" AND STATUS="1" AND (ipaccess ="*" OR ipaccess LIKE "\R")
MySQLGetBandwidthUL SELECT ULBandwidth FROM users WHERE USER="\L" AND STATUS="1" AND (ipaccess ="*" OR ipaccess LIKE "\R")
MySQLGetBandwidthDL SELECT DLBandwidth FROM users WHERE USER="\L" AND STATUS="1" AND (ipaccess ="*" OR ipaccess LIKE "\R")