① 怎麼在linux伺服器上測試TCP/UDP埠的連通性
翻譯自:
How to Test Port[TCP/UDP] Connectivity from a Linux Server (文檔 ID 2212626.1)
適用於:
Linux OS - Version Oracle Linux 5.0 to Oracle Linux 6.8 [Release OL5 to OL6U8]
Information in this document applies to any platform.
目標:
在Linux伺服器上檢查TCP/UDP埠的連通性。
解決方案:
telnet和nc 是用來測試埠連通性的一般工具。
telnet可以測試tcp埠的連通性。
nc可以測試tcp和udp埠的連通性。
請確保telnet和nc工具已經安裝
在CODE上查看代碼片派生到我的代碼片
# yum install nc
# yum install telnet
測試tcp埠的連通性:
語法如下:
在CODE上查看代碼片派生到我的代碼片
telnet <hostname/IP address> <port number>
如下是連通成功的例子:
在CODE上查看代碼片派生到我的代碼片
# telnet 192.118.20.95 22
Trying 192.118.20.95...
Connected to 192.118.20.95.
Escape character is '^]'.
SSH-2.0-OpenSSH_6.6.1
Protocol mismatch.
Connection closed by foreign host.
如下是連通不成功的例子:
在CODE上查看代碼片派生到我的代碼片
# telnet 192.118.20.95 22
Trying 192.118.20.95...
telnet: connect to address 192.118.20.95: No route to host
使用nc命令來測試tcp埠的連通性:
語法:
在CODE上查看代碼片派生到我的代碼片
nc -z -v <hostname/IP address> <port number>
如下是連通成功的例子:
在CODE上查看代碼片派生到我的代碼片
# nc -z -v 192.118.20.95 22
Connection to 192.118.20.95 22 port [tcp/ssh] succeeded!
如下是連通不成功的例子:
在CODE上查看代碼片派生到我的代碼片
# nc -z -v 192.118.20.95 22
nc: connect to 192.118.20.95 port 22 (tcp) failed: No route to host
使用nc命令來測試udp埠的連通性:
語法:
在CODE上查看代碼片派生到我的代碼片
nc -z -v -u <hostname/IP address> <port number>
在CODE上查看代碼片派生到我的代碼片
# nc -z -v -u 192.118.20.95 123
Connection to 192.118.20.95 123 port [udp/ntp] succeeded!
nc檢測埠的用法
nc -z -w 10 %IP% %PORT%
-z表示檢測或者掃描埠
-w表示超時時間
-u表示使用UDP協議
② 基於Linux的遠程指令系統(使用udp而不是tcp)
一. Linux下UDP編程框架
使用UDP進行程序設計可以分為客戶端和伺服器端兩部分。
1.伺服器端程序包括:
? 建立套接字
? 將套接字地址結構進行綁定
? 讀寫數據
? 關閉套接字
2.客戶端程序包括:
? 建立套接字
? 讀寫數據
? 關閉套接字
3.伺服器端和客戶端程序之間的差別
伺服器端和客戶端兩個流程之間的主要差別在於對地址的綁定函數(bind()函數),而客戶端可以不用進行地址和埠的綁定操作。
二.Linux中UDP套接字函數
從圖可知,UDP協議的服務端程序設計的流程分為套接字建立,套接字與地址結構進行綁定,收發數據,關閉套接字;客戶端程序流程為套接字建立,收發數據,關閉套接字等過程。它們分別對應socket(),bind(),sendto(),recvfrom(),和close()函數。
網路程序通過調用socket()函數,會返回一個用於通信的套接字描述符。Linux應用程序在執行任何形式的I/O操作的時候,程序是在讀或者寫一個文件描述符。因此,可以把創建的套接字描述符看成普通的描述符來操作,並通過讀寫套接字描述符來實現網路之間的數據交流。
1. socket
1> 函數原型:
int socket(int domain,int type,int protocol)
2> 函數功能:
函數socket()用於創建一個套接字描述符。
3> 形參:
? domain:用於指定創建套接字所使用的協議族,在頭文件
中定義。
常見的協議族如下:
AF_UNIX:創建只在本機內進行通信的套接字。
AF_INET:使用IPv4 TCP/IP協議
AF_INET6:使用IPv6 TCP/IP協議
說明:
AF_UNIX只能用於單一的UNIX系統進程間通信,而AF_INET是針對Interne的,因而可以允許在遠程主機之間通信。一般把它賦為AF_INET。
? type:指明套接的類型,對應的參數如下
SOCK_STREAM:創建TCP流套接字
SOCK_DGRAM:創建UDP數據報套接字
SOCK_RAW:創建原始套接字
? protocol:
參數protocol通常設置為0,表示通過參數domain指定的協議族和參數type指定的套接字類型來確定使用的協議。當為原始套接字時,系統無法唯一的確定協議,此時就需要使用使用該參數指定所使用的協議。
4> 返回值:執行成功後返回一個新創建的套接字;若有錯誤發生則返回一個-1,錯誤代碼存入errno中。
5> 舉例:調用socket函數創建一個UDP套接字
int sock_fd;
sock_fd = socket(AF_INET,SOCK_DGRAM,0);
if(sock_fd < 0){
perror(「socket」);
exit(1);
}
2. bind
1> 函數原型:
int bind(int sockfd,struct sockaddr *my_addr,socklen_taddrlen)
2> 函數功能
函數bind()的作用是將一個套接字文件描述符與一個本地地址綁定在一起。
3> 形參:
? sockfd:sockfd是調用socket函數返回的文件描述符;
? addrlen是sockaddr結構的長度。
? my_addr: 是一個指向sockaddr結構的指針,它保存著本地套接字的地址(即埠和IP地址)信息。不過由於系統兼容性的問題,一般不使用這個結構,而使用另外一個結構(struct sockaddr_in)來代替
4> 套接字地址結構:
(1)structsockaddr:
結構struct sockaddr定義了一種通用的套接字地址,它在
Linux/socket.h 中定義。
struct sockaddr{
unsigned short sa_family;/*地址類型,AF_XXX*/
char sa_data[14];/*14位元組的協議地址*/
}
a. sin_family:表示地址類型,對於使用TCP/IP協議進行的網路編程,該值只能是AF_INET.
b. sa_data:存儲具體的協議地址。
(2)sockaddr_in
每種協議族都有自己的協議地址格式,TCP/IP協議組的地址格式為結構體struct sockaddr_in,它在netinet/in.h頭文件中定義。
struct sockaddr_in{
unsigned short sin_family;/*地址類型*/
unsigned short sin_port;/*埠號*/
struct in_addr sin_addr;/*IP地址*/
unsigned char sin_zero[8];/*填充位元組,一般賦值為0*/
}
a. sin_family:表示地址類型,對於使用TCP/IP協議進行的網路編程,該值只能是AF_INET.
b. sin_port:是埠號
c. sin_addr:用來存儲32位的IP地址。
d. 數組sin_zero為填充欄位,一般賦值為0.
e. structin_addr的定義如下:
struct in_addr{
unsignedlong s_addr;
}
結構體sockaddr的長度為16位元組,結構體sockaddr_in的長度為16位元組。可以將參數my_addr的sin_addr設置為INADDR_ANY而不是某個確定的IP地址就可以綁定到任何網路介面。對於只有一IP地址的計算機,INADDR_ANY對應的就是它的IP地址;對於多宿主主機(擁有多個網卡),INADDR_ANY表示本伺服器程序將處理來自所有網路介面上相應埠的連接請求
5> 返回值:
函數成功後返回0,當有錯誤發生時則返回-1,錯誤代碼存入errno中。
6>舉例:調用socket函數創建一個UDP套接字
struct sockaddr_in addr_serv,addr_client;/*本地的地址信息*/
memset(&serv_addr,0,sizeof(struct sockaddr_in));
addr_serv.sin_family = AF_INET;/*協議族*/
addr_serv.sin_port = htons(SERV_PORT);/*本地埠號*/
addr_serv.sin_addr.s_addr = htonl(INADDR_ANY); /*任意本地地址*/
/*套接字綁定*/
if(bind(sock_fd,(struct sockaddr *)&addr_serv),sizeof(structsockaddr_in)) <0)
{
perror(「bind」);
exit(1);
}
3.close
1>函數原型:
int close(intfd);
2>函數功能:
函數close用來關閉一個套接字描述符。
3>函數形參:
? 參數fd為一個套接字描述符。
4>返回值:
執行成功返回0,出錯則返回-1.錯誤代碼存入errno中。
說明:
以上三個函數中,前兩個要包含頭文件
#include
#include
後一個包含:
#include
4.sendto
1>函數原型:
#include
#include
ssize_t sendo(ints,const void *msg,size_t len,int flags,const struct sockaddr *to,socklen_ttolen);
2>函數功能:
向目標主機發送消息
3>函數形參:
? s:套接字描述符。
? *msg:發送緩沖區
? len:待發送數據的長度
? flags:控制選項,一般設置為0或取下面的值
(1)MSG_OOB:在指定的套接字上發送帶外數據(out-of-band data),該類型的套接字必須支持帶外數據(eg:SOCK_STREAM).
(2)MSG_DONTROUTE:通過最直接的路徑發送數據,而忽略下層協議的路由設置。
? to:用於指定目的地址
? tolen:目的地址的長度。
4>函數返回值:
執行成功後返回實際發送數據的位元組數,出錯返回-1,錯誤代碼存入errno中。
5>函數舉例:
char send_buf[BUFFERSIZE];
struct sockaddr_in addr_client;
memset(&addr_client,0,sizeof(struct sockaddr_in));
addr_client.sin_family = AF_INET;
addr_client.sin_port = htons(DEST_PORT);
if(inet_aton(「172.17.242.131」,&addr_client.sin_addr)<0){
perror(「inet_aton」);
exit(1);
}
if(sendto(sock_fd,send_buf,len,0,(strut sockaddr*)&addr_client,sizeof(struct sockaddr_in)) <0){
perror(「sendto」);
exit(1);
}
5.recvfrom
1>函數原型:
#include
#include
ssize_t recvfrom(int s,void *buf,size_t len,intflags,struct sockaddr *from,socklen_t *fromlen);
2>函數功能:接收數據
3>函數形參:
? int s:套接字描述符
? buf:指向接收緩沖區,接收到的數據將放在這個指針所指向的內存空間。
? len:指定了緩沖區的大小。
? flags:控制選項,一般設置為0或取以下值
(1)MSG_OOB:請求接收帶外數據
(2)MSG_PEEK:只查看數據而不讀出
(3)MSG_WAITALL:只在接收緩沖區時才返回。
? *from:保存了接收數據報的源地址。
? *fromlen:參數fromlen在調用recvfrom前為參數from的長度,調用recvfrom後將保存from的實際大小。
4>函數返回值:
執行成功後返回實際接收到數據的位元組數,出錯時則返回-1,錯誤代碼存入errno中。
5>函數實例:
char recv_buf[BUFFERSIZE];
struct sockaddr_in addr_client;
int src_len;
src_len = sizeof(struct sockaddr_in);
int src_len;
src_len = sizeof(struct sockaddr_in);
if(recvfrom(sock_fd,recv_buf,sizeof(recv_buf),0,(structsockaddr *)&src_addr,&src_len)<0){
perror(「again_recvfrom」);
exit(1);
}
三.UDP編程實例
客戶端向伺服器發送字元串Hello tiger,伺服器接收到數據後將接收到字元串發送回客戶端。
1.伺服器端程序
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9
10 #define SERV_PORT 3000
11
12 int main()
13 {
14 int sock_fd; //套接子描述符號
15 int recv_num;
16 int send_num;
17 int client_len;
18 char recv_buf[20];
19 struct sockaddr_in addr_serv;
20 struct sockaddr_in addr_client;//伺服器和客戶端地址
21 sock_fd = socket(AF_INET,SOCK_DGRAM,0);
22 if(sock_fd < 0){
23 perror("socket");
24 exit(1);
25 } else{
26
27 printf("sock sucessful\n");
28 }
29 //初始化伺服器斷地址
30 memset(&addr_serv,0,sizeof(struct sockaddr_in));
31 addr_serv.sin_family = AF_INET;//協議族
32 addr_serv.sin_port = htons(SERV_PORT);
33 addr_serv.sin_addr.s_addr = htonl(INADDR_ANY);//任意本地址
34
35 client_len = sizeof(struct sockaddr_in);
36 /*綁定套接子*/
37 if(bind(sock_fd,(struct sockaddr *)&addr_serv,sizeof(struct sockaddr_in))<0 ){
38 perror("bind");
39 exit(1);
40 } else{
41
42 printf("bind sucess\n");
43 }
44 while(1){
45 printf("begin recv:\n");
46 recv_num = recvfrom(sock_fd,recv_buf,sizeof(recv_buf),0,(struct sockaddr *)&addr_client,&client_len);
47 if(recv_num < 0){
48 printf("bad\n");
49 perror("again recvfrom");
50 exit(1);
51 } else{
52 recv_buf[recv_num]='\0';
53 printf("recv sucess:%s\n",recv_buf);
54 }
55 printf("begin send:\n");
56 send_num = sendto(sock_fd,recv_buf,recv_num,0,(struct sockaddr *)&addr_client,client_len);
57 if(send_num < 0){
58 perror("sendto");
59 exit(1);
60 } else{
61 printf("send sucessful\n");
62 }
63 }
64 close(sock_fd);
65 return 0;
66 }
2.客戶端程序
1 #include
2 #include
3 #include
4 #include
5 #include
6
7 #include
8 #include
9 #include
10
11 #define DEST_PORT 3000
12 #define DSET_IP_ADDRESS "192.168.1.103"
13
14 int main()
15 {
16 int sock_fd;/*套接字文件描述符*/
17 int send_num;
18 int recv_num;
19 int dest_len;
20 char send_buf[20]={"hello tiger"};
21 char recv_buf[20];
22 struct sockaddr_in addr_serv;/*服務端地址,客戶端地址*/
23
24 sock_fd = socket(AF_INET,SOCK_DGRAM,0);//創建套接子
25 //初始化伺服器端地址
26 memset(&addr_serv,0,sizeof(addr_serv));
27 addr_serv.sin_family = AF_INET;
28 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
29 addr_serv.sin_port = htons(DEST_PORT);
30
31 dest_len = sizeof(struct sockaddr_in);
32 printf("begin send:\n");
33 send_num = sendto(sock_fd,send_buf,sizeof(send_buf),0,(struct sockaddr *)&addr_serv,dest_len);
34 if(send_num < 0){
35 perror("sendto");
36 exit(1);
37 } else{
38
39 printf("send sucessful:%s\n",send_buf);
40 }
41 recv_num = recvfrom(sock_fd,recv_buf,sizeof(recv_buf),0,(struct sockaddr *)&addr_serv,&dest_len);
42 if(recv_num <0 ){
43
44 perror("recv_from");
45 exit(1);
46 } else{
47 printf("recv sucessful\n");
48 }
49 recv_buf[recv_num]='\0';
50 printf("the receive:%s\n",recv_buf);
51 close(sock_fd);
52 return 0;
53 }
③ 求教linux系統用什麼命令開啟UDP埠
Linux下面沒有什麼直接開啟或者關閉埠的命令,因為核鬧滾若僅僅只是開啟了埠而不把它與進程相改余聯系的話,埠的開啟與關閉就顯得毫無意義了(開了埠卻沒有程序處理進來的數據)彎燃
④ linux shell命令行向udp埠發送數據
先nc -uv,然歲悔後在輸入數據即可
nc -uvz可以用來測試udp埠是否開啟監聽
比如要向本地10001端正雀橡口發送數據,可以使用
echo "hello" > /dev/udp/localhost/10001
方法二的好處在於,發送完數據後自動退出。當我們需要在命令行下循環向特定udp埠發送數據時,我們只能使用方法二。舉旁
例如
while true
do
echo "xxxx" > /dev/udp/localhost/10001
done
⑤ Linux使用TPROXY進行UDP的透明代理
在進行TCP的代理時,只要在NET表上無腦進行REDIRECT就好了。例如使用ss-redir,你只要把tcp的流量redirect到ss-redir監聽的埠上就OK了。但是當你使用這種方法的時候,就會不正常,因為對於UDP進行redirect之後,原始的目的地址和埠就找不到了。
這是為什麼呢?
ss-redir的原理很簡單:使用iptables對PREROUTING與OUTPUT的TCP/UDP流量進行REDIRECT(REDIRECT是DNAT的特例),ss—redir在捕獲網路流量後,通過一些技術手段獲取REDIRECT之前的目的地址(dst)與埠(port),連同網路流量一起轉發至遠程伺服器。旁帶
針對TCP連接,的確是因為Linux Kernel連接跟蹤機制的實現才使獲取數據包原本的dst和port成為可能,但這種連接跟蹤機制並非只存在於TCP連接中,UDP連接同樣存在,conntrack -p udp便能看到UDP的連接跟蹤記錄。內核中有關裂啟猛TCP與UDP的NAT源碼/net/netfilter/nf_nat_proto_tcp.c和/net/netfilter/nf_nat_proto_udp.c幾乎一模一樣,都是根據NAT的類型做SNAT或DNAT。
那這究竟是怎麼一回事?為什麼對於UDP連接就失效了呢?
回過頭來看看ss-redir有關獲取TCP原本的dst和port的源碼,核心函數是getdestaddr:
在內核源碼中搜了下有關SO_ORIGINAL_DST的東西,看到了getorigdst:
We only do TCP and SCTP at the moment。Oh,shit!只針對TCP與SCTP才能這么做,並非技術上不可行,只是人為地阻止罷了。
為了在redirect UDP後還能夠獲取原本的dst和port,ss-redir採用了TPROXY。Linux系統有關TPROXY的設置是以下三條命令:
大意就是在mangle表的PREROUTING中為每個UDP數據包打上0x2333/0x2333標志,之後在路由選擇中將具有0x2333/0x2333標志的數據包投遞到本地環回設備上的1080埠;對監聽0.0.0.0地址的1080埠的socket啟用IP_TRANSPARENT標志,使IPv4路由能夠將非本機的數據報投遞到傳輸層,傳遞給監聽1080埠的ss-redir。IP_RECVORIGDSTADDR與IPV6_RECVORIGDSTADDR則表示獲取送達數據包的dst與port。
可問題來了:要知道mangle表並不會修改數據包,那麼TPROXY是如何做到在不修改數據包的前提下將非本機dst的數據肆橋包投遞到換回設備上的1080埠呢?
這個問題在內核中時如何實現的,還待研究,但是確定是TPROXY做了某些工作。
TPROXY主要功能:
TPROXY要解決的兩個重要的問題
參考:
https://blog.csdn.net/ts__cf/article/details/78942294
https://vvl.me/2018/06/09/from-ss-redir-to-linux-nat/
⑥ Linux netstat命令詳解
Netstat 命令用於顯示各種網路相關信息,如網路連接,路由表,介面狀態 (Interface Statistics),masquerade 連接,多播成員 (Multicast Memberships) 等等。
執行netstat後,其輸出結果為
從整體上看,netstat的輸出結果可以分為兩個部分:
一個是Active Internet connections,稱為有源TCP連接,其中"Recv-Q"和"Send-Q"指%0A的是接收隊列和發送隊列。這些數字一般都應該是0。如果不是則表示軟體包正在隊列中堆積。這種情況只能在非常少的情況見到。
另一個是Active UNIX domain sockets,稱為有源Unix域套介面(和網路套接字一樣,但是只能用於本機通信,性能可以提高一倍)。
Proto顯示連接使用的協議,RefCnt表示連接到本套介面上的進程號,Types顯示套介面的類型,State顯示套介面當前的狀態,Path表示連接到套介面的其它進程使用的路徑名。
-a (all)顯示所有選項,默認不顯示LISTEN相關
-t (tcp)僅顯示tcp相關選項
-u (udp)僅顯示udp相關選項
-n 拒絕顯示別名,能顯示數字的全部轉化成數字。
-l 僅列出有在 Listen (監聽) 的服務狀態
-p 顯示建立相關鏈接的程序名
-r 顯示路由信息,路由表
-e 顯示擴展信息,例如uid等
-s 按各個協議進行統計
-c 每隔一個固定時間,執行該netstat命令。
提示:LISTEN和LISTENING的狀態只有用-a或者-l才能看到
列出所有埠 netstat -a
列出所有 tcp 埠 netstat -at
列出所有 udp 埠 netstat -au
只顯示監聽埠 netstat -l
只列出所有監聽 tcp 埠 netstat -lt
只列出所有監聽 udp 埠 netstat -lu
只列出所有監聽 UNIX 埠 netstat -lx
顯示所有埠的統計信息 netstat -s
顯示 TCP 或 UDP 埠的統計信息 netstat -st 或 -su
netstat -p 可以與其它開關一起使用,就可以添加 「PID/進程名稱」 到 netstat 輸出中,這樣 debugging 的時候可以很方便的發現特定埠運行的程序。
當你不想讓主機,埠和用戶名顯示,使用 netstat -n。將會使用數字代替那些名稱。
同樣可以加速輸出,因為不用進行比對查詢。
如果只是不想讓這三個名稱中的一個被顯示,使用以下命令
netstat 將每隔一秒輸出網路信息。
在輸出的末尾,會有如下的信息
注意: 使用 netstat -rn 顯示數字格式,不查詢主機名稱。
並不是所有的進程都能找到,沒有許可權的會不顯示,使用 root 許可權查看所有的信息。
找出運行在指定埠的進程
顯示詳細信息,像是 ifconfig 使用 netstat -ie:
查看連接某服務埠最多的的IP地址
TCP各種狀態列表
⑦ 檢測基於udp的服務端,在windows下,和linux各用什麼命令
兩個系統都是用巧賣netstat命令,選項不一樣而已
linux中查看udp連接孝好逗,netstat -u
windows中襪雹:netstat -p udp
⑧ Linux增加TCP和UDP的本地埠分配范圍
ip_local_port_range,TCP和UDP本地埠范圍,默認桐瞎沖為神裂[32768 , 60999],其中,最小值要求大於等於ip_unprivileged_port_start參數。
ip_unprivileged_port_start,非特權埠開始值,默認為1024.如果應局殲用程序需要綁定小於此值的埠號,需要root許可權。
臨時調整
永久調整
在/etc/sysctl.d目錄下,創建配置文件,將需要調整的參數加入其中即可。配置文件名格式為<number>-<appname>.conf。appname可以直接用應用系統運行時的os用戶名。
執行以下命令,使之生效。替換掉命令中的文件名。
例如:
⑨ Linux常用命令
就是list的縮寫,通過ls 命令不僅可以查看linux文件夾包含的文件,而且可以查看文件許可權(包括目錄、文件夾、文件許可權)看目錄信息等等
常用參數搭配:
實例:
(changeDirectory),命令語法:cd [目錄名]。說明:切換當前目錄至dirName
實例:
查看當前工作目錄路徑
實例:
創建文件夾
實例:
刪除一個目錄中的一個或多個文件或目錄,如果沒有使用- r選項,則rm不會刪除目錄。如果使用rm 來刪除文件,通常仍可以將該文件恢復原狀
rm [選項] 文件…
常用參數搭配:
實例:
刪除空目錄,一個目錄被刪除之前必須是空的。(注意,rm -r dir 命令可以代替rmdir,但是很危險,萬一它突然就不是空的咧?),另外刪除某目錄時必須具有對父目錄的寫許可權。
實例:
rmdir -p watch/avi刪掉avi目錄,watch目錄就空掉了,那還看什麼?所以乾脆把watch目錄一起刪掉,眼不見為不凈嘛。
mv命令是move的縮寫,可以用來移動文件或者將文件改名,是Linux系統下常用的命令,經常用來備份文件或者目錄。
命令功能:
視mv命令中第二個參數類型的不同(是目標文件還是目標目錄),mv命令將文件重命名或將其移至一個新的目錄中。當第二個參數類型是文件時,mv命令完成文件重命名,此時,源文件只能有一個(也可以是源目錄名),它將所給的源文件或目錄重命名為給定的目標文件名。當第二個參數是已存在的目錄名稱時,源文件或目錄參數可以有多個,mv命令將各參數指定的源文件均移至目標目錄中。在跨文件系統移動文件時,mv先拷貝,再將原有文件刪除,而鏈至該文件的鏈接也將丟失。
命令參數:
實例:
將源文件復制至目標文件,或將多個源文件復制至目標目錄。
注意:命令行復制,如果目標文件已經存在會提示是否覆蓋,而在shell腳本中,如果不加-i參數,則不會提示,而是直接覆蓋!
命令參數:
實例:
cat主要有三大功能:
命令參數:
實例:
功能類似於cat, more會以一頁一頁的顯示方便使用者逐頁閱讀,而最基本的指令就是按空白鍵(space)就往下一頁顯示,按 b 鍵就會往回(back)一頁顯示
命令參數:
常用操作命令:
實例:
less 與 more 類似,但使用 less 可以隨意瀏覽文件,而 more 僅能向前移動,卻不能向後移動,而且 less 在查看之前不會載入整個文件。
命令參數:
實例:
head 用來顯示檔案的開頭至標准輸出中,默認head命令列印其相應文件的開頭10行。
常用參數:
實例:
從指定點開始將文件寫到標准輸出。使用tail命令的-f選項可以方便的查閱正在改變的日誌文件,tail -f filename會把filename里最尾部的內容顯示在屏幕上,並且不斷刷新,使你看到最新的文件內容。
常用參數:
實例:
用於改變linux系統文件或目錄的訪問許可權。該命令有兩種用法。一種是包含字母和操作符表達式的文字設定法;另一種是包含數字的數字設定法。
每一文件或目錄的訪問許可權都有三組,每組用三位表示,分別為文件屬主的讀、寫和執行許可權;與屬主同組的用戶的讀、寫和執行許可權;系統中其他用戶的讀、寫和執行許可權。可使用ls -l test.txt查找。
以文件log2012.log為例:
-rw-r--r-- 1 root root 296K 11-13 06:03 log2012.log
第一列共有10個位置,第一個字元指定了文件類型。在通常意義上,一個目錄也是一個文件。如果第一個字元是橫線,表示是一個非目錄的文件。如果是d,表示是一個目錄。從第二個字元開始到第十個共9個字元,3個字元一組,分別表示了3組用戶對文件或者目錄的許可權。許可權字元用橫線代表空許可,r代表只讀,w代表寫,x代表可執行。
常用參數:
許可權范圍:
許可權代號:
實例:
tar命令是類Linux中比價常用的解壓與壓縮命令。
常用參數:
-c: 建立壓縮檔案
-x:解壓
-t:查看內容
-r:向壓縮歸檔文件末尾追加文件
-u:更新原壓縮包中的文件
這五個是獨立的命令,壓縮解壓都要用到其中一個,可以和別的命令連用但只能用其中一個。下面的參數是根據需要在壓縮或解壓檔案時可選的。
下面的參數-f是必須的
常見解壓/壓縮命令
chown將指定文件的擁有者改為指定的用戶或組,用戶可以是用戶名或者用戶ID;組可以是組名或者組ID;文件是以空格分開的要改變許可權的文件列表,支持通配符。
常用參數:
實例:
顯示磁碟空間使用情況。獲取硬碟被佔用了多少空間,目前還剩下多少空間等信息,如果沒有文件名被指定,則所有當前被掛載的文件系統的可用空間將被顯示。默認情況下,磁碟空間將以 1KB 為單位進行顯示,除非環境變數 POSIXLY_CORRECT 被指定,那樣將以512位元組為單位進行顯示。
常用參數:
實例:
命令也是查看使用空間的,但是與df命令不同的是,能看到的文件只是一些當前存在的,沒有被刪除的,他計算的大小就是當前他認為存在的所有文件大小的累加和。命令是對文件和目錄磁碟使用的空間的查看。
常用參數:
實例:
ln命令用於將一個文件創建鏈接,鏈接分為軟鏈接和硬鏈接,命令默認使用硬鏈接。當在不同目錄需要該文件時,就不需要為每一個目錄創建同樣的文件,通過ln創建的鏈接(link)減少磁碟佔用量。
軟鏈接:
硬鏈接:
需要注意:
常用參數:
實例:
顯示或設定系統的日期與時間
命令參數:
實例:
可以用戶顯示公歷(陽歷)日歷,如只有一個參數,則表示年份(1-9999),如有兩個參數,則表示月份和年份。
常用參數:
實例:
強大的文本搜索命令,grep(Global Regular Expression Print)全局正則表達式搜索。
grep的工作方式是這樣的,它在一個或多個文件中搜索字元串模板。如果模板包括空格,則必須被引用,模板後的所有字元串被看作文件名。搜索的結果被送到標准輸出,不影響原文件內容。
命令格式:
grep [option] pattern file|dir
常用參數:
實例:
wc(word count)功能為統計指定的文件中位元組數、字數、行數,並將統計結果輸出。
命令格式:
wc [option] file..
命令參數:
實例:
ps(process status),用來查看當前運行的進程狀態,一次性查看,如果需要動態連續結果使用top。
linux上進程有5種狀態:
ps工具標識進程的5種狀態碼:
命令參數:
實例:
顯示當前系統正在執行的進程的相關信息,包括進程ID、內存佔用率、CPU佔用率等。
常用參數:
發送指定的信號到相應進程。不指定型號將發送SIGTERM(15)終止指定進程。如果無法終止該程序可用「-KILL」 參數,其發送的信號為SIGKILL(9) ,將強制結束進程,使用ps命令或者jobs 命令可以查看進程號。root用戶將影響用戶的進程,非root用戶只能影響自己的進程。
常用參數:
實例:
顯示系統內存使用情況,包括物理內存、交互區內存(swap)和內核緩沖區內存。
命令參數:
實例:
Netstat 是一款命令行工具,可用於列出系統上所有的網路套接字連接情況,包括 tcp, udp 以及 unix 套接字,另外它還能列出處於監聽狀態(即等待接入請求)的套接字。如果你想確認系統上的 Web 服務有沒有起來,你可以查看80埠有沒有打開。以上功能使 netstat 成為網管和系統管理員的必備利器。
命令參數:
實例