前言:
ttysnoops是一個監視文字console的一個小工具,如果在embedded system開發環境,通常是使用com port或是使用telnet ssh之類的方法去做溝通。但是如果你的機器並不在你身邊,你卻想要知道你寫的程式過得怎樣,一個人在遠方是否有什麼異狀,想要知道它輸出的訊息?
這時該怎麼辦? 這時就會需要用到ttysnoops了。
ttysnoops是一個監視文字console的一個小工具,如果在embedded system開發環境,通常是使用com port或是使用telnet ssh之類的方法去做溝通。但是如果你的機器並不在你身邊,你卻想要知道你寫的程式過得怎樣,一個人在遠方是否有什麼異狀,想要知道它輸出的訊息?
這時該怎麼辦? 這時就會需要用到ttysnoops了。
原理:
ttysnoops 需要在執行login之前先被執行。ttysnoops執行時,如同ssh一樣,會先開一對/dev/ptm、/dev/pts/x。
然後會用execv來執行login,並且使用dup2來轉移login的stdio到/dev/pts/x上面,如此一來ttysnoops就可以利用對應的/dev/ptm來做存取。
解析source code:
ttysnoops會先開啟一個/dev/ptm,kernel會自動生出一個/dev/pts/0出來,find_ptyxx中,ttyfd可能是/dev/pts/0,dup2將ttyfd複製給stdio。 如此一來,這個行程(ttysnoops的子行程)的所作所為就會反映到/dev/pts/0,而不會在stdio上,又/dev/pts/0對映到/dev/ptm,因此ttysnoop可以讀寫/dev/ptm來達成與(ttysnoops的子行程)溝通。所以ttysnoops稍後會有一個處裡,也就是查看ptyfd(/dev/ptm)若有資料,會寫到ttysnoops的stdio,來讓使用者以為一切都很正常。
因此稍後執行login以後,它所顯示的東西會寫到/dev/pts/0上面,而不會顯示在stdio上,又因為父行程(ttysnoops)繼續執行去監視ptyfd(/dev/ptm),就會感覺是直接跟login直接溝通,但其實資料流已經透過ttysnoops攔截下來了。如果有一個client連進來後,ttysnoops又會fork出一個子行程,然後它會開啟一個/var/spool/ttysnoops/0這個named socket,然後再一次使用dup2將stdio導向到這個socket,如此一來,login的所作所為就有兩個行程會知道了,ttysnoopys以及連進來監視的client。
使用情境:
1. 當執行login以後,login會輸出login:的字樣,提示輸入帳號
2. 此時login只會寫到ptyfd上面,因此ttysnoop會將這個字串讀出並寫入自己的stdout
3. 這時候本機上就顯示login:了
4. 如果本機上打字進去,會由ttysnoop先收到,收到以後就寫給ptyfd,然後login就會去做後續工作....
5. 這時,有client登入了,登入以後,如果ttysnoops從ptyfd讀出東西,就會輸出給他自己的stdout,當然就也會輸出給authfd
5. 這時,有client登入了,登入以後,如果ttysnoops從ptyfd讀出東西,就會輸出給他自己的stdout,當然就也會輸出給authfd
6. 若是client打字進來,authfd收到以後,因為他對應到ttysnoops的stdio,所以ttysnoops也會從他的stdin收到字串,收到以後就會使用write寫給pthfd
下載連結:



