檢測本地機器上的遠端 sshfs 掛載
我想回到這篇文章的問題。
當遠端客戶端中的使用者通過 將本地伺服器上的目錄掛載到其文件系統上時,通過或
sshfs
在伺服器中看不到他。連結問題中提出了以下伺服器解決方法:who``last
ps aux | grep -i sftp | grep -v grep
但它提供的資訊不多:只是使用者名和 sftp 連接的存在。在對所選答案的評論中,我想問一下(關於伺服器):
1)是否有更緊湊、更專用的命令?
2)有沒有辦法獲得更多資訊?我想知道(來自伺服器):執行操作的使用者名和遠端客戶端的主機名或 IP 地址,伺服器的掛載目錄以及掛載開始的時間。
假設伺服器執行的是 Ubuntu 14.04,但如果這些命令在所有 *nix 系統中都可用,那就太好了。
無法從伺服器端區分客戶端通過 SSHFS 訪問的 SFTP 會話和客戶端通過某些其他客戶端軟體訪問的 SFTP 會話。但是您絕對可以獲得有關 SFTP 會話的更多資訊。
每個 SFTP 會話都有一個關聯的
sftp-server
程序。在 Linux 上,您可以列出sftp-server
使用pgrep -x sftp-server
或執行的程序 IDps -C sftp-server
。或者,您可以使用以下符合 POSIX 的命令(sftp-server
如有必要,調整路徑):ps -e -o pid,cmd | sed -n 's!^\([0-9]*\) /usr/lib/openssh/sftp-server$!\1!p'
該程序在用於登錄 SFTP 的使用者帳戶下執行。它是在 SFTP 會話開始時啟動的。
ps -e -o pid,user,etime,cmd | awk '$4 == "/usr/lib/openssh/sftp-server" {print "pid=" $1, "user=" $2, $3 " ago"}'
開始時間顯示在 POSIX 中很麻煩:您會得到自程序開始以來經過的時間,而不是日期。大多數係統都有更方便的東西。在 Linux 上,還有一些可用的格式,但它們都不是很方便。日期來自 的第 22 欄位
/proc/$pid/stat
,但它也很麻煩:它是以時鐘滴答為單位的開始日期(除以getconf CLK_TCK
or返回的值sysconf(_SC_CLK_TCK)
),但在較舊的 (<2.6) 核心中除外(其值更難找到)可靠地輸出);啟動時間是自紀元以來以秒錶示的btime
行上的值(您可能希望將其轉換為人類可讀的格式)。/proc/stat
cat /proc/$pid/stat | awk ' BEGIN { "getconf CLK_TCK" | getline ticks; while (!btime) { getline <"/proc/stat"; if ($1 == "btime") btime = $2; } } { print "pid=" $1, "start_time=" int($22 / ticks + btime) }'
SSH_CLIENT
您可以通過查看該程序環境中的變數來找出客戶端的 IP 地址和埠。大多數 Unix 變體都有辦法做到這一點,但它還沒有被 POSIX 標準化。在 Linux 上,您可以使用</proc/$pid/environ grep -z '^SSH_CLIENT='
我認為您無法找出掛載的目錄是什麼。SSHFS 客戶端只發送有關它想要訪問的每個文件的資訊。
我不知道有任何程序會為您收集所有這些數據,但我做的這類事情不多,所以很可能有一個我不知道。