我想收回这个问题这邮政。
当用户在一个偏僻的客户端挂载目录当地的服务器在他的文件系统上通过sshfs
,他在服务器中不可见通过who
或last
。链接的问题中提出了以下服务器的解决方法:
ps aux | grep -i sftp | grep -v grep
但它提供的信息并不多:只有用户名和 sftp 连接的存在。正如在对所选答案的评论中一样,我想问(关于服务器):
1)是否有更紧凑、专用的命令?
2)有没有办法获得更多信息?我想知道(从服务器):执行操作的用户名和远程客户端的主机名或IP地址,服务器的安装目录以及安装开始的时间。
假设服务器运行的是 Ubuntu 14.04,但如果这些命令在所有 *nix 系统中都可用,那就太好了。
答案1
服务器端无法区分客户端通过 SSHFS 访问的 SFTP 会话和客户端通过其他客户端软件访问的 SFTP 会话。但您绝对可以获得有关 SFTP 会话的更多信息。
每个 SFTP 会话都有一个关联的sftp-server
进程。在 Linux 上,您可以sftp-server
使用pgrep -x sftp-server
或列出正在运行的进程 ID ps -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
或返回的值sysconf(_SC_CLK_TCK)
),除了在较旧的(<2.6)内核上,它以 jiffies 为单位(其值更难找到)可靠地输出);启动时间是自启动以来以秒为单位表示的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 客户端仅发送有关它想要访问的每个文件的信息。
我不知道有任何程序可以为您收集所有这些数据,但我不经常做这种事情,所以很可能有一个我不知道的程序。
答案2
~ % mount -l -t fuse.sshfs
i@somewhere:/mnt/x on /mnt/x type fuse.sshfs (ro,nosuid,nodev,relatime,user_id=1000,group_id=100)
~ % mount --version
mount from util-linux 2.36.2 (libmount 2.36.2: btrfs, namespaces, assert, debug)
也许mount -l -t fuse.sshfs
正是您所需要的。