Por que o comando find explode em / run /?

13

Eu usei o seguinte comando para verificar as versões do Python como dadas por esta resposta . Ele funciona, exceto por um erro, mostrado abaixo. Alguém pode explicar por quê?

$ sudo find / -type f -executable -iname 'python*' -exec file -i '{}' \; \
    | awk -F: '/x-executable; charset=binary/ {print $1}' \
    | xargs readlink -f | sort -u | xargs -I % sh -c 'echo -n "%: "; % -V'

Erro:

find: ‘/run/user/1000/gvfs’: Permission denied
    
por abdul qayyum 20.10.2016 / 10:16

2 respostas

20

As permissões:

$ stat -c %a /run/user/1000/gvfs
500

Portanto, somente o proprietário tem permissão de execução (o que permite que os diretórios sejam pesquisados). Mas você usou sudo e root tem todas as permissões possíveis, certo? Na verdade, você encontrou a exceção:

Esta resposta Gilles no Unix e Linux SE explica porque é negada permissão para root esse diretório, que é um ponto de montagem para o FUSE:

Managing trust boundaries with FUSE filesystems is difficult, because the filesystem driver is running as an unprivileged user, as opposed to kernel code for traditional filesystems. To avoid complications, by default, FUSE filesystems are only accessible to the user running the driver process. Even root doesn't get to bypass this restriction.

Se você executar o comando find sem sudo (como seu próprio usuário, UID 1000), não obterá esse erro, porque você é o proprietário do diretório, mas receberá outros erros de permissão.sudo e siga os conselhos de Gilles:

If you're searching for a file on local filesystems only, pass -xdev to find.

A maneira mais fácil de verificar as versões do Python:

$ python --version
Python 2.7.12+
$ python3 --version
Python 3.5.2+
    
por Zanna 20.10.2016 / 10:20
7

Existem várias maneiras de descobrir qual versão do python você tem. Aqui estão duas maneiras de obter as versões do Python 2 e do Python 3:

Específico do Python

Primeiro, execute python e python3 com a opção --version

$ python --version
Python 2.7.12
$ python3 --version
Python 3.5.2

Isso é específico para python, mas muitos outros programas usam um método semelhante.

Geral para qualquer pacote / programa

Um método mais geral é ver qual pacote está instalado. dpkg -l listará todos os seus pacotes, mas você pode especificar quais pacotes você está procurando. Para apenas python e python3, use o seguinte:

$ dpkg -l 'python'
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                  Version         Architecture    Description
+++-=====================-===============-===============-================================================
ii  python                2.7.11-1        amd64           interactive high-level object-oriented language 
$ dpkg -l 'python3'
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                  Version         Architecture    Description
+++-=====================-===============-===============-================================================
ii  python3               3.5.1-3         amd64           interactive high-level object-oriented language 

Como um titbit extra. Se você gostaria de encontrar todos os pacotes que tem um nome começando com python , você pode usar o caractere curinga * da seguinte forma:

$ dpkg -l 'python*'

Isso imprimirá muitas linhas com pacotes.

    
por Jorgen 20.10.2016 / 10:37