linux如何判斷是通過ssh登陸還是sftp登陸?

曹佳鵬


回答行業問題

sftp是一個安全文件傳輸協議,它的文件傳輸是經過加密的。sftp本身沒有守護進程,它是在包含在ssh協議中的,使用的端口號也是22。所以它必須使用ssh的守護進程來完成連接和答覆操作。

那判斷用戶是通過ssh登陸還是sftp登陸的?其實很簡單,只要我們搞清楚pts、notty這兩種連接方式的意思,就可以很容易的判斷用戶是通過如ssh或者sftp那種方式連接的。

可通過查看進程是否包含pts、notty字符串來判斷,pts對應的ssh連接,notty是sftp連接,如下圖很清晰的能夠判斷是用戶是通過ssh或sftp登陸的,後面我簡單說下操作過程。

查看ssh登陸pts(虛擬終端)

pts其實可以稱為虛擬終端,在ssh登陸成功後會有一個和用戶對應的pts終端,比如pts/0、pts1等,可以使用who命令查看都有哪些用戶登陸。

#who

從圖中可以看出當前有三個用戶使用pts終端(個人隱私馬賽克),同時可看到連接的IP地址,這裡使用who命令就很簡單的判斷哪個用戶是使用ssh連接,同一個用戶可有多個登陸終端。

查看sftp登陸

最開始時已經說過,sftp登陸只是藉助ssh協議來完成tcp握手連接,並沒有真正的打開linux的pty終端,而是在ssh建立連接後,又啟動了一個子程“/usr/libexec/openssh/sftp-server”,簡單的判斷可以直接用ps查看進程grep過濾,就能看到是否有sftp連接。

[root@api ~]#ps -ef|grep '[/]usr/libexec/openssh/sftp-server'

從上圖可看到test用戶建立了sftp連接,它的父進程PID是30101,我們看下更多的進程信息,從圖中可以看出sftp進程的對應關係,sftp->test@notty->test用戶->sshd服務,依次往上最終連接的sshd服務上,sftp的登陸方式已經很清晰了。

[root@api ~]#ps -e -o uid,pid,ppid,cmd

總結,ssh使用的是pts虛擬終端登陸,而sftp使用的是notty登陸,可用通過ps的各種參數來最終確定用戶是使用的哪種方式登陸。

以上回答希望能夠幫助到你,歡迎大家評論留言。


分享到:


相關文章: