Comment puis-je get des informations sur les directorys distants montés via sshfs?

Si je monte un directory à partir d'un server distant sur ma machine locale en utilisant sshfs , comment puis-je find des détails tels que:

  • Si une telle monture est actuellement montée;
  • L'user qui l'a monté;
  • Les directorys distants et locaux;
  • Le time où il a été monté.

Si le directory distant est monté, il sera listé dans la sortie de mount . Cela contient la plupart des informations dont vous avez besoin:

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

Dans cet esprit, vous pouvez écrire un petit script qui parsing la sortie et vous donne la plupart des détails:

 $ 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/chapple/research/ Local dir: /home/terdon/haha Local user: 1001 

Cela peut être transformé en une fonction shell ou un script, étendu pour afficher le nom de l'user au lieu de l'UID et en extrayant le time de ps . Cela suppose que vous n'avez pas besoin d'une précision de millisecondes puisque la sortie de ps fait reference au moment où la command a été lancée et pas nécessairement lorsque l'opération de assembly s'est terminée.

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

Si vous ajoutez la fonction ci-dessus au file d'initialisation de votre shell (par exemple ~/.bashrc pour bash), vous pouvez alors exécuter:

 $ 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 

Notez que cela suppose qu'une seule instance sftp est en cours d'exécution. Si vous avez besoin de traiter plusieurs instances, utilisez celle-ci à la place:

 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 ensortinges if more than one mount was found [[ $c > 0 ]] && echo "---" done } 

La sortie ressemble à:

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

Comme vous pouvez le voir dans l'exemple ci-dessus, il peut aussi gérer les noms de directorys contenant des espaces.

Enfin, notez que ce n'est pas 100% portable. Il devrait fonctionner sur n'importe quel système qui a le jeu d'outils GNU (n'importe quelle dissortingbution Linux, par exemple) mais cela ne fonctionnera pas sur des systèmes non-GNU car il utilise des fonctionnalités propres à GNU grep.