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