Python小程序-根据用户输入的身高体重计算BMI值

题目要求:

请根据BMI公式(体重除以身高的平方)按照用户输入的身高体重计算BMI指数,并根据BMI指数:

  • 低于18.5:过轻
  • 18.5-25:正常
  • 25-28:过重
  • 28-32:肥胖
  • 高于32:严重肥胖

if-elif判断并打印结果。

代码:

height = float(input("请输入身高(单位,米):"))
weight = float(input("请输入体重(单位,公斤):"))
bmi = weight / (height ** 2)
if bmi < 18.5:
    print("过轻")
elif 18.5 <= bmi < 25:
    print("正常")
elif 25 <= bmi < 28:
    print("过重")
elif 28 <= bmi < 32:
    print("肥胖")
else:
    print("严重肥胖")

小结:

Python中求次方可以使用底数 ** 接指数,例如:求2的8次方,可以写成2 ** 8。

Python列表操作函数笔记

定义一个列表。

>>> abc=['a','b','c','d']

向列表尾部插入一个元素。

>>> abc.append('e')
>>> print(abc)
['a', 'b', 'c', 'd', 'e']

向列表中指定位置插入元素。

>>> abc.insert(2,'hi')
>>> print(abc)
['a', 'b', 'hi', 'c', 'd', 'e']

删除末尾元素。

>>> abc.pop()
>>> print(abc)
['a', 'b', 'hi', 'c', 'd']

删除指定的元素。

>>> abc.pop(2)
>>> print(abc)
['a', 'b', 'c', 'd']

Python小程序-计算并输出成绩提高的百分比

题目要求:

小明的成绩从去年的72分提升到了今年的85分,请计算小明成绩提升的百分点,并用字符串格式化显示出’xx.x%’,只保留小数点后1位。

代码:

r = ((85 - 72)/72)*100
print('%2.1f%%' % r)

小结:

%2.1f代表格式化输出的浮点型字符串中,小数点前保留两位,小数点后保留一位,其中小数点前可省略不写,写成%.1f的形式也是可以的。

为Apache配置虚拟目录

虚拟目录简介:

虚拟目录就是将原本不存在于网站根目录下的目录映射到一个别名上,这样Apache就可以通过“http(s)://网址/别名”的形式访问他啦!

配置方法:

先配置一个简单的虚拟主机。

[root@localhost ~]# vim /etc/httpd/conf.d/a.conf
<VirtualHost *:80>
       DocumentRoot /tmp/html/
</VirtualHost>

在虚拟主机中定义虚拟目录。

Alias /dir /tmp/html1

最终的虚拟机配置文件的内容是这样的。

<VirtualHost *:80>
       DocumentRoot /tmp/html/
       Alias /dir /tmp/html1
</VirtualHost>

创建站点目录及网页。

[root@localhost ~]# mkdir /tmp/html /tmp/html1
[root@localhost ~]# echo one > /tmp/html/index.html
[root@localhost ~]# echo two > /tmp/html1/index.html

在保证selinux和防火墙均关闭的情况下启动Apache。

[root@localhost ~]# service httpd start

测试:

可以选择在Windows的浏览器上测试,这里我为了方便,直接在CentOS下的文本浏览器中测试。

安装浏览器。

[root@localhost ~]# yum install -y links

使用浏览器打开站点首页,这里的192.168.1.100是我的Apache服务器的IP地址。

[root@localhost ~]# links 192.168.1.100

按q退出后,重新打开带虚拟目录的站点URL,可以看到,成功输出了虚拟目录中的首页文件的内容,至此,虚拟目录配置完成。

[root@localhost ~]# links 192.168.1.100/dir

配置vsftpd服务器的最大并发连接数、每个客户端的最大线程数及文件下载速度

之所以把他们三个放在一起写,是因为这三个都是关乎资源限制及保障FTP服务器稳定运行的。

默认配置文件中是没有这三个选项的,如需要可手动添加。vsftpd配置文件路径:/etc/vsftpd/vsftpd.conf

max_clients=10               #配置最大并发客户端连接数。
max_per_ip=5                 #配置单个IP可使用的线程数(主要为了“照顾”迅雷等多线程下载软件)。
local_max_rate=50000         #配置用户的最大下载速度,单位是b/s。

vsftpd设置无操作时的超时时间及文件传输超时时间

之所以把这两个放在一起写,不是因为他们两个都是关于超时时间的设定,而是因为这俩在配置文件中离得实在太近了(手动滑稽)~

编辑主配置文件。

[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf

转到第五十九行,其就是设置无操作时的超时时间的选项,默认时间单位是秒,默认动作是什么都不做,如果你想配置一个超时时间那么请取消注释(删除#符号)。

#idle_session_timeout=600

转到第62行,这一行是关于文件传输超时时间的设定,默认单位也是秒,默认动作是什么都不做。

#data_connection_timeout=120</pre>

CentOS 6下挂载NFS共享的方法

挂载前请确保客户机已安装nfs-utils软件包,否则是无法成功挂载的(我是不会告诉你我在这个坑里蹲了四个多小时才爬出来的)。

[root@localhost ~]# yum install -y nfs-utils

挂载使用如下命令格式:

mount nfs服务器ip:共享文件夹的路径 要挂载在本地的路径

例如:

[root@localhost ~]# mount 192.168.1.20:/tmp/test1 /mnt/test1

笔者看到网上有的教程推荐使用类似如下命令来进行挂载:

[root@localhost ~]# mount -t nfs 10.0.2.69:/home /mnt

但经过实测,CentOS 6.5可以不使用-t参数来指定文件系统类型,程序会自动识别。

除了命令行挂载之外,也可以将其加入到/etc/fstab文件中实现开机自动挂载。

之后重启系统即可自动挂载,若想立即生效可以使用如下命令 :

[root@localhost ~]# mount -a

卸载nfs使用此命令格式:

umount nfs共享的挂载点

例如:

[root@localhost ~]# umount /mnt/test1

最后再介绍一种比较特殊的情况,那就是当nfs服务器无响应的时候,在客户端执行df命令或showmount命令时会导致进程假死,而使用umount命令卸载nfs存储则会抛出错误。

此问题的解决方法参考此篇文章:

https://www.ibadboy.net/archives/730.html

Linux下添加虚拟网卡,实现一块物理网卡绑定多个IP地址

前言:
这个功能在实际生产环境中可能没有意义,但是在虚拟机里做实验的时候还是蛮实用的,可以直接在一个网卡上模拟出多个网段,这样就不用再添加单独的网卡啦。
配置方法:
以当前网卡的配置文件为模板创建虚拟网卡。

[root@localhost ~]# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0:1

编辑虚拟网卡的配置文件。

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0:1

删除其中的MAC地址信息和UUID信息,同时将DEVICE的参数改为eth0:1,并按需求修改IP地址等信息。
以下是我修改好的虚拟网卡配置文件,仅供参考。注意!不要为虚拟网卡配置网关和DNS信息,完全没有意义且容易造成网络连接问题。

DEVICE=eth0:1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.2.100
NETMASK=255.255.255.0

重启网络。

[root@localhost ~]# service network restart

最后,ping一下虚拟网卡的IP地址看看是否配置成功。

[root@localhost ~]# ping 192.168.2.100 -c 4
PING 192.168.2.100 (192.168.2.100) 56(84) bytes of data.
64 bytes from 192.168.2.100: icmp_seq=1 ttl=64 time=0.010 ms
64 bytes from 192.168.2.100: icmp_seq=2 ttl=64 time=0.021 ms
64 bytes from 192.168.2.100: icmp_seq=3 ttl=64 time=0.033 ms
64 bytes from 192.168.2.100: icmp_seq=4 ttl=64 time=0.021 ms

配置rndc实现对BIND的管理

rndc介绍:
rndc是BIND安装包提供的一种控制域名服务运行的工具,可以实现在不重启BIND的情况下对zone及解析记录等配置进行更新。
软件包安装:
首先要安装BIND软件包才可以使用rndc工具,rndc和BIND可以不在同一台服务器上部署。

[root@localhost ~]# yum install -y bind

rndc配置部分:
生成rndc的通信密钥及配置文件,/dev/urandom是Linux下用来生成随机数的一个文件,这里使用-r选项调用它是为了生成通信密钥。

[root@localhost ~]# rndc-confgen -r /dev/urandom > /etc/rndc.conf

编辑刚刚生成的配置文件。

[root@localhost ~]# vim /etc/rndc.conf

转到第9行,其定义了要管理的BIND服务器的地址,按照需求对其进行修改,本实验中我的BIND服务器的地址是192.169.1.101.

default-server 192.168.1.101;

BIND配置部分:
使用vim打开rndc的配置文件,转到第十四行,此行直到末尾都是要加入到/etc/named.conf文件中的,加入后可以按照自己的需求进行修改,比如说第21行的inet选项是用来定义监听本服务器的哪些接口的(当然是监听和rndc相连的接口啦),如果想监听所有接口则将其改为0.0.0.0。第22行是定义此BIND服务器允许接受哪些rndc的管理,将127.0.0.1改成运行rndc的设备的IP地址就行。最后别忘了把注释去掉,否则配置文件是不生效的。

14 # Use with the following in named.conf, adjusting the allow list as needed:
15 # key "rndc-key" {
16 # algorithm hmac-md5;
17 # secret "YAkaS9u8kADIcBMslszUaw==";
18 # };
19 #
20 # controls {
21 # inet 127.0.0.1 port 953
22 # allow { 127.0.0.1; } keys { "rndc-key"; };
23 # };
24 # End of named.conf

以下是我的/etc/named.conf文件的完整配置(第40行到末尾是新增的配置),仅供参考,切勿复制。
运行BIND的服务器的IP:192.168.1.101
运行rndc的服务器的IP:192.168.1.100

  1 //
  2 // named.conf
  3 //
  4 // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
  5 // server as a caching only nameserver (as a localhost DNS resolver only).
  6 //
  7 // See /usr/share/doc/bind*/sample/ for example named configuration files.
  8 //
  9
 10 options {
 11 listen-on port 53 { any; };
 12 listen-on-v6 port 53 { ::1; };
 13 directory "/var/named";
 14 dump-file "/var/named/data/cache_dump.db";
 15 statistics-file "/var/named/data/named_stats.txt";
 16 memstatistics-file "/var/named/data/named_mem_stats.txt";
 17 allow-query { any; };
 18 recursion yes;
 19
 20 dnssec-enable yes;
 21 dnssec-validation yes;
 22 dnssec-lookaside auto;
 23
 24 /* Path to ISC DLV key */
 25 bindkeys-file "/etc/named.iscdlv.key";
 26
 27 managed-keys-directory "/var/named/dynamic";
 28 };
 29
 30 logging {
 31 channel default_debug {
 32 file "data/named.run";
 33 severity dynamic;
 34 };
 35 };
 36
 37 include "/etc/named.rfc1912.zones";
 38 include "/etc/named.root.key";
 39
 40 # Use with the following in named.conf, adjusting the allow list as needed:
 41 key "rndc-key" {
 42 algorithm hmac-md5;
 43 secret "YAkaS9u8kADIcBMslszUaw==";
 44 };
 45 #
 46 controls {
 47 inet 192.168.1.101 port 953
 48 allow { 192.168.1.100; } keys { "rndc-key"; };
 49 };
 50 # End of named.conf

保存后重启named服务器

[root@localhost ~]# server named restart

使用rndc连接BIND并进行管理
在使用rndc连接BIND前一定要确保两台Linux服务器的时间同步,否则会报错(我做实验的时候卡在这个坑里整整一天)
可以手工修改系统时间也可以与NTP服务器同步,若你的实验用机器无法链接外网,又不想手工配置时间,则可以参考下面这篇文章,将其中一台机器配置为NTP,供另一台机器同步。

CentOS 6下配置NTP网络时间服务器


启动rndc并连接BIND。

[root@localhost ~]# rndc status
WARNING: key file (/etc/rndc.key) exists, but using default configuration file (/etc/rndc.conf)
version: 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6
CPUs found: 1
worker threads: 1
number of zones: 19
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running

可以看到,上面的输出信息中包含了一条警告,这个其实没什么影响的,如果你有强迫症可以使用下面这条命令开启动rndc,这样就不会看到那条警告了。

[root@localhost ~]# rndc -c /etc/rndc.conf status

rndc常用管理命令:

status                    #显示bind服务器的工作状态
reload                    #重新加载配置文件和区域文件
reload zone_name          #重新加载指定区域
reconfig                  #重读配置文件并加载新增的区域
querylog                  #关闭或开启查询日志
dumpdb                    #将高速缓存转储到转储文件 (named_dump.db)
freeze                    #暂停更新所有动态zone
freeze zone [class [view]]#暂停更新一个动态zone
flush [view]              #刷新服务器的所有高速缓存
flushname name            #为某一视图刷新服务器的高速缓存
stats                     #将服务器统计信息写入统计文件中
stop                      #将暂挂更新保存到主文件并停止服务器
halt                      #停止服务器,但不保存暂挂更新
trace                     #打开debug, debug有级别的概念,每执行一次提升一次级别
trace LEVEL               #指定 debug 的级别, trace 0 表示关闭debug
notrace                   #将调试级别设置为 0
restart                   #重新启动服务器(尚未实现)
addzone zone [class [view]] { zone-options } #增加一个zone
delzone zone [class [view]]                  #删除一个zone
tsig-delete keyname [view]#删除一个TSIG key
tsig-list                 #查询当前有效的TSIG列表
validation newstate [view]#开启/关闭dnssec

CentOS 6下部署VNC服务器

VNC简介:

VNC是Linux/UNIX下优秀的远程桌面控制软件,由客户端(vncviewer)和服务端(vncserver)两部分组成。

安装软件包:

[root@localhost ~]# yum install -y tigervnc
[root@localhost ~]# yum install -y tigervnc-server

配置前的准备工作:

正式配置VNC服务前,先添加几个系统账号用于测试。

[root@localhost ~]# useradd user1
[root@localhost ~]# useradd user2
[root@localhost ~]# useradd user3

可以不用设置密码,当然,你想设置也可以。

服务配置:

编辑VNC主配置文件。

[root@localhost ~]# vim /etc/sysconfig/vncservers

在文件末尾找如下两行。

# VNCSERVERS="2:myusername"
# VNCSERVERARGS[2]="-geometry 800x600 -nolisten tcp -localhost"

复制一份,或者直接去掉这两行前面的注释也可以,修改为如下形式。

VNCSERVERS="1:user1 2:user2"
VNCSERVERARGS[1]="-geometry 800x600 -nolisten tcp -localhost"
VNCSERVERARGS[2]="-geometry 800x600 -nolisten tcp -localhost"

其中VNCSERVERS选项用以指定允许远程登录的用户名及该用户的编号,VNCSERVERARGS选项后面接用户编号,其后定义的是该用户远程登录的参数。

VNCSERVERARGS的默认参数有如下几个:

-geometry 桌面分辨率,默认1024x768;
-nohttpd 不监听HTTP端口(58xx端口);
-nolisten tcp 不监听X端口(60xx端口);
-localhost 只允许从本机访问;
-AlwaysShared 默认只同时允许一个vncviewer连接,此参数允许同时连多个vncviewer;
-SecurityTypes None 登录不需要密码认证VncAuth默认值,要密码认证。

启动服务:

先切换到各个账户下为他们分别配置VNC密码,此密码可以与用户系统账户密码不同。(尝试过在root用户下为他们统一配置密码,发现行不通。。。)

[root@localhost ~]# su user1
[user1@localhost root]$ vncpasswd
Password:              #要求输入密码
Verify:                #要求再次输入密码

user2用户也要按照上面的方法配置VNC密码。

最后切换回root用户,在保证防火墙已关闭的情况下统一开启VNC服务,此时VNC进程会自动生成用户的VNC服务配置文件及日志文件到用户家目录的.vnc/下。

[root@localhost ~]# service vncserver start
正在启动 VNC 服务器:
1:user1
New 'localhost.localdomain:1 (user1)' desktop is localhost.localdomain:1
Starting applications specified in /home/user1/.vnc/xstartup
Log file is /home/user1/.vnc/localhost.localdomain:1.log
2:user2
New 'localhost.localdomain:2 (user2)' desktop is localhost.localdomain:2
Starting applications specified in /home/user2/.vnc/xstartup
Log file is /home/user2/.vnc/localhost.localdomain:2.log

注意第四行,其中的desktop is localhost.localdomain:1是告诉你,user1的VNC进程号是1,访问此VNC桌面的方法就是IP:1。而user2的进程号则是2,观察倒数第四行(算上空行~)。

如果你只想为某一用户启用VNC进程,可以切换到该用户的身份上,执行vncserver命令。注:使用此方法启用VNC服务后,在root用户下就不能再使用service命令来关闭VNC服务器了,必须使用kill -9暴力杀死用户的VNC服务器进程。

[root@localhost ~]# su user1
[user1@localhost root]$ vncserver
New 'localhost.localdomain:3 (user1)' desktop is localhost.localdomain:3
Starting applications specified in /home/user1/.vnc/xstartup
Log file is /home/user1/.vnc/localhost.localdomain:3.log

为用户指定默认桌面环境:

编辑user1的VNC配置文件。

[root@localhost ~]# vim /home/user1/.vnc/xstartup

转至文件末尾,找到下面一行。

twm &                   #指定默认使用文本界面

将其修改为以下任意一种形式,根据自己的需求选择,不要把两个都加上,如果你那么干了,那我只能感慨你是个大傻瓜了。

startkde &              #指定默认使用KDE桌面环境
gnome-session &         #指定默认使用Gnome桌面环境

使用客户端连接VNC服务器:

可以使用Windows下的VNC客户端,本实验中我在另一台安装有Desktop的CentOS6.5上使用客户端连接VNC。

安装VNC客户端,并连接VNC服务器,这里我连接user2的VNC服务。

[root@localhost ~]# yum install -y vnc
[root@localhost ~]# vncviewer 192.168.1.101:2

之后会弹出一个窗口要求你输入VNC的密码。

输入后按回车键就可以连接VNC桌面啦!

我这里出现乱码不是VNC配置的问题,而是因为安装系统的时候选择了系统语言为中文,但Desktop下却没有安装中文字体。上图中,gnmoe桌面的系统工具提醒我安装zh-cn字体,那我就安装一下吧!可以看到,安装后立刻正常了~

dhclient报错:dhclient(3108) is already running – exiting.的解决方法

问题表现:
执行dhclient命令时抛出以下错误。

dhclient(3108) is already running - exiting.
This version of ISC DHCP is based on the release available
on ftp.isc.org. Features have been added and other changes
have been made to the base software release in order to make
it work better with this distribution.
Please report for this software via the CentOS Bugs Database:
 http://bugs.centos.org/
exiting.

解决方法:
查找dhclient进程。

[root@localhost ~]# ps -ef | grep dhclient
root 3108 1    0 04:36 ?     00:00:00 dhclient
root 4140 3013 0 05:16 pts/0 00:00:00 grep dhclient

可以看到进程ID是3108,杀死他。

[root@localhost ~]# kill -9 3108

之后再次执行dhclient就正常了。

CentOS 6下安装VNC服务器失败的解决方法

看到很多朋友在CentOS 6 下安装VNC服务器的时候会出现下面这条错误:

Error Downloading Packages:
tigervnc-server-module-1.1.0-5.el6_4.1.x86_64: failure: Packages/tigervnc-server-module-1.1.0-5.el6_4.1.x86_64.rpm from c6-media: [Errno 256] No more mirrors to try.

提示说,软件包下载失败。出现这个错误,八九不离十是因为你是使用的下面这条命令来安装VNC服务器的。

yum install -y vnc-server

正确的安装命令应该是:

yum install -y tigervnc-server

使用管道命令配合正则表达式提取Linux下指定网卡的IP地址

我不想直接把命令贴出来并告诉你:“这样做就对了”,下面我会一点点带你把具体的命令分析出来。
一般情况下在Linux下查看网卡IP地址一般都用什么命令?是下面这一条,对吧。

[root@localhost ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:70:91:62
inet addr:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe70:9162/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:58059 errors:0 dropped:0 overruns:0 frame:0
TX packets:13478 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4629291 (4.4 MiB) TX bytes:2488172 (2.3 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:260 errors:0 dropped:0 overruns:0 frame:0
TX packets:260 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:35416 (34.5 KiB) TX bytes:35416 (34.5 KiB)

命令返回了好长一大串信息,可以发现ifconfig命令默认是返回所有网卡的信息的,也包括本地换回口,那如何指定其只返回某一张网卡的信息呢?可以写成下面这样。
ifconfig 接网卡名
本实验中,我只获取eth0的网卡信息。

[root@localhost ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 08:00:27:70:91:62
inet addr:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe70:9162/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:58090 errors:0 dropped:0 overruns:0 frame:0
TX packets:13494 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4631879 (4.4 MiB) TX bytes:2490700 (2.3 MiB)

观察上面的输出信息,会发现,IP地址是在“inet addr:”这个关键字后面输出的,那我们的第一步就是使用管道命令把含有这个关键字的行给提取出来。

[root@localhost ~]# ifconfig eth0 | grep "inet addr:"
inet addr:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0

接下来要怎么做呢?
观察上方的输出,可以发现其是由好几个部分通过空格符来组合在一起的,这样我们就可以使用awk命令来过滤出第二个字段。

[root@localhost ~]# ifconfig eth0 | grep "inet addr:" | awk '{print $2}'
addr:192.168.1.11

已经离成功很近了,现在只需要去除多余的“addr:”这个字符串即可,直接在字符串中删除一段字符串这个命令我没找到,那就曲线救国呗,咱将排除“addr:”这个字符串的字符串输出出来就好(有点绕口)。数一下“addr:”这个字符串一共有五个字符,那咱们就从第六个字符开始输出,一直输出到行尾就可以整理出IP地址啦!

[root@localhost ~]# ifconfig eth0 | grep "inet addr:" | awk '{print $2}' | cut -c 6-
192.168.1.11