日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux一切皆文件之tty字符设备(深入理解sshd创建pty的过程) (五)

發(fā)布時間:2025/4/16 linux 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux一切皆文件之tty字符设备(深入理解sshd创建pty的过程) (五) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、知識準(zhǔn)備

1、在linux中,一切皆為文件,所有不同種類的類型都被抽象成文件(比如:塊設(shè)備,socket套接字,pipe隊列)
2、操作這些不同的類型就像操作文件一樣,比如增刪改查等
3、塊設(shè)備支持隨機(jī)訪問,而字符設(shè)備只能依據(jù)先后順序來讀取數(shù)據(jù)。最典型的字符設(shè)備就是tty


二、環(huán)境準(zhǔn)備

組件版本
OSCentOS Linux release 7.5.1804


三、什么是tty?

根據(jù)史料記載:

An ASR33 Teletype - origin of the abbreviation tty.

tty來源一種電傳打印機(jī)(teletype),就像這樣:

● 敲擊鍵盤輸入不同的字符,然后由打印機(jī)將字符打印在紙上
● 歷史不斷在往前發(fā)展,出現(xiàn)了計算機(jī)之后,計算機(jī)模擬了teletype的模式:通過外部終端輸入,將輸入的字符打印在屏幕上
● 在teletype與計算機(jī)之間用串口相連,并且在計算機(jī)上通過信號轉(zhuǎn)換(模擬信號轉(zhuǎn)換為數(shù)字信號),讓計算機(jī)能夠識別,從而操作計算機(jī)
● 由于計算機(jī)廠商眾多,每個廠商都有自己風(fēng)格的輸入設(shè)備,所以計算機(jī)為了兼容這些設(shè)備,開發(fā)了內(nèi)核tty模塊

+-----------------+| | +--------+ | +-------------+ | |teletype|-----------------> |serial | | +--------+ | |communication| || +-----+-------+ || | || v || +----------+ | +----------+| |tty driver| |------->| display || +----------+ | +----------+| ||computer |+-----------------+

四、tty設(shè)備文件

登陸到操作系統(tǒng)(不使用SSH協(xié)議,而使用控制臺直接登陸),首先查看當(dāng)前進(jìn)程號所使用的tty

[root@localhost ~]# tty /dev/tty1 [root@localhost ~]# ls -l /dev/tty1 crw--w---- 1 root tty 4, 1 Nov 20 23:24 /dev/tty1

當(dāng)前所使用的是/dev/tty1,并且tty1也分配了主設(shè)備號與次設(shè)備號(關(guān)于主設(shè)備號與次設(shè)備號,請看之前的文章:塊設(shè)備文件)

查看進(jìn)程打開的描述符

[root@localhost ~]# echo $$ 5598 [root@localhost ~]# ls -l /proc/5598/fd total 0 lrwx------ 1 root root 64 Nov 19 22:23 0 -> /dev/tty1 lrwx------ 1 root root 64 Nov 19 22:23 1 -> /dev/tty1 lrwx------ 1 root root 64 Nov 19 22:23 2 -> /dev/tty1 lrwx------ 1 root root 64 Nov 19 22:23 255 -> /dev/tty1

進(jìn)程打開了4個文件描述符,這四個文件描述符都是/dev/tty1,他們的作用分別是:
0:標(biāo)準(zhǔn)輸入
1:標(biāo)準(zhǔn)輸出
2:標(biāo)準(zhǔn)錯誤
255:這個比較特殊,主要用于當(dāng)tty重置的時候?qū)?,1,2的一份復(fù)制(個人觀點(diǎn)是對tty之前的歷史信息作為一份復(fù)制)

更多的信息,請拜讀大神的書《Shell Scripting: Expert Recipes for Linux, Bash, and more》,這里是鏈接(大概在267頁):
https://doc.lagout.org/operating%20system%20/linux/Commands%20and%20Shell%20Programming/Shell%20Scripting.pdf


五、ssh登陸之后的tty

剛才介紹的都是操作系統(tǒng)提供的控制臺登陸之后的情況,如果用ssh服務(wù)登陸之后會產(chǎn)生什么情況呢?

首先介紹一個非常重要的概念,偽終端pty:
● pty是一對虛擬的字符設(shè)備,提供雙向通信。pty一般由master與slave組成
● pty的出現(xiàn)是為了滿足現(xiàn)在的登陸需求:網(wǎng)絡(luò)登陸(ssh登陸、telnet登陸等)、Xwindow等
● 歷史上有兩套接口標(biāo)準(zhǔn):分別是BSD與unix98,當(dāng)前大多數(shù)pts都是基于unix98標(biāo)準(zhǔn)來實(shí)現(xiàn)的
● unix98的工作流程:
(1)進(jìn)程對/dev/ptmx調(diào)用open(),返回pseudoterminal master(PTM)的文件描述符,并且在/dev/pts下創(chuàng)建pseudoterminal slave(PTS): /dev/pts/0
(2)調(diào)用grantpt()修改PTS的文件權(quán)限;調(diào)用unlockpt()對PTS解鎖;最后調(diào)用slavename()得到PTS文件名字
(3)此時,PTM與PTS都已經(jīng)正常打開,并且建立一條通道,兩端分別連接PTM與PTS
(4)進(jìn)程對PTM寫的數(shù)據(jù)可以從PTS讀出來,反之亦然


下面重點(diǎn)介紹一下基于unix98實(shí)現(xiàn)的sshd pty(主要分為登陸階段和執(zhí)行命令階段):

登陸:

(1)當(dāng)進(jìn)程ssh client請求與sshd建立登陸連接的時候,經(jīng)過TCP握手以及tls握手之后,確認(rèn)是一個合法的請求,sshd會fork()一個子進(jìn)程出來專門服務(wù)于這條連接

[root@localhost ~]# ps -ef | grep sshd root 894 1 0 Nov25 ? 00:00:00 /usr/sbin/sshd -D root 3126 894 0 Nov25 ? 00:00:00 sshd: root@pts/0

(2)子進(jìn)程3126對/dev/ptmx調(diào)用open(),得到PTM的文件描述符以及PTS的文件名

#這里使用strace跟蹤sshd主進(jìn)程和它創(chuàng)建的子進(jìn)程,然后打開另外一個shell登陸服務(wù)器 [root@localhost ~]# strace -p 894 -ff -o sshd strace: Process 894 attached strace: Process 3126 attached strace: Process 3127 attached strace: Process 3128 attached strace: Process 3129 attached strace: Process 3130 attached strace: Process 3131 attached strace: Process 3132 attached strace: Process 3133 attached strace: Process 3134 attached strace: Process 3135 attached strace: Process 3136 attached strace: Process 3137 attached strace: Process 3138 attached strace: Process 3139 attached strace: Process 3140 attached [root@localhost ~]# grep ptmx ./sshd.* ./sshd.3126:open("/dev/ptmx", O_RDWR) = 8

sshd894創(chuàng)建了一個子進(jìn)程3126用來處理這條TCP連接。進(jìn)程對/dev/ptmx調(diào)用open(),得到PTM的文件描述符8

(2)子進(jìn)程3126在/dev/pts下創(chuàng)建了一個字符設(shè)備文件/dev/pts/0,8與/dev/pts/0成為一對master/slave
(3)子進(jìn)程3126會再fork()一個子進(jìn)程3128,子進(jìn)程3128打開/dev/pts/0 3個描述符(標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯誤),并且執(zhí)行操作系統(tǒng)默認(rèn)的shell(本文中bash)

[root@localhost ~]# ps -ef | grep 3126 root 3126 894 0 03:16 ? 00:00:00 sshd: root@pts/0 root 3128 3126 0 03:16 pts/3 00:00:00 -bash [root@localhost ~]# ls -l /proc/3128/fd total 0 lrwx------ 1 root root 64 Nov 26 03:16 0 -> /dev/pts/0 lrwx------ 1 root root 64 Nov 26 03:16 1 -> /dev/pts/0 lrwx------ 1 root root 64 Nov 26 03:16 2 -> /dev/pts/0 lrwx------ 1 root root 64 Nov 26 03:22 255 -> /dev/pts/0

至此,通信流程大概是這樣:

+----------------+ +------------+ | | | ssh client +---------->| sshd | +----+-------+ | || +--------+-------+| || || fork()| || || v| +----+-----+ fork() +----------+ +-----++---------------------->|pid: 3126 |-------------->|pid: 3128 |----->|bash |+-+--------+ +----------+ +-----+| ^| |+-------+ |+------|--------------------------------+ || | +-----------+ | || v | | | || +---------+ fd=8 +-----------+ | || |/dev/ptmx|---------->|/dev/pts/0 |--------+| +---------+ +-----------+ || | | || +-----------+ |+---------------------------------------+

執(zhí)行命令:

(4)當(dāng)ssh client發(fā)出一個ls命令,通過TCP連接來到3126,3126將ls寫入PTM文件描述符8
(5)/dev/ptmx查詢到關(guān)聯(lián)記錄 PTM:8對應(yīng)PTS:/dev/pts/0,把ls轉(zhuǎn)發(fā)到/dev/pts/0當(dāng)中
(6)3128從0 -> /dev/pts/0中讀取之后執(zhí)行l(wèi)s
(7)ls返回結(jié)果之后寫入1 -> /dev/pts/0,然后根據(jù)關(guān)聯(lián)記錄回寫到/dev/ptmx
(8)3126從/dev/ptmx讀取之后返回到ssh client


六、參考資料

http://man7.org/linux/man-pages/man7/pty.7.html
http://man7.org/linux/man-pages/man4/pts.4.html
http://osr600doc.sco.com/en/SDK_sysprog/_Pseudo-tty_Drivers_em_ptm_and_p.html
https://unix.stackexchange.com/questions/79334/how-does-a-linux-terminal-work



至此,本文結(jié)束
在下才疏學(xué)淺,有撒湯漏水的,請各位不吝賜教...

轉(zhuǎn)載于:https://www.cnblogs.com/MrVolleyball/p/10024540.html

總結(jié)

以上是生活随笔為你收集整理的linux一切皆文件之tty字符设备(深入理解sshd创建pty的过程) (五)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。