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

이는 쉘 함수나 스크립트로 만들어 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=)
    }

위 함수를 쉘의 초기화 파일(예: ~/.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 grep 관련 기능을 사용하기 때문에 GNU가 아닌 시스템에서는 작동하지 않습니다.

관련 정보