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