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的各种参数来最终确定用户是使用的哪种方式登陆。

以上回答希望能够帮助到你,欢迎大家评论留言。


分享到:


相關文章: