1. 請教linux下用戶態進程調度問題
在進行Linux系統操作的時候,有時候會遇到一次用戶態進程死循環,即系統反應遲鈍、進程掛死等問題,那麼遇到這些問題又該如何解決呢?下面小編就給大家介紹下一次用戶態進程死循環的問題該如何處理。
Linux下如何處理一次用戶態進程死循環問題
1、問題現象
業務進程(用戶態多線程程序)掛死,操作系統反應遲鈍,系統日誌沒有任何異常。從進程的內核態堆棧看,看似所有線程都卡在了內核態的如下堆棧流程中:
[root@vmc116 ~]# cat /proc/27007/task/11825/stack
[《ffffffff8100baf6》] retint_careful+0x14/0x32
[《ffffffffffffffff》] 0xffffffffffffffff
2、問題分析
1)內核堆棧分析
從內核堆棧看,所有進程都阻塞在 retint_careful上,這個是中斷返回過程中的流程,代碼(匯編)如下:
entry_64.S
代碼如下:
ret_from_intr:
DISABLE_INTERRUPTS(CLBR_NONE)
TRACE_IRQS_OFF
decl PER_CPU_VAR(irq_count)
/* Restore saved previous stack */
popq %rsi
CFI_DEF_CFA rsi,SS+8-RBP /* reg/off reset after def_cfa_expr */
leaq ARGOFFSET-RBP(%rsi), %rsp
CFI_DEF_CFA_REGISTER rsp
CFI_ADJUST_CFA_OFFSET RBP-ARGOFFSET
。。。
retint_careful:
CFI_RESTORE_STATE
bt $TIF_NEED_RESCHED,%edx
jnc retint_signal
TRACE_IRQS_ON
ENABLE_INTERRUPTS(CLBR_NONE)
pushq_cfi %rdi
SCHEDULE_USER
popq_cfi %rdi
GET_THREAD_INFO(%rcx)
DISABLE_INTERRUPTS(CLBR_NONE)
TRACE_IRQS_OFF
jmp retint_check
這其實是用戶態進程在用戶態被中斷打斷後,從中斷返回的流程,結合retint_careful+0x14/0x32,進行反匯編,可以確認阻塞的點其實就在
SCHEDULE_USER
這其實就是調用schele()進行調度,也就是說當進程走到中斷返回的流程中時,發現需要調度(設置了TIF_NEED_RESCHED),於是在這里發生了調度。
有一個疑問:為什麼在堆棧中看不到schele()這一級的棧幀呢?
因為這里是匯編直接調用的,沒有進行相關棧幀壓棧和上下文保存操作。
2)進行狀態信息分析
從top命令結果看,相關線程實際一直處於R狀態,CPU幾乎完全耗盡,而且絕大部分都消耗在用戶態:
[root@vmc116 ~]# top
top - 09:42:23 up 16 days, 2:21, 23 users, load average: 84.08, 84.30, 83.62
Tasks: 1037 total, 85 running, 952 sleeping, 0 stopped, 0 zombie
Cpu(s): 97.6%us, 2.2%sy, 0.2%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 32878852k total, 32315464k used, 563388k free, 374152k buffers
Swap: 35110904k total, 38644k used, 35072260k free, 28852536k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
27074 root 20 0 5316m 163m 14m R 10.2 0.5 321:06.17 z_itask_templat
27084 root 20 0 5316m 163m 14m R 10.2 0.5 296:23.37 z_itask_templat
27085 root 20 0 5316m 163m 14m R 10.2 0.5 337:57.26 z_itask_templat
27095 root 20 0 5316m 163m 14m R 10.2 0.5 327:31.93 z_itask_templat
27102 root 20 0 5316m 163m 14m R 10.2 0.5 306:49.44 z_itask_templat
27113 root 20 0 5316m 163m 14m R 10.2 0.5 310:47.41 z_itask_templat
25730 root 20 0 5316m 163m 14m R 10.2 0.5 283:03.37 z_itask_templat
30069 root 20 0 5316m 163m 14m R 10.2 0.5 283:49.67 z_itask_templat
13938 root 20 0 5316m 163m 14m R 10.2 0.5 261:24.46 z_itask_templat
16326 root 20 0 5316m 163m 14m R 10.2 0.5 150:24.53 z_itask_templat
6795 root 20 0 5316m 163m 14m R 10.2 0.5 100:26.77 z_itask_templat
27063 root 20 0 5316m 163m 14m R 9.9 0.5 337:18.77 z_itask_templat
27065 root 20 0 5316m 163m 14m R 9.9 0.5 314:24.17 z_itask_templat
27068 root 20 0 5316m 163m 14m R 9.9 0.5 336:32.78 z_itask_templat
27069 root 20 0 5316m 163m 14m R 9.9 0.5 338:55.08 z_itask_templat
27072 root 20 0 5316m 163m 14m R 9.9 0.5 306:46.08 z_itask_templat
27075 root 20 0 5316m 163m 14m R 9.9 0.5 316:49.51 z_itask_templat
。。。
3)進程調度信息
從相關線程的調度信息看:
[root@vmc116 ~]# cat /proc/27007/task/11825/schedstat
15681811525768 129628804592612 3557465
[root@vmc116 ~]# cat /proc/27007/task/11825/schedstat
15682016493013 129630684625241 3557509
[root@vmc116 ~]# cat /proc/27007/task/11825/schedstat
15682843570331 129638127548315 3557686
[root@vmc116 ~]# cat /proc/27007/task/11825/schedstat
15683323640217 129642447477861 3557793
[root@vmc116 ~]# cat /proc/27007/task/11825/schedstat
15683698477621 129645817640726 3557875
發現相關線程的調度統計一直在增加,說明相關線程一直是在被調度運行的,結合其狀態也一直是R,推測很可能在用戶態發生了死循環(或者非睡眠死鎖)。
這里又有問題:為什麼從top看每個線程的CPU佔用率只有10%左右,而不是通常看到的死循環進程導致的100%的佔用率?
因為線程數很多,而且優先順序都一樣,根據CFS調度演算法,會平均分配時間片,不會讓其中一個線程獨佔CPU。結果為多個線程間輪流調度,消耗掉了所有的cpu。。
另一個問題:為什麼這種情況下,內核沒有檢測到softlockup?
因為業務進程的優先順序不高,不會影響watchdog內核線程(最高優先順序的實時線程)的調度,所以不會產生softlockup的情況。
再一個問題:為什麼每次查看線程堆棧時,總是阻塞在retint_careful,而不是其它地方?
因為這里(中斷返回的時候)正是調度的時機點,在其它時間點不能發生調度(不考慮其它情況~),而我們查看線程堆棧的行為,也必須依賴於進程調度,所以我們每次查看堆棧時,正是查看堆棧的進程(cat命令)得到調度的時候,這時正是中斷返回的時候,所以正好看到的阻塞點為retint_careful。
4)用戶態分析
從上面的分析看,推測應該是用戶態發生了死鎖。
用戶態確認方法:
部署debug信息,然後gdb attach相關進程,確認堆棧,並結合代碼邏輯分析。
最終確認該問題確為用戶態進程中產生了死循環。
2. 嵌入式Linux設備驅動開發詳解的目錄
第1章嵌入式系統與驅動程序1
本章目標1
1.1嵌入式系統概述1
1.1.1嵌入式系統的概念1
1.1.2嵌入式系統的特點2
1.1.3嵌入式系統的體系結構2
1.2嵌入式處理器介紹4
1.2.1嵌入式處理器分類4
1.2.2ARM概述5
1.2.3ARM系列晶元簡介5
1.3嵌入式操作系統介紹7
1.3.1主流嵌入式操作系統7
1.3.2嵌入式系統的發展狀況8
1.3.3嵌入式Linux介紹8
1.3.4嵌入式系統開發環境的建立9
1.3.5嵌入式軟體開發10
1.4嵌入式Linux驅動程序12
1.4.1嵌入式Linux的內核空間和用戶空間12
1.4.2嵌入式Linux的文件系統12
1.4.3嵌入式Linux的設備管理14
1.4.4嵌入式Linux的驅動程序16
1.5知識索引20
1.6思考與練習21
第2章簡單的字元設備驅動程序23
本章目標23
2.1嵌入式Linux字元設備的驅動程序結構23
2.1.1嵌入式Linux驅動程序常用的頭文件24
2.1.2File_operations結構體24
2.1.3字元設備驅動程序的入口25
2.1.4驅動程序的設備注冊26
2.2設備驅動程序中的具體問題27
2.2.1I/O埠28
2.2.2內存操作29
2.2.3中斷處理29
2.3LED的驅動程序實例及測試30
2.3.1LED I/O埠設置30
2.3.2LED硬體電路設計32
2.3.3LED驅動程序設計33
2.3.4LED測試程序設計36
2.4嵌入式Linux中斷處理驅動程序及測試37
2.4.1中斷處理過程37
2.4.2中斷向量表39
2.4.3中斷的處理模式39
2.4.4中斷的優先順序40
2.4.5中斷的嵌套40
2.4.6中斷源的擴展40
2.4.7中斷控制寄存器的設置41
2.5按鍵中斷的驅動程序實例45
2.5.1按鍵中斷的電路設計45
2.5.2按鍵中斷的驅動程序設計45
2.6知識索引48
2.7思考與練習49
第3章數字顯示驅動程序50
本章目標50
3.1數字顯示器50
3.1.1數碼管簡介50
3.1.2數碼管的分類51
3.1.3數碼管顯示原理51
3.2數碼管顯示電路的硬體設計52
3.2.1解碼器的使用52
3.2.2數碼管的驅動方式53
3.2.3串/並變換的解碼設計55
3.3數碼管驅動程序實例56
3.3.1驅動程序的初始化和卸載模塊56
3.3.2文件操作結構模塊57
3.3.3數碼管的打開模塊57
3.3.4數碼管的讀寫模塊58
3.3.5數碼管的I/O控制模塊58
3.3.6數碼管的退出模塊58
3.3.7驅動程序的模塊載入和卸載59
3.4數碼管顯示電路測試程序設計60
3.4.1數碼管測試設計60
3.4.2數碼管測試程序60
3.4.3數碼管測試效果61
3.5知識索引61
3.6思考與練習62
第4章鍵盤驅動程序63
本章目標63
4.1鍵盤介面概述63
4.1.1鍵盤的分類63
4.1.2鍵盤的防抖65
4.1.3鍵盤的掃描65
4.1.4鍵盤的緩沖演算法67
4.2鍵盤的驅動設計實例67
4.2.1鎖存器和緩沖器擴展鍵盤67
4.2.2鎖存器和緩沖器的介面68
4.2.3鎖存器和緩沖器擴展鍵盤驅動程序設計69
4.2.4鎖存器和緩沖器擴展鍵盤測試程序設計71
4.3智能控制晶元HD7279擴展鍵盤72
4.3.1HD7279的電路設計72
4.3.2HD7279的指令介紹73
4.3.3HD7279的串列介面74
4.3.4HD7279的驅動程序設計75
4.3.5HD7279的測試程序設計84
4.4知識索引85
4.5思考與練習85
第5章A/D驅動程序86
本章目標86
5.1A/D轉換的過程86
5.1.1采樣和保持86
5.1.2量化和編碼88
5.1.3ADC的分類89
5.2A/D轉換器的基本原理89
5.2.1逐次逼近型A/D轉換器89
5.2.2雙積分型A/D轉換器90
5.2.3V/F和F/V型轉換器93
5.2.4其他A/D轉換器95
5.3A/D轉換器介面技術97
5.3.1ADC的主要參數及意義97
5.3.2ADC的電路選擇方法98
5.3.3ADC實際應用中的問題99
5.4S3C2410 A/D轉換驅動設計實例99
5.4.1S3C2410的A/D轉換電路99
5.4.2S3C2410X的A/D轉換控制寄存器100
5.4.3S3C2410X的A/D轉換數據寄存器101
5.4.4S3C2410X中A/D轉換驅動程序的設計102
5.4.5S3C2410X中A/D轉換測試程序的設計105
5.5知識索引106
5.6思考與練習107
第6章D/A驅動程序108
本章目標108
6.1D/A的原理介紹108
6.1.1D/A轉換的概念及基本原理108
6.1.2電子模擬開關109
6.1.3D/A轉換器的基本結構110
6.1.4D/A轉換的靜態參數114
6.1.5D/A轉換的動態參數115
6.2D/A轉換的硬體電路設計116
6.2.1D/A轉換的介面技術116
6.2.2D/A轉換晶元介紹117
6.2.3D/A轉換的電路設計118
6.3D/A轉換器的驅動程序實例118
6.3.1D/A驅動程序中的宏定義118
6.3.2D/A的模塊載入118
6.3.3D/A轉換器的文件操作模塊119
6.3.4D/A轉換器的讀寫控制模塊120
6.3.5D/A轉換器的打開、退出模塊120
6.4測試程序的設計120
6.4.1D/A測試程序中的宏定義121
6.4.2D/A測試程序的主函數121
6.4.3D/A測試程序中的功能函數122
6.4.4D/A測試程序中的功能列印函數123
6.4.5D/A測試程序中的波形生成函數123
6.4.6D/A測試程序的效果124
6.5知識索引125
6.6思考與練習125
第7章LCD驅動程序126
本章目標126
7.1LCD顯示器概述126
7.1.1液晶126
7.1.2LCD顯示屏的背光127
7.1.3LCD顯示器的分類127
7.1.4LCD的顯示原理127
7.1.5LCD的驅動方式130
7.1.6LCD的常用指標131
7.2LCD的顯示介面131
7.2.1灰度STN的時序132
7.2.2彩色STN的時序133
7.2.3TFT的時序134
7.3嵌入式處理器的LCD控制器136
7.3.1LCD控制器136
7.3.2LCD控制器的設置137
7.3.3LCD的字元顯示緩存139
7.4LCD的驅動程序設計140
7.4.1LCD驅動程序相關的宏定義140
7.4.2LCD驅動程序的底層操作函數142
7.4.3LCD驅動程序提供的API145
7.4.4LCD驅動程序的模塊化載入151
7.4.5LCD的測試程序152
7.5基於Framebuffer的LCD驅動程序實例155
7.5.1Framebuffer概述155
7.5.2LCD的電路連接155
7.5.3Framebuffer設備驅動程序的結構156
7.5.4Framebuffer設備驅動程序的設計159
7.5.5Framebuffer設備測試程序的設計164
7.5.6嵌入式Linux常用的GUI166
7.6知識索引166
7.7思考與練習167
第8章觸摸屏驅動程序168
本章目標168
8.1觸摸屏概述168
8.2觸摸屏的分類168
8.2.1電阻技術觸摸屏168
8.2.2表面聲波技術觸摸屏169
8.2.3電容電感技術觸摸屏170
8.2.4紅外線技術觸摸屏170
8.3觸摸屏的特性171
8.3.1透明度和色彩失真171
8.3.2反光性171
8.3.3清晰度171
8.3.4漂移172
8.3.5檢測和定位172
8.4觸摸屏的硬體電路設計172
8.4.1電阻式觸摸屏的電路原理172
8.4.2電阻式觸摸屏原點的定位173
8.4.3電阻式觸摸屏的電路連接174
8.5觸摸屏的驅動程序實例176
8.5.1觸摸屏介面的模式176
8.5.2A/D轉換和觸摸屏寄存器的設置177
8.5.3觸摸屏的坐標179
8.5.4觸摸屏的電路連接180
8.5.5觸摸屏的驅動程序介面181
8.6測試程序的設計182
8.6.1觸摸屏的數據定義183
8.6.2觸摸屏的數據處理183
8.6.3觸摸屏的運行測試185
8.7知識索引186
8.8思考與練習187
第9章CAN匯流排驅動程序188
本章目標188
9.1CAN匯流排介面設計188
9.1.1CAN匯流排概述188
9.1.2CAN的工作特點及主要優點189
9.1.3CAN匯流排的電氣特徵和MAC幀結構189
9.2嵌入式處理器上CAN匯流排介面的擴展190
9.2.1SJA1000簡介190
9.2.2SJA1000擴展191
9.3SJA1000擴展CAN匯流排介面的設計192
9.3.1CAN 控制器SJA1000的操作模式192
9.3.2CAN控制器SJA1000的特徵功能193
9.3.3CAN 控制器SJA1000的Basic CAN模式設置194
9.4SJA1000擴展CAN匯流排介面的通信196
9.4.1通過CAN匯流排建立通信的步驟196
9.4.2SJA1000的初始化196
9.4.3驅動程序的結構設計198
9.4.4驅動程序init、exit、open、close函數的實現200
9.4.5驅動程序read、write函數的實現201
9.4.6驅動程序interrupt、ioctl函數實現202
9.4.7測試程序的編寫202
9.5驅動程序的載入204
9.6知識索引204
9.7思考與練習205
第10章IIC匯流排驅動程序206
本章目標206
10.1IIC匯流排概述206
10.1.1IIC匯流排介紹206
10.1.2IIC匯流排引入的原因206
10.1.3IIC匯流排的特點206
10.1.4IIC匯流排的基本結構207
10.1.5IIC匯流排的術語207
10.1.6IIC匯流排的工作208
10.1.7IIC匯流排的競爭仲裁209
10.1.8IIC匯流排的工作流程210
10.2嵌入式處理器的IIC介面211
10.2.1IIC匯流排控制寄存器212
10.2.2IIC匯流排控制/狀態寄存器213
10.2.3IIC匯流排地址寄存器214
10.2.4IIC匯流排移位數據寄存器214
10.2.5S3C2410中與IIC對應的I/O埠215
10.3基於IIC的鍵盤晶元應用216
10.3.1ZLG7290的功能217
10.3.2ZLG7290的控制方式218
10.3.3ZLG7290的寄存器218
10.3.4ZLG7290的通信介面219
10.3.5ZLG7290的指令介紹219
10.4IIC匯流排驅動程序實例221
10.4.1ZLG7290的電路連接221
10.4.2ZLG7290的通信流程223
10.4.3ZLG7290驅動中變數的定義225
10.4.4ZLG7290驅動中實時時鍾的改變226
10.4.5ZLG7290和IIC寄存器的初始化227
10.4.6ZLG7290驅動程序的模塊化228
10.4.7ZLG7290的文件操作結構228
10.5IIC匯流排的測試程序230
10.6知識索引231
10.7思考與練習231
第11章音頻匯流排驅動程序232
本章目標232
11.1音頻匯流排介面概述232
11.1.1音頻的采樣精度233
11.1.2音頻編碼233
11.2IIS音頻匯流排介面233
11.2.1IIS匯流排的物理連接233
11.2.2IIS的匯流排協議234
11.2.3IIS匯流排的硬體設計235
11.2.4IIS匯流排的寄存器236
11.3AC97音頻匯流排介面239
11.4IIS匯流排的驅動程序設計240
11.4.1音頻設備基礎知識240
11.4.2音頻設備文件241
11.4.3WAV聲音文件243
11.4.4音頻設備和驅動程序的通信243
11.4.5設備的初始化和載入244
11.4.6DMA的操作和宏定義246
11.4.7audio設備文件的操作248
11.4.8mixer設備文件的操作260
11.5音頻驅動程序的測試262
11.6知識索引262
11.7思考與練習263
第12章IDE介面驅動程序264
本章目標264
12.1IDE介面概述264
12.1.1硬碟知識介紹264
12.1.2IDE介面標准267
12.1.3IDE介面的傳輸模式269
12.1.4IDE介面寄存器269
12.2IDE介面驅動程序的移植271
12.2.1嵌入式Linux下IDE驅動程序介面271
12.2.2嵌入式Linux下IDE驅動程序272
12.2.3IDE硬碟的讀/寫操作274
12.3IDE驅動程序測試282
12.3.1磁碟文件系統簡介283
12.3.2IDE分區測試283
12.4知識索引285
12.5思考與練習285
第13章快閃記憶體晶元的驅動程序286
本章目標286
13.1快閃記憶體晶元概述286
13.1.1快閃記憶體晶元的物理特性286
13.1.2嵌入式文件系統概述289
13.1.3MTD體系介紹289
13.1.4Flash專有名詞291
13.2NAND Flash291
13.2.1NAND Flash的結構291
13.2.2NAND Flash的操作292
13.2.3NAND Flash控制器294
13.2.4NAND Flash的時序296
13.2.5NAND Flash的驅動程序實例297
13.3NOR Flash301
13.3.1NOR Flash的結構301
13.3.2NOR Flash的操作302
13.3.3NOR Flash的驅動程序實例303
13.4基於快閃記憶體的文件系統307
13.5知識索引309
13.6思考與練習310
第14章USB 設備驅動程序311
本章目標311
14.1USB介面概述311
14.1.1USB系統311
14.1.2USB的電氣特性312
14.1.3USB匯流排的拓撲結構313
14.1.4USB的通信協議313
14.2嵌入式系統中USB的使用315
14.2.1OHCI概述315
14.2.2Host介面硬體設計316
14.3嵌入式系統中USB設備的驅動程序設計316
14.3.1
3. linux命令主要有哪幾種
文件管理命令
cat chattr chgrp chmod chown cksum cmp
diff diffstat file find git gitview indent
cut ln less locate isattr mattrib mc
mdel mdir mktemp more mmove mread mren
mtools mtoolstest mv od paste patch rcp
rm slocate split tee tmpwatch touch umask
which cp in m mshowfat rhmask whereis
目錄磁碟管理命令
cd df dirs edquota eject
mcd mdeltree m mkdir mlabel mmd
mrd mzip pwd quota mount mmount
rmdir rmt stat tree umount ls
quotacheck quotaoff lndir repquota quotaon
文檔編輯命令
col colrm comm csplit ed egrep ex fgrep
fmt fold grep ispell jed joe join look
mtype pico rgrep sed sort spell tr expr
uniq wc
文件傳輸列印命令
lprm lpr lpq lpd bye ftp
uuto uupick uucp uucico tftp ncftp
ftpshut ftpwho ftpcount
磁碟維護命令
badblocks cfdisk dd e2fsck ext2ed
fsck fsck fsconf fdformat hdparm
mformat mkbootdisk mkdosfs mke2fs mkfs.ext2
mkfs.msdos mkinitrd mkisofts mkswap mpartition
swapon symlinks sync mbadblocks mkfs
fsck.ext2 fdisk losetup mkfs sfdisk
swapoff
網路通信命令
apachectl arpwatch dip getty mingetty uux
telnet uulog uustat ppp-off netconfig nc
httpd ifconfig minicom mesg dnsconf wall
netstat ping pppstats samba setserial talk
traceroute tty newaliases uuname netconf write
statserial efax pppsetup tcpmp ytalk cu
smbd testparm smbd smbclient shapecfg
系統管理命令
adser chfn useradd date exit finger
fwhois sleep suspend groupdel groupmod halt
kill last lastb login logname logout
ps nice procinfo top pstree reboot
rlogin rsh sliplogin screen shutdown rwho
sudo gitps swatch tload logrotate kill
uname chsh userconf userdel usermod vlock
who whoami whois newgrp renice su
skill w id free
系統設置命令
reset clear alias dircolors aumix bind
chroot clock crontab declare depmod dmesg
enable eval export pwunconv grpconv rpm
insmod kbdconfig lilo liloconfig lsmod minfo
set modprobe ntsysv moouseconfig passwd pwconv
rdate resize rmmod grpunconv modinfo time
setup sndconfig setenv setconsole timeconfig ulimit
unset chkconfig apmd hwclock mkkickstart fbset
unalias SVGAText Mode
備份壓縮命令
ar bunzip2 bzip2 bzip2recover gunzip unarj
compress cpio mp uuencode gzexe gzip
lha restore tar uudecode unzip zip
zipinfo
設備管理命令
setleds loadkeys rdev mpkeys MAKEDEV
4. linux的telnet命令使用方法詳解
linux下telnet命令主要是提供用戶遠程登錄,下面由我為大家整理了linux的telnet命令使用方法詳解的相關知識,希望對大家有幫助!
linux的telnet命令使用方法詳解
語法
telnet [-8acdEfFKLrx][-b<主機別名>][-e<脫離字元>][-k<域名>][-l<用戶名稱>][-n<記錄文件>][-S<服務類型>][-X<認證形態>][主機名稱或IP地址<通信埠>]
參數
-8 允許使用8位字元資料,包括輸入與輸出 -a 嘗試自動登入遠端系統 -b<主機別名> 使用別名指定遠端主機名稱 -c 不讀取用戶專屬目錄里的.telnetrc文件 -d 啟動排錯模式 -e<脫離字元> 設置脫離字元 -E 濾除脫離字元 -F 使用Kerberos V5認證時,加上此參數可把本地主機的認證數據上傳到遠端主機 -f 此參數的效果和”-F”參數相同 -k<域名> 使用Kerberos認證時,加上此參數讓遠端主機採用指定的領域名,而非該主機的域名 -K 不自動登入遠端主機 -l<用戶名稱> 指定要登入遠端主機的用戶名稱 -L 允許輸出8位字元資料 -n<記錄文件> 指定文件記錄相關信息 -r 使用類似rlogin指令的用戶界面 -S<服務類型> 設置telnet連線所需IP TOS信息 -x 假設主機有支持數據加密的功能,就使用它 -X<認證形態> 關閉指定的認證形態
linux的telnet命令使用示例
示例1:遠程伺服器無法訪問
[root@linuxprobe ~]# telnet 192.168.120.209 Trying 192.168.120.209... telnet: connect to address 192.168.120.209: No route to host telnet: Unable to connect to remote host: No route to host
處理這種情況方法:
(1)確認IP地址是否正確
(2)確認IP地址對應的裝機是否已經開機
(3)如果主機已經啟動,確認路由設置是否設置正確(使用route命令查看)
(4)如果主機已經啟動,確認主機上是否開啟了telnet服務(使用netstat命令查看,TCP的23埠是否有LISTEN狀態行)
(5)如果主機已經啟動telnet服務,確認防火牆是否開放了23埠的訪問(使用iptables-save查看)
示例2:域名無法解析
[root@linuxprobe ~]# telnet www..com www..com/telnet: Temporary failure in name resolution
處理這種情況方法:
(1)確認域名是否正確
(2)確認本機的域名解析有關的設置是否正確(/etc/resolv.conf中nameserver的配置是否正確,如果沒有,可以使用nameserver 8.8.8.8)
(3)確認防火牆是否放開了UDP53埠的訪問(DNS使用UDP協議,埠53,使用iptables-save查看)
示例3:拒絕訪問
[root@linuxprobe ~]# telnet 192.168.120.206 Trying 192.168.120.206... telnet: connect to address 192.168.120.206: Connection refused telnet: Unable to connect to remote host: Connection refused
處理這種情況方法:
(1)確認IP地址或者主機名是否正確
(2)確認埠是否正確,是否默認23埠
若要檢查192.168.120.206的某埠是否能否能訪問,如443埠,可使用如下命令
[root@linuxprobe ~]# telnet 192.168.120.206 443 Trying 192.168.120.206... telnet: connect to address 192.168.120.206: Connection refused
說明:這表示192.168.120.206的443埠不能訪問
示例4:telnet root用戶的登入
[root@linuxprobe ~]# telnet 192.168.120.204 Trying 192.168.120.204... Connected to 192.168.120.204 (192.168.120.204). Escape character is '^]'. localhost (Linux release 2.6.18-274.18.1.el5 #1 SMP Thu Feb 9 12:45:44 EST 2012) (1) login: root Password: Login incorrect
說明:一般情況下不允許root從遠程登錄,可以先用普通賬號登錄,然後再su -切到root用戶。若要允許root用戶登入,可用下列方法:
[root@linuxprobe ~]# vi /etc/pam.d/login #auth required pam_securetty.so #將這一行加上注釋! 或 [root@linuxprobe ~]# mv /etc/securetty /etc/securetty.bak
示例5:啟用telnet服務
[root@linuxprobe ~]# cd /etc/xinetd.d/ [root@linuxprobe xinetd.d]# ll 總計 124 -rw-r--r-- 1 root root 1157 2011-05-31 chargen-dgram -rw-r--r-- 1 root root 1159 2011-05-31 chargen-stream -rw-r--r-- 1 root root 523 2009-09-04 cvs -rw-r--r-- 1 root root 1157 2011-05-31 daytime-dgram -rw-r--r-- 1 root root 1159 2011-05-31 daytime-stream -rw-r--r-- 1 root root 1157 2011-05-31 discard-dgram -rw-r--r-- 1 root root 1159 2011-05-31 discard-stream -rw-r--r-- 1 root root 1148 2011-05-31 echo-dgram -rw-r--r-- 1 root root 1150 2011-05-31 echo-stream -rw-r--r-- 1 root root 323 2004-09-09 eklogin -rw-r--r-- 1 root root 347 2005-09-06 ekrb5-telnet -rw-r--r-- 1 root root 326 2004-09-09 gssftp -rw-r--r-- 1 root root 310 2004-09-09 klogin -rw-r--r-- 1 root root 323 2004-09-09 krb5-telnet -rw-r--r-- 1 root root 308 2004-09-09 kshell -rw-r--r-- 1 root root 317 2004-09-09 rsync -rw-r--r-- 1 root root 1212 2011-05-31 tcpmux-server -rw-r--r-- 1 root root 1149 2011-05-31 time-dgram -rw-r--r-- 1 root root 1150 2011-05-31 time-stream [root@linuxprobe xinetd.d]# cat krb5-telnet # default: off # description: The kerberized telnet server accepts normal telnet sessions, # but can also use Kerberos 5 authentication. service telnet { flags = REUSE socket_type = stream wait = no user = root server = /usr/kerberos/sbin/telnetd log_on_failure += USERID disable = yes }
配置參數通常如下:
service telnet
{
disable = no #啟用
flags = REUSE #socket可重用
socket_type = stream #連接方式為TCP
wait = no #為每個請求啟動一個進程
user = root #啟動服務的用戶為root
server = /usr/sbin/in.telnetd #要激活的進程
log_on_failure += USERID #登錄失敗時記錄登錄用戶名
}
如果要配置允許登錄的客戶端列表,加入
only_from = 192.168.0.2 #只允許192.168.0.2登錄
如果要配置禁止登錄的客戶端列表,加入
no_access = 192.168.0.{2,3,4} #禁止192.168.0.2、192.168.0.3、192.168.0.4登錄
如果要設置開放時段,加入
access_times = 9:00-12:00 13:00-17:00 # 每天只有這兩個時段開放服務(我們的上班時間:P)
如果你有兩個IP地址,一個是私網的IP地址如192.168.0.2,一個是公網的IP地址如218.75.74.83,如果你希望用戶只能從私網來登錄telnet服務,那麼加入
bind = 192.168.0.2
各配置項具體的含義和語法可參考xined配置文件屬性說明(man xinetd.conf)
配置埠,修改services文件:
# vi /etc/services
找到以下兩句
telnet 23/tcp
telnet 23/udp
如 果前面有#字元,就去掉它。telnet的默認埠是23,這個埠也是黑客埠掃描的主要對象,因此最好將這個埠修改掉,修改的方法很簡單,就是將 23這個數字修改掉,改成大一點的數字,比如61123。注意,1024以下的埠號是internet保留的埠號,因此最好不要用,還應該注意不要與 其它服務的埠沖突。
啟動服務:service xinetd restart