如何获取通过 sshfs 挂载的远程目录的信息?

如何获取通过 sshfs 挂载的远程目录的信息?

如果我使用本地计算机上的远程服务器挂载目录sshfs,我如何才能找到以下详细信息:

  • 当前是否安装了任何此类安装座;
  • 安装它的用户;
  • 远程和本地目录;
  • 安装的时间。

答案1

如果远程目录已安装,它将列在 的输出中mount。其中包含您需要的大部分信息:

$ mount -t fuse.sshfs 
[email protected]:/remote/path/dir/ on /home/terdon/foo type fuse.sshfs (rw,nosuid,nodev,relatime,user_id=1001,group_id=1001)

考虑到这一点,您可以编写一个小脚本来解析输出并提供大部分详细信息:

$ mount -t fuse.sshfs | 
    perl -ne '/.+?@(\S+?):(.+?)\s+on\s+(.+)\s+type.*user_id=(\d+)/; 
    print "Remote host: $1\nRemote dir: $2\nLocal dir: $3\nLocal user: $4\n"'
Remote host: 139.124.66.43
Remote dir: /cobelix/terdon/research/
Local dir: /home/terdon/haha
Local user: 1001

这可以制作成 shell 函数或脚本,扩展为显示用户名而不是 UID 并从 中提取时间ps。这假设您不需要毫秒精度,因为 的输出ps是指命令启动的时间,而不一定是安装操作结束的时间。

sshfs_info(){
    mount -t fuse.sshfs | head -n1 |
    perl -ne '/.+?@(\S+?):(.+)(?= on\s+\/)(.+)\s+type.*user_id=(\d+)/; 
     print "Remote host: $1\nRemote dir: $2\nLocal dir: $3\nLocal user: " . 
     `grep  :1001: /etc/passwd | cut -d: -f1` '
    printf "Elapsed time: %s\n" $(ps -p $(pgrep -f sftp | head -n1) o etime=)
    }

如果将上面的函数添加到 shell 的初始化文件(例如~/.bashrcbash)中,则可以运行:

$ sshfs_info
Remote host: 123.456.7.8
Remote dir: /remote/path/dir
Local dir: /home/terdon/foo
Local user: terdon
Elapsed time: 44:16

请注意,这假设只有一个 sftp 实例正在运行。如果您需要处理多个实例,请使用以下实例:

sshfs_info(){
## A counter, just to know whether a separator should be printed
c=0
## Get the mounts
mount -t fuse.sshfs | grep -oP '^.+?@\S+?:\K.+(?= on /)' |
# Iterate over them
    while read mount
    do
    ## Get the details of this mount. 
    mount | grep -w "$mount" |
        perl -ne '/.+?@(\S+?):(.+)\s+on\s+(.+)\s+type.*user_id=(\d+)/; 
              print "Remote host: $1\nRemote dir: $2\nLocal dir: $3\nLocal user: " . 
              `grep  :1001: /etc/passwd | cut -d: -f1` '
    printf "Elapsed time: %s\n" "$(ps -p $(pgrep -f "$mount") o etime=)"
    ## Increment the counter
    let c++;
    ## Separate the entries if more than one mount was found
    [[ $c > 0 ]] && echo "---"

    done
}

输出看起来像:

$ sshfs_info 
Remote host: 123.456.7.8
Remote dir: /remote/path/foobar/
Local dir: /home/terdon/baz
Local user: terdon
Elapsed time:    01:53:26
---
Remote host: 123.456.7.8
Remote dir: /remote/path/foo/
Local dir: /home/terdon/bar
Local user: terdon
Elapsed time:    01:00:39
---
Remote host: 123.456.7.8
Remote dir: /remote/path/bar/
Local dir: /home/terdon/baz
Local user: terdon
Elapsed time:       53:57
---
Remote host: 123.456.7.8
Remote dir: /remote/path/ho on ho
Local dir: /home/terdon/a type of dir
Local user: terdon
Elapsed time:       44:24
---

正如您在上面的示例中看到的,它也可以处理包含空格的目录名称。

最后请注意,这并不是 100% 可移植的。它应该适用于任何具有 GNU 工具集的系统(例如任何 Linux 发行版),但不适用于非 GNU 系统,因为它使用特定于 GNU grep 的功能。

相关内容