Como posso obter informações sobre diretórios remotos montados através de sshfs?

5

Se eu montar um diretório de um servidor remoto em minha máquina local usando sshfs , como posso descobrir detalhes como:

  • Se qualquer montagem desse tipo está atualmente montada;
  • O usuário que o montou;
  • Os diretórios remotos e locais;
  • A hora em que foi montado.
por terdon 05.06.2015 / 18:10

1 resposta

6

Se o diretório remoto estiver montado, ele será listado na saída de mount . Isso contém a maioria das informações de que você precisa:

$ 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)

Com isso em mente, você pode escrever um pequeno script que analise a saída e forneça a maioria dos detalhes:

$ 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

Isso pode ser feito em uma função ou script do shell, estendido para mostrar o nome do usuário em vez do UID e extrair o tempo de ps . Isso pressupõe que você não precisa de milissegundos de precisão, pois a saída de ps se refere a quando o comando foi iniciado e não necessariamente quando a operação de montagem foi finalizada.

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=)
    }

Se você adicionar a função acima ao arquivo de inicialização do seu shell (por exemplo, ~/.bashrc for bash), poderá executar:

$ 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

Observe que isso pressupõe que apenas uma única instância sftp esteja em execução. Se você precisar lidar com várias instâncias, use esta:

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
}

A saída é semelhante a:

$ 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
---

Como você pode ver no exemplo acima, ele também pode lidar com nomes de diretório contendo espaços.

Por fim, observe que isso não é 100% portátil. Ele deve funcionar em qualquer sistema que tenha o conjunto de ferramentas GNU (qualquer distribuição Linux, por exemplo), mas não funcionará em sistemas não-GNU, porque está usando características específicas do GNU grep.

    
por 05.06.2015 / 18:10

Tags