desenv-web-rp.com

Verifique se a pasta é um sistema de arquivos remoto montado

Qual é a melhor maneira (confiável, portátil, etc.) para verificar se uma determinada pasta está em um sistema de arquivos remoto (nfs) montado em um script do Shell?

Estou procurando um comando que se pareça com:

chk-remote-mountpoint /my/path/to/folder 
44
Totor

Como Stephane diz "não existe uma resposta universal do Unix para isso".

A melhor solução que encontrei para minha pergunta:

df -P -T /my/path/to/folder | tail -n +2 | awk '{print $2}'

retornará o tipo de sistema de arquivos, por exemplo: nfs ou ext3.

O -T opção não é padrão , portanto, pode não funcionar em outros sistemas Unix/Linux ...

De acordo com Gilles 'comentário abaixo: "Isso funciona em qualquer Linux não incorporado, mas não no BusyBox, * BSD, etc."

34
Totor

Você poderia usar GNU stat.

%m para descobrir o ponto de montagem.

$ stat --format=%m /usr/src/linux
/usr/src

%T (no modo de sistema de arquivos) para descobrir o nome do sistema de arquivos.

$ stat --file-system --format=%T /usr/src/linux
reiserfs

Então você sabe que /usr/src/linux, no meu sistema, é armazenado em um sistema de arquivos montado em /usr/src e possui o tipo de sistema de arquivos reiserfs.

Consulte também man stat para referência adicional. É um comando muito versátil, útil quase sempre quando você precisa de informações sobre arquivos e não deseja voltar a grep | awkwardness.

13
frostschutz

mount -l e use grep, sed ou awk para encontrar a linha que se refere ao diretório em questão.

5
jayhendren

O "-l" para o df (1) falhará com um erro em sistemas de arquivos não locais, portanto você pode usar esse comportamento para saber se o sistema de arquivos é remoto:

df -l /path 2> /dev/null | grep -q "File"
rc=$?
if [ "$rc" = "0" ]
then
   echo "local mount, do stuff"
fi

No entanto, o -l opção é não padrão .

2
rsone1

Infelizmente, não existe uma resposta universal do Unix para isso.

Uma coisa que você pode fazer, para um determinado arquivo /a/b/c/d, É seguir o caminho:

  • /abc/.
  • /abc/..
  • /abc/../..
  • ...

... e faça stat(2) em cada nível, até que st_dev mude. Então você saberá onde está o ponto de montagem. Em seguida, você pode procurar o caminho canônico desse ponto de montagem em /etc/mtab Ou na saída de mount para descobrir o tipo de sistema de arquivos. Descobrir o que é remoto e o que não é será complicado, especialmente para os do tipo fusível. Por exemplo, nfs, cifs, Fuse.sshfs, Fuse.davfs São óbvios, mas e por exemplo Fuse.gvfs-Fuse-daemon Ou Fuse.avfsd que podem ter arquivos de rede e não de rede?

2
Stéphane Chazelas

df /path lhe dirá que /path é um ponto de montagem se indicar que o ponto de montagem não é /.

1
pgen

Faz:

df /me/path/to/folder

Se o primeiro campo (o sistema de arquivos) estiver no formato Host:/path, você saberá que é NFS

Assim:

df /my/path/to/folder | awk 'NR==1{next};$1~/:[/]/{print "yes";exit(0)};{print "No";exit(1)}'

Agora, coloque-o em um arquivo bash chamado "ifchk-remote-mountpoint".

Uso:

if ifchk-remote-mountpoint  /my/path/to/folder >/dev/null; then
    ...do something...
fi

ou:

ISNFS=$(ifchk-remote-mountpoint  /my/path/to/folder)
1
Udi

Você pode usar o df -t no Linux e df -T em sistemas BSD.

De homem df :

-t, --type = TYPE

lista de limites para sistemas de arquivos do tipo TYPE

if df -t nfs | grep -q /path/to/folder$; then
  # it is an NFS
fi
0
codeforester