Linux 學習筆記__Day3

十八、設置虛擬機的靜態IP

1、VMware的三種網絡模式

安裝VMware Workstation Pro之后,會在Windows系統中虛擬出兩個虛擬網卡,如下:

VMware提供了三種網絡模式,分別是:橋接模式(Bridged)、NAT模式(網絡地址轉換)和僅主機模式(Host?Only)

1)橋接模式(Bridged)

虛擬機和宿主機(Windows)是平等地位,其關系類似于連接同一交換機的兩個主機。

該模式沒有用到虛擬網卡交換機/路由器會給虛擬機配真實的IP地址網關和子網掩碼

虛擬機與局域網中的主機互相訪問,也可以訪問互聯網。

2)NAT模式(網絡地址轉換

該模式使用VMnet8虛擬網卡,由虛擬網卡VMnet8為虛擬機分配IP地址網關和DNS

虛擬機可以和宿主機進行相互通信,虛擬機可以訪問局域網中其的主機,也可以訪問互聯網。但是,其它主機不能訪問此虛擬機。

3)僅主機模式(Host?Only)

該模式使用VMnet1虛擬網卡,由虛擬網卡VMnet1為虛擬機分配IP地址網關和DNS

虛擬機只能和宿主機進行相互通信,不能訪問局域網中其它的主機,也不能訪問互聯網

應用的經驗

1)缺省使用NAT模式(配置簡單)。

2)如果你的Windows找不到虛擬網卡(VMnet1VMnet8),可以試試橋接模式,因為橋接模式不需要虛擬網卡。

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字段:表示本服務應該在某服務之前啟動。

AfterBefore字段只涉及啟動順序,不涉及依賴關系。設置依賴關系,需要使用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缺省開通sshdhcpv6-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(命令解析器,百度百科,了解基本概念即可)。

3HOSTNAME

服務器的主機名。

4)HISTSIZE

保存歷史命令的數目。

5USER

當前登錄用戶的用戶名。

6HOME

當前登錄用戶的主目錄。

7PWD

當前工作目錄。

8)PATH

可執行程序的搜索目錄,可執行程序包括Linux系統命令和用戶的應用程序。

9)LD_LIBRARY_PATH

C/C++語言的動態鏈接庫文件搜索的目錄,它不是Linux缺省的環境變量,但對C/C++程序員來說非常重要。

10CLASSPATH

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 其它的端口

注意:還需要開通云服務器的主機防火墻和云平臺的安全組。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67338.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67338.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67338.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

QT+mysql+python 效果:

# This Python file uses the following encoding: utf-8 import sysfrom PySide6.QtWidgets import QApplication, QWidget,QMessageBox from PySide6.QtGui import QStandardItemModel, QStandardItem # 導入需要的類# Important: # 你需要通過以下指令把 form.ui轉為ui…

筆記本跑大模型嘗試

1&#xff0c;筆記本電腦資源 我是一臺聯想筆記本電腦&#xff0c;基本配置如下&#xff1a; CPU&#xff1a;12th Gen Intel(R) Core(TM) i7-1255U 1.70 GHz (12核心&#xff0c;2個P核和8個E核&#xff0c;共計10個核心) 顯卡&#xff1a;NVIDIA GeForce MX550 內存&am…

C語言實現掃雷游戲(有展開一片和標記雷的功能)

實現準備 分2個.c源文件和1個.h頭文件去寫代碼 test.c 對掃雷游戲進行測試game.c 掃雷游戲功能的實現game.h 掃雷游戲功能的聲明 掃雷游戲 1.test.c對掃雷游戲進行測試 首先我們要先把玩游戲的框架寫出來&#xff0c;然后一步一步去完成其功能 跟著下面的代碼的節奏走一步一步…

GitHub 倉庫的 Archived 功能詳解:中英雙語

GitHub 倉庫的 Archived 功能詳解 一、什么是 GitHub 倉庫的 “Archived” 功能&#xff1f; 在 GitHub 上&#xff0c;“Archived” 是一個專門用于標記倉庫狀態的功能。當倉庫被歸檔后&#xff0c;它變為只讀模式&#xff0c;所有的功能如提交代碼、創建 issue 和 pull req…

基礎IO(2)

基礎IO&#xff08;2&#xff09; 理解“?切皆?件” ?先&#xff0c;在windows中是?件的東西&#xff0c;它們在linux中也是?件&#xff1b;其次?些在windows中不是?件的東西&#xff0c;?如進程、磁盤、顯?器、鍵盤這樣硬件設備也被抽象成了?件&#xff0c;你可以使…

Transformation,Animation and Viewing

4 Transformation&#xff0c;Animation and Viewing 聲明&#xff1a;該代碼來自&#xff1a;Computer Graphics Through OpenGL From Theory to Experiments&#xff0c;僅用作學習參考 4.1 Modeling Transformations 平移、縮放和旋轉&#xff0c;即 OpenGL 的建模轉換&…

Deepseek的RL算法GRPO解讀

在本文中&#xff0c;我們將深入探討Deepseek采用的策略優化方法GRPO&#xff0c;并順帶介紹一些強化學習&#xff08;Reinforcement Learning, RL&#xff09;的基礎知識&#xff0c;包括PPO等關鍵概念。 策略函數&#xff08;policy&#xff09; 在強化學習中&#xff0c; a…

【python】python基于機器學習與數據分析的二手手機特性關聯與分類預測(源碼+數據集)【獨一無二】

&#x1f449;博__主&#x1f448;&#xff1a;米碼收割機 &#x1f449;技__能&#x1f448;&#xff1a;C/Python語言 &#x1f449;專__注&#x1f448;&#xff1a;專注主流機器人、人工智能等相關領域的開發、測試技術。 python基于機器學習與數據分析的二手手機特性關聯與…

手撕Diffusion系列 - 第十一期 - lora微調 - 基于Stable Diffusion(代碼)

手撕Diffusion系列 - 第十一期 - lora微調 - 基于Stable Diffusion&#xff08;代碼&#xff09; 目錄 手撕Diffusion系列 - 第十一期 - lora微調 - 基于Stable Diffusion&#xff08;代碼&#xff09;Stable Diffusion 原理圖Stable Diffusion的原理解釋Stable Diffusion 和Di…

前端【8】HTML+CSS+javascript實戰項目----實現一個簡單的待辦事項列表 (To-Do List)

目錄 一、功能需求 二、 HTML 三、CSS 四、js 1、綁定事件與初始設置 2.、綁定事項 &#xff08;1&#xff09;添加操作&#xff1a; &#xff08;2&#xff09;完成操作 &#xff08;3&#xff09;刪除操作 &#xff08;4&#xff09;修改操作 3、完整js代碼 總結…

C++標準線程庫實現優雅退出的方式

目錄 1.通過設置共享退出標記 2.使用std::jthread創建線程 3.定義消息類型的方式 4.注意事項 1.通過設置共享退出標記 定義一個退出變量bool stop false; 表示線程是否應該停止。在主線程中設置標記stoptrue,然后join一直等待&#xff0c;然后線程循環檢測到stop是否為tru…

Java學習教程,從入門到精通,JDBC插入記錄語法及案例(104)

JDBC插入記錄語法及案例 一、JDBC插入記錄語法 在JDBC中&#xff0c;插入記錄主要通過執行SQL的INSERT語句來實現。其基本語法如下&#xff1a; INSERT INTO 表名 (列1, 列2, ..., 列n) VALUES (值1, 值2, ..., 值n);表名&#xff1a;需要插入記錄的表的名稱。列1, 列2, …,…

vue事件總線(原理、優缺點)

目錄 一、原理二、使用方法三、優缺點優點缺點 四、使用注意事項具體代碼參考&#xff1a; 一、原理 在Vue中&#xff0c;事件總線&#xff08;Event Bus&#xff09;是一種可實現任意組件間通信的通信方式。 要實現這個功能必須滿足兩點要求&#xff1a; &#xff08;1&#…

圖像處理之HSV顏色空間

目錄 1 RGB 的局限性 2 HSV 顏色空間 3 RGB與HSV相互轉換 4 HSV顏色模型對圖像的色相、飽和度和明度進行調節 5 演示Demo 5.1 開發環境 5.2 功能介紹 5.3 下載地址 參考 1 RGB 的局限性 RGB 是我們接觸最多的顏色空間&#xff0c;由三個通道表示一幅圖像&#xff0c;分…

DeepSeek是由杭州深度求索人工智能基礎技術研究有限公司(簡稱“深度求索”)發布的一系列人工智能模型

DeepSeek是由杭州深度求索人工智能基礎技術研究有限公司&#xff08;簡稱“深度求索”&#xff09;發布的一系列人工智能模型&#xff0c;其在知識類任務上展現出了卓越的性能。以下是對DeepSeek的詳細介紹&#xff0c;內容雖無法達到10000字&#xff0c;但會盡可能全面且深入地…

【C++高并發服務器WebServer】-9:多線程開發

本文目錄 一、線程概述1.1 線程和進程的區別1.2 線程之間共享和非共享資源1.3 NPTL 二、線程操作2.1 pthread_create2.2 pthread_exit2.3 pthread_join2.4 pthread_detach2.5 patch_cancel2.6 pthread_attr 三、實戰demo四、線程同步五、死鎖六、讀寫鎖七、生產消費者模型 一、…

14-6-1C++STL的list

(一&#xff09;list容器的基本概念 list容器簡介&#xff1a; 1.list是一個雙向鏈表容器&#xff0c;可高效地進行插入刪除元素 2.list不可以隨機存取元素&#xff0c;所以不支持at.(pos)函數與[ ]操作符 &#xff08;二&#xff09;list容器頭部和尾部的操作 list對象的默…

在sortablejs的拖拽排序情況下阻止input拖拽事件

如題 問題 在vue3的elementPlus的table中&#xff0c;通過sortablejs添加了行拖拽功能&#xff0c;但是在行內會有輸入框&#xff0c;此時拖拽輸入框會觸發sortablejs的拖拽功能 解決 基于這個現象&#xff0c;我懷疑是由于拖拽事件未綁定而冒泡到后面的行上從而導致的拖拽…

21.Word:小趙-畢業論文排版?【39】

目錄 題目? NO1.2 NO3.4 NO5.6 NO7.8.9 NO10.11.12 題目 NO1.2 自己的論文當中接收老師的修改&#xff1a;審閱→比較→源文檔&#xff1a;考生文件夾&#xff1a;Word.docx→修訂的文檔&#xff1a;考生文件夾&#xff1a;教師修改→確定→接收→接收所有修訂將合并之…

leetcode_鏈表 876.鏈表的中間節點

876.鏈表的中間節點 給你單鏈表的頭結點 head &#xff0c;請你找出并返回鏈表的中間結點。如果有兩個中間結點&#xff0c;則返回第二個中間結點。思路&#xff1a;快慢指針&#xff0c;創建兩個指針fast和slow&#xff0c;fast指針每次移動兩步&#xff0c;slow指針每次移動…