十八、設置虛擬機的靜態IP
1、VMware的三種網絡模式
安裝VMware Workstation Pro之后,會在Windows系統中虛擬出兩個虛擬網卡,如下:
VMware提供了三種網絡模式,分別是:橋接模式(Bridged)、NAT模式(網絡地址轉換)和僅主機模式(Host?Only)。
1)橋接模式(Bridged)
虛擬機和宿主機(Windows)是平等地位,其關系類似于連接同一交換機的兩個主機。
該模式沒有用到虛擬網卡,交換機/路由器會給虛擬機分配真實的IP地址、網關和子網掩碼。
虛擬機可以與局域網中的主機互相訪問,也可以訪問互聯網。
2)NAT模式(網絡地址轉換)
該模式將使用VMnet8虛擬網卡,由虛擬網卡VMnet8為虛擬機分配IP地址、網關和DNS。
虛擬機可以和宿主機進行相互通信,虛擬機可以訪問局域網中其它的主機,也可以訪問互聯網。但是,其它主機不能訪問此虛擬機。
該模式將使用VMnet1虛擬網卡,由虛擬網卡VMnet1為虛擬機分配IP地址、網關和DNS。
虛擬機只能和宿主機進行相互通信,不能訪問局域網中其它的主機,也不能訪問互聯網。
1)缺省使用NAT模式(配置簡單)。
2)如果你的Windows找不到虛擬網卡(VMnet1和VMnet8),可以試試橋接模式,因為橋接模式不需要虛擬網卡。
3)把虛擬機的網絡參數改為靜態IP。
2、修改主機名
執行命令:
hostnamectl set-hostname 主機名
修改主機名還有其它的方法,百度。
十九、網絡故障診斷
1、網絡連通性測試ping
ping可以用來測試本機與目標主機是否連通、連通的速度和網絡的穩定性。
ping -c 5 -s 1024 目標主機的IP地址(域名)
Linux缺省一直ping下去,用-c選項可以指定ping包的個數。Windows缺省ping四個包,用-n選項指定ping包的個數。
Linux用-s選項指定ping發送數據的字節數(Windows的選項是-l),默認是84字節(56字節的數據+28字節的報頭),最大不超過65535字節。
示例:
2、CentOS禁止ping的設置方法
服務器攻擊一般是從ping開始,黑客攻擊網站前會先ping下服務器,看它是否在線,如果服務器禁止ping,可以一定程度的減少服務器被攻擊次數。CentOS系統默認允許ping,可以修改內核參數禁止ping。
vi /etc/sysctl.conf
在文件末尾加上一行:
net.ipv4.icmp_echo_ignore_all=1
保存后執行sysctl -p使配置生效。
配置生效后,ping服務器收不到任何響應。如果需要允許ping,去掉/etc/sysctl.conf文件中的net.ipv4.icmp_echo_ignore_all=1或者修改為net.ipv4.icmp_echo_ignore_all=0即可。
3、服務可用性測試telnet
telnet 目標主機的IP地址(域名) 端口號
telnet失敗的情況有三種:
1)目標主機不存在或者沒有運行。
2)目標主機沒有提供指定端口的服務。
3)被防火墻攔截了。
二十、系統服務管理
從CentOS7開始,采用systemctl命令管理系統服務,類似Windows的“計算機管理->服務和應用程序->服務”功能。
服務的配置文件存放在/usr/lib/systemd/system目錄中。
重點關注的服務有防火墻(firewalld.service)、遠程登錄(sshd.service,SSH協議)、文件傳輸(vsftpd.service,FTP協議)。
1、systemctl常用命令
systemctl命令的風格是:
systemctl 操作 服務名
1)啟動服務
systemctl start name.service
注意name.service的.service可以省略不寫,以下兩條命令的效果相同。
systemctl start firewalld ????????????# 啟動防火墻服務。
systemctl start firewalld.service ?????#?啟動防火墻服務。
2)停止服務
systemctl stop name.service
3)重啟服務
如果服務沒有啟動,就啟動它。
systemctl restart name.service
4)查看服務是否已啟動
systemctl is-active name.service
5)查看服務的狀態
systemctl status name.service
示例:
Loaded:關于服務是否已經加載的信息,文件的絕對路徑以及是否被啟用的注釋。
Active:服務是否正在運行,然后是啟動時間信息。
Process:進程額外信息。
Main PID:服務主進程pid。
CGroup:Control Groups額外信息。
6)啟用開機自啟動服務
systemctl enable name.service
7)禁用開機自啟動服務
systemctl disable name.service
8)查看服務是否為開機自啟動
systemctl is-enabled name.service
9)只重啟正在運行中的服務
systemctl try-restart name.service
10)顯示所有的服務狀態
systemctl list-units --type service –all
按空格鍵顯示下一頁,按q鍵退出。
11)查看啟動成功的服務列表
systemctl list-unit-files|grep enabled
12)查看啟動失敗的服務列表
systemctl --failed
13)查看所有服務的狀態
systemctl list-unit-files --type service
按空格鍵顯示下一頁,按q鍵退出。
14)列出在指定服務之前啟動的服務(依賴)
systemctl list-dependencies --after name.service
按空格鍵顯示下一頁,按q鍵退出。
15、列出在指定服務之后啟動的服務(被依賴)
systemctl list-dependencies --before name.service
按空格鍵顯示下一頁,按q鍵退出。
2、添加自定義系統服務
1)準備服務程序
/home/wucz/demo01.cpp的源代碼:
#include <iostream>#include <unistd.h>using namespace std;int main(){while(1) ????// 死循環。{int *ptr=new int[100000000]; ?// 申請100000000*sizeof(int)大小的內存。delete [] ptr; ???????????????// 釋放內存。sleep(1); ?// 休眠1秒。}}
2)編寫自定義的系統服務腳本文件
/home/wucz/start.sh的內容如下:
/home/wucz/demo01
/home/wucz/restart.sh的內容如下:
killall demo01
/home/wucz/demo01
/home/wucz/stop.sh的內容如下:
killall demo01
給start.sh、restart.sh、stop.sh賦予可執行權限:
chmod +x /home/wucz/start.sh /home/wucz/restart.sh /home/wucz/stop.sh
3)編寫自定義服務的配置文件
系統服務的啟動/重啟/停止由它的配置文件決定,把demo01程序的服務命名為demo01.service。
創建服務配置文件/usr/lib/systemd/system/demo01.service,內容如下:
[Unit]Description=demo01After=network.target[Service]Type=simpleExecStart=/usr/bin/su - wucz -c "/home/wucz/start.sh"ExecReload=/usr/bin/su - wucz -c "/home/wucz/restart.sh"ExecStop=/usr/bin/su - wucz -c "/home/wucz/stop.sh"RemainAfterExit=yes[Install]WantedBy=multi-user.target
3、自定義系統服務配置文件的含義
1)Unit部分
Unit部分是啟動順序與依賴關系。
[Unit]
Description=demo01
After=network.target
Description字段:給出當前服務的簡單描述。
Documentation字段:給出文檔位置。
After字段:表示本服務應該在某服務之后啟動。
Before字段:表示本服務應該在某服務之前啟動。
After和Before字段只涉及啟動順序,不涉及依賴關系。設置依賴關系,需要使用Wants字段和Requires字段。
Wants字段:表示本服務與某服務之間存在“依賴”系,如果被依賴的服務啟動失敗或停止運行,不影響本服務的繼續運行。
Requires字段,表示本服務與某服務之間存在“強依賴”系,如果被依賴的服務啟動失敗或停止運行,本服務也必須退出。
2)Service部分
Service部分定義如何啟動/重啟/停止服務。
[Service]Type=simpleExecStart=/usr/bin/su - wucz -c "/home/wucz/start.sh"ExecReload=/usr/bin/su - wucz -c "/home/wucz/restart.sh"ExecStop=/usr/bin/su - wucz -c "/home/wucz/stop.sh"RemainAfterExit=yes
啟動類型(Type字段)
Type字段定義啟動類型。它可以設置的值如下。
simple(默認值):ExecStart字段啟動的進程為主進程。
forking:ExecStart字段將以fork()方式啟動,此時父進程將會退出,子進程將成為主進程。
oneshot:類似于simple,但只執行一次,Systemd會等它執行完,才啟動其他服務。
dbus:類似于simple,但會等待D-Bus信號后啟動。
notify:類似于simple,啟動結束后會發出通知信號,然后Systemd再啟動其他服務。
idle:類似于simple,但是要等到其他任務都執行完,才會啟動該服務。
啟動服務(ExecStart字段)
啟動服務時執行的命令,可以是可執行程序、系統命令或shell腳本。
重啟服務(ExecReload字段)
重啟服務時執行的命令,可以是可執行程序、系統命令或shell腳本。
停止服務(ExecStop字段)
停止服務時執行的命令,可以是可執行程序、系統命令或shell腳本。
如果RemainAfterExit字段設為yes,表示進程退出以后,服務仍然保持執行。
3)Install部分
Install部分定義如何安裝這個配置文件,即怎樣做到開機啟動。
[Install]
WantedBy=multi-user.target
WantedBy字段:表示該服務所在的Target。
Target的含義是服務組,表示一組服務。WantedBy=multi-user.target指的是,demo01所在的Target是multi-user.target(多用戶模式)。
這個設置非常重要,因為執行systemctl enable demo01.service命令時,demo01.service會被鏈接到/etc/systemd/system/multi-user.target.wants目錄之中,實現開機啟動的功能。
4、使用自定義的服務
1)重新加載服務配置文件
每次修改了服務配置文件后,需要執行以下命令重新加載服務的配置文件。
systemctl daemon-reload
2)啟動/停止/啟重demo01服務
systemctl start demo01 ? # 啟動demo01服務。
systemctl restart demo01 # 重啟demo01服務。
systemctl stop demo01 ? # 關閉demo01服務。
3)把demo01服務設置為開機/關機自啟動/停止
systemctl is-enabled demo01 # 查看demo01服務是否是開機自啟動。
systemctl enable demo01 ? # 把demo01服務設置為開機自啟動。
二十一、配置防火墻
1、防火墻的基本概念
防火墻技術是用于安全管理的軟件和硬件設備,在計算機內/外網之間構建一道相對隔絕的保護屏障,以保護數據和信息安全性的一種技術。
防火墻分網絡防火墻和主機防火墻。
網絡防火墻由硬件加軟件組成,可以保護整個網絡,價格也很貴,從幾萬到幾十萬的都有,功能非常強大,主要包括入侵檢測、網絡地址轉換、網絡操作的審計監控、強化網絡安全服務等功能。
主機防火墻只有軟件部分(操作系統和殺毒軟件自帶),用于保護本操作系統,功能比較簡單,只能防范簡單的攻擊。
這節課將介紹主機防火墻(CentOS7以上版本)的使用和配置。
2、查看防火墻的命令
1)查看防火墻服務狀態(普通用戶可執行),CentOS缺省啟用防火墻。
systemctl status firewalld
2)查看防火墻已開通的端口,CentOS缺省不開通任何端口。
firewall-cmd --list-port
3)查看防火墻已開通的服務(CentOS缺省開通ssh和dhcpv6-client服務)。
firewall-cmd --list-service
4)查看防火墻全部的信息。
firewall-cmd --list-all
5)查看防火墻支持的服務的列表(普通用戶可執行)。
firewall-cmd --get-services
6)查看防火墻服務是否開機啟動。
systemctl is-enabled firewalld
7)查看防火墻的狀態。
firewall-cmd --state
8)查看防火墻的版本。
firewall-cmd --version
3、配置防火墻的命令
?1)啟動、重啟、關閉防火墻服務。
# 啟動
systemctl start firewalld
# 重啟
systemctl restart firewalld
# 關閉
systemctl stop?firewalld
2)開通、移去端口。
# 開通80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
# 移去80端口
firewall-cmd --zone=public --remove-port=80/tcp --permanent
3)開通、移去服務。
# 開通ftp服務
firewall-cmd --zone=public --add-service=ftp --permanent
# 移去http服務
firewall-cmd --zone=public --remove-service=http --permanent
常用服務的端口:ssh(22)、HTTP(80、8080)、MySQL(3306)、Oracle(1521)?、ftp(21)、
telnet(23)。
4)開通、移去范圍端口。
# 開通5000-5500之間的端口
firewall-cmd --zone=public --add-port=5000-5500/tcp --permanent
# 移去5000-5500之間的端口
firewall-cmd --zone=public --remove-port=5000-5500/tcp --permanent
5)重新加載防火墻配置參數(修改配置后要重新加載防火墻配置或重啟防火墻服務)。
firewall-cmd --reload
6)設置開機時啟用、禁用防火墻服務。
#?啟用服務
systemctl enable firewalld
# 禁用服務
systemctl disable firewalld
二十二、環境變量
程序(操作系統命令或應用程序)的執行需要參數,如果多個程序需要同一個參數,則應該把該參數設置為環境變量。
1、查看環境變量
1)env命令
在shell下,用env命令查看當前用戶全部的環境變量。
env
env|less
env|grep LANG
2)echo命令
echo $環境變量名
2、常用的環境變量
1)LANG
Linux系統的語言和字符集,缺省的中文字符zh_CN.UTF-8,是主流。
如果出現亂碼,SecureCRT與Linux系統的字符集不一致,百度解決。
2)SHELL
用戶當前使用的shell(命令解析器,百度百科,了解基本概念即可)。
3)HOSTNAME
服務器的主機名。
4)HISTSIZE
保存歷史命令的數目。
5)USER
當前登錄用戶的用戶名。
6)HOME
當前登錄用戶的主目錄。
7)PWD
當前工作目錄。
8)PATH
可執行程序的搜索目錄,可執行程序包括Linux系統命令和用戶的應用程序。
9)LD_LIBRARY_PATH
C/C++語言的動態鏈接庫文件搜索的目錄,它不是Linux缺省的環境變量,但對C/C++程序員來說非常重要。
10)CLASSPATH
JAVA語言的庫文件搜索的目錄,它也不是Linux缺省的環境變量,但對JAVA程序員來說非常重要。
3、設置環境量
變量名='值'
export 變量名
或
export 變量名='值'
如果環境變量的值沒有空格等特殊符號,值可以不用單引號包含。
環境變量在退出shell后就會失效,下次登錄時需要重新設置。如果希望環境變量永久生效,需要在腳本文件中配置。
設置PATH環境變量要注意:
export PATH=$PATH:新增的目錄1:新增的目錄2:新增的目錄n:.
1)$PATH表示包含原有PATH的值;
2)目錄之間用:分隔;
3).表示當前目錄。
4、設置系統環境變量
系統環境變量對全部的用戶生效,設置系統環境變量有三種方法。
1)在/etc/profile.d目錄中增加設置環境變量腳本文件,這是Linux推薦的方法。
2)在/etc/profile文件中設置。
用戶登錄時執行/etc/profile文件中設置系統的環境變量。但是,Linux不建議在/etc/profile文件中設置系統環境變量。
/etc/profile在每次啟動時會執行 /etc/profile.d下全部的腳本文件。
/etc/profile.d比/etc/profile好維護,不想要什么變量直接刪除 /etc/profile.d下對應的 shell 腳本即可。
3)在/etc/bashrc文件中設置環境變量。
該文件配置的環境變量將會影響全部用戶。但是,Linux也不建議在/etc/bashrc文件中設置系統環境變量。
5、設置用戶環境變量
用戶環境變量只對當前用戶生效,設置用戶環境變量也有多種方法。
在用戶的主目錄,有幾個隱藏的文件,用ls -l .bash*可以看見。
1).bash_profile(推薦首選)
當用戶登錄時執行,每個用戶都可以使用該文件來配置專屬于自己的環境變量。
2).bashrc
當用戶登錄時以及每次打開新的shell時該文件都將被讀取,不推薦在里面配置用戶專用的環境變量,因為每開一個shell,該文件都會被讀取一次,效率肯定受影響。
3).bash_logout
當每次退出shell時執行該腳本文件。
4).bash_history
保存了當前用戶使用過的歷史命令。
6、su命令與環境變量
su命令可以切換到新用戶,如果沒有-選項,將使用之前的環境,如果有-選項,將使用新用戶的環境,一般需要新用戶的環境。
-c選項用于執行命令(腳本或程序)
二十三、開機啟動程序
在CentOS7中,配置/etc/rc.local腳本文件,也可以實現開機啟動程序。
1、/etc/rc.local是/etc/rc.d/rc.local的軟鏈接
執行ls -l /etc/rc.local查看。
2、rc.local文件的原始內容
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
#
touch /var/lock/subsys/local
中文意思如下:
#?添加此文件是為了兼容。
#?強烈建議創建自己的systemd服務或udev規則,以便在引導期間運行腳本,而不是使用此文件。
#?與以前版本不同,由于在引導期間并行執行,此腳本不會在所有其他服務之后運行。
#?請注意,必須運行'chmod +x /etc/rc.d/rc.local',以確保在引導期間執行此腳本。
雖然Linux強烈建議采用自定義的系統服務實現開機自啟動程序,但是,在實際工作中,配置/etc/rc.local腳本文件啟動程序也是一個不錯的方法,簡單明了,仍被廣泛的采用。
3、rc.local文件的配置
rc.local本質上是一個shell腳本文件,可以把系統啟動時需要運行的程序寫在里面,啟動時將按順序執行。
1)在rc.local中添加以下腳本。
/usr/bin/date >> /tmp/date1.log # 把當前時間追加寫入到/tmp/date1.log中。
/usr/bin/sleep 10 # 睡眠10秒。
/usr/bin/date >> /tmp/date2.log # 把當前時間追加寫入到/tmp/date2.log中。
2)修改/etc/rc.d/rc.local的可執行權限。
chmod +x /etc/rc.d/rc.local
3)重啟服務器。
4)查看日志文件/tmp/date1.log和/tmp/date2.log的內容。
4、應用經驗
1)rc.local腳本在操作系統啟動時只執行一次。
2)環境變量的問題。
在rc.local中執行程序時是沒有環境變量的,如果執行的程序需要環境變量,可以在腳本中設置環境變量,也可以用su切換用戶來執行程序。
3)不要讓rc.local掛起。
rc.local中的內容是按順序執行的,執行完一個程序后才會執行下一個程序,如果執行的不是后臺程序,就應該加&讓程序運行在后臺,否則rc.local會掛起。
可以用以下腳本來測試,rc.local的內容如下:
/usr/bin/date >> /tmp/date1.log ?# 把當前時間追加寫入到/tmp/date1.log中。
/usr/bin/sleep 100 # 睡眠100秒。
/usr/bin/date >> /tmp/date2.log ?# 把當前時間追加寫入到/tmp/date2.log中。
如果采用了以上腳本,Linux系統在啟動完成100后,才會出現以下的登錄界面。
二十四、計劃任務
linux系統用crond服務來提供計劃任務,用于周期性的執行程序或腳本。
systemctl status crond
?
crond服務每分鐘都會檢查是否有需要執行的任務,如果有則執行該任務。
Linux下的計劃任務分為兩種:用戶計劃任務和系統計劃任務。
1、用戶計劃任務
Linux的每個用戶都可以定義自己的計劃任務,用于周期性的執行程序或腳本。計劃任務的內容存放在crontab文件中,每個用戶都有自己的crontab文件。
1)查看crontab文件
crontab -l [-u 用戶名]
root用戶可以用-u選項查看指定用戶的計劃任務,如果沒有-u選項,表示查看自己的計劃任務。普通用戶只查看自己的計劃任務,不允許使用-u選項。
2)編輯crontab文件
crontab -e [-u 用戶名]
root用戶可以用-u選項編輯指定用戶的計劃任務,如果沒有-u選項,表示編輯自己的計劃任務。普通用戶只能編輯自己的計劃任務,不允許使用-u選項。crontab缺省的編輯工具是vi。
3)刪除crontab文件
crontab -r?[-u 用戶名]
root用戶可以用-u選項刪除指定用戶的計劃任務,如果沒有-u選項,表示刪除自己的計劃任務。普通用戶只刪除自己的計劃任務,不允許使用-u選項。
4、crontab文件格式
crontab文件中的每個任務由兩部分組成,執行時間(周期)和執行命令。
執行時間有5個字段:
字段1:分鐘(minute),取值0-59。
字段2:小時(hour),取值0-23。
字段3:月當中的天(day of month),取值1-31,。
字段4:月份(month),取值1-12,或采用月份單詞的英文簡寫。
字段5:星期中的天(day of week),取值0-6,或采用星期單詞的英文簡寫。
以上還可以使用特殊字符:
星號(*):代表全部的值,例如day of month字段如果是星號,則表示在滿足其它字段的制約條件后每天執行該任務。
逗號(,):可以用逗號分隔開的值指定一個列表,例如,“1,2,5,7,8,9”。
中杠(-):可以中杠表示一個范圍,例如“2-6”表示“2,3,4,5,6”。
正斜線(/):可以用正斜線指定時間的間隔頻率,例如minute字段,“0-30/5”表示在0-30的范圍內每5分鐘執行一次;“*/5”表示每5分鐘執行一次。
2、crontab示例
1)每兩分鐘執行一次date命令,結果輸出到/tmp/date.log文件(下同)。
*/2?* * * * /usr/bin/date > /tmp/date.log
2)在每個小時的05、10、15分執行一次date命令。
5,10,15 * * * * /usr/bin/date > /tmp/date.log
3)在每個小時20-30分之間的每一分鐘執行一次date命令。
20-30?* * * * /usr/bin/date > /tmp/date.log
4)在每天的10:30分執行一次date命令。
30?10?* * * /usr/bin/date > /tmp/date.log
5)在每個月1號的02:30分執行一次date命令。
30?02?1?*?*?/usr/bin/date > /tmp/date.log
6)在每星期天的02:30分執行一次date命令。
30?02?*?*?0?/usr/bin/date > /tmp/date.log
3、用戶計劃任務的環境變量
用戶的計劃任務無法設置環境變量,那么如何在用戶計劃任務中執行需要環境變量的程序呢?可以這么做:
1)編寫一個shell腳本;
2)在腳本中設置環境變量;
3)在腳本中執行需要環境變量的程序。
4、系統計劃任務
系統計劃任務在/etc/crontab文件配置,以下缺省/etc/crontab文件的內容:
系統計劃任務的/etc/crontab文件中,可以設置環境變量,可以指定執行任務的用戶。系統計劃任務的執行時間的與用戶計劃任務的執行時間含義相同,不再描述。
網上很多文章認為系統計劃任務是執行系統級別的周期性任務,例如系統備份、把緩存數據寫入硬盤、清理日志文件等。這些說法有些片面,我不這么認為。用戶計劃任務和系統計劃任務沒有本質的區別,都可以達到相同的目的。
二十五、云服務器網絡設置
1、server.cpp
#include <stdio.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <netdb.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>int main(int argc,char *argv[]){if (argc!=2){printf("Using:./server port\nExample:./server 5005\n\n"); return -1;}// 第1步:創建服務端的socket。int listenfd;if ( (listenfd = socket(AF_INET,SOCK_STREAM,0))==-1) { perror("socket"); return -1; }// 第2步:把服務端用于通信的地址和端口綁定到socket上。struct sockaddr_in servaddr; ???// 服務端地址信息的數據結構。memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family = AF_INET; ?// 協議族,在socket編程中只能是AF_INET。servaddr.sin_addr.s_addr = htonl(INADDR_ANY); ?????????// 任意ip地址。//servaddr.sin_addr.s_addr = inet_addr("192.168.190.134"); // 指定ip地址。servaddr.sin_port = htons(atoi(argv[1])); ?// 指定通信端口。if (bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) != 0 ){ perror("bind"); close(listenfd); return -1; }// 第3步:把socket設置為監聽模式。if (listen(listenfd,5) != 0 ) { perror("listen"); close(listenfd); return -1; }// 第4步:接受客戶端的連接。int ?clientfd; ?????????????????// 客戶端的socket。int ?socklen=sizeof(struct sockaddr_in); // struct sockaddr_in的大小struct sockaddr_in clientaddr; ?// 客戶端的地址信息。clientfd=accept(listenfd,(struct sockaddr *)&clientaddr,(socklen_t*)&socklen);printf("客戶端(%s)已連接。\n",inet_ntoa(clientaddr.sin_addr));// 第5步:與客戶端通信,接收客戶端發過來的報文后,回復ok。char buffer[1024];while (1){int iret;memset(buffer,0,sizeof(buffer));if ( (iret=recv(clientfd,buffer,sizeof(buffer),0))<=0) // 接收客戶端的請求報文。{printf("iret=%d\n",iret); break; ??}printf("接收:%s\n",buffer);strcpy(buffer,"ok");if ( (iret=send(clientfd,buffer,strlen(buffer),0))<=0) // 向客戶端發送響應結果。{ perror("send"); break; }printf("發送:%s\n",buffer);}// 第6步:關閉socket,釋放資源。close(listenfd); close(clientfd);}
2、client.cpp
#include <stdio.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <netdb.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>int main(int argc,char *argv[]){if (argc!=3){printf("Using:./client ip port\nExample:./client 127.0.0.1 5005\n\n"); return -1;}// 第1步:創建客戶端的socket。int sockfd;if ( (sockfd = socket(AF_INET,SOCK_STREAM,0))==-1) { perror("socket"); return -1; }// 第2步:向服務器發起連接請求。struct hostent* h;if ( (h = gethostbyname(argv[1])) == 0 ) ??// 指定服務端的ip地址。{ printf("gethostbyname failed.\n"); close(sockfd); return -1; }struct sockaddr_in servaddr;memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(atoi(argv[2])); // 指定服務端的通信端口。memcpy(&servaddr.sin_addr,h->h_addr,h->h_length);if (connect(sockfd, (struct sockaddr *)&servaddr,sizeof(servaddr)) != 0) ?// 向服務端發起連接清求。{ perror("connect"); close(sockfd); return -1; }char buffer[1024];// 第3步:與服務端通信,發送一個報文后等待回復,然后再發下一個報文。for (int ii=0;ii<3;ii++){int iret;memset(buffer,0,sizeof(buffer));sprintf(buffer,"這是第%d個超級女生,編號%03d。",ii+1,ii+1);if ( (iret=send(sockfd,buffer,strlen(buffer),0))<=0) // 向服務端發送請求報文。{ perror("send"); break; }printf("發送:%s\n",buffer);memset(buffer,0,sizeof(buffer));if ( (iret=recv(sockfd,buffer,sizeof(buffer),0))<=0) // 接收服務端的回應報文。{printf("iret=%d\n",iret); break;}printf("接收:%s\n",buffer);}// 第4步:關閉socket,釋放資源。close(sockfd);}
二十六、云服務器的安全問題
云服務器暴露在互聯網上,一定會受到攻擊(用于挖礦、發廣告郵件、游戲外掛)。
如果云服務器有黑客行為,可能會被云平臺強制收回(不會退錢)。
1、設置強密碼
例如:#87alp123(*&BE563DT99T=H%AJED#
2、禁用root用戶遠程登錄
創建普通用戶,以普通用戶的身份遠程登錄云服務器,如果需要用到root用戶的權限,su -即可。
修改ssh服務的配置文件/etc/ssh/sshd_config
把
#PermitRootLogin yes
改為
PermitRootLogin no
3、修改ssh的端口
把ssh的端口改為其它的,不要用22。
修改/etc/ssh/sshd_config
把
#Port 22
改為
Port 其它的端口
注意:還需要開通云服務器的主機防火墻和云平臺的安全組。