Por que o comando find explode em / run /?

13

Eu usei o seguinte comando para verificar as versões do python, conforme fornecido por esta resposta . Ele funciona, exceto por um erro, mostrado abaixo. Alguém pode explicar o porquê?

$ 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
abdul qayyum
fonte
2
python --versione python3 --versionpara mostrar a versão ativa. Nós todos temos uma versão 2.x ea versão 3.x;)
Rinzwind
6
E o erro é normal e não é um problema com o comando. /run/não deve ser incluído em "localizar". gvfsnão pertence ao seu usuário.
Rinzwind
1
Você também pode digitar pythonno console e pressionar a tecla Tab duas vezes, ele mostrará todos os executáveis ​​no seu caminho, começando com python.
Timo
7
Boa dor, pessoal. Estou fazendo uma edição bastante pesada para a pergunta porque algumas pessoas não conseguiram chegar ao primeiro parágrafo. O OP sabe como descobrir quais versões, a questão é por que esse comando (que encontra todas as versões do Python) está lançando um erro específico. Se você quiser postar sobre python -Ve alternativas, leve-o a uma pergunta que realmente solicite essas informações .
Oli
1
Executar o comando na pergunta é uma péssima idéia, ele encontrará qualquer arquivo em seu sistema cujo nome comece com python e o executará como root . Se seus usuários descobrirem que você usa esse comando, você acabou de lhes entregar uma exploração trivial da raiz.
Peter Green

Respostas:

20

As permissões:

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

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

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

Gerenciar limites de confiança com sistemas de arquivos FUSE é difícil, porque o driver do sistema de arquivos está sendo executado como um usuário sem privilégios, em oposição ao código do kernel para sistemas de arquivos tradicionais. Para evitar complicações, por padrão, os sistemas de arquivos FUSE são acessíveis apenas ao usuário que executa o processo do driver. Mesmo a raiz não consegue ignorar essa restrição.

Se você executar o findcomando sem sudo(como seu próprio usuário, UID 1000), você não receberá esse erro, porque é o proprietário do diretório, mas receberá outros erros de permissão; portanto, use sudoe siga o conselho de Gilles:

Se você estiver procurando por um arquivo apenas em sistemas de arquivos locais, passe -xdev para localizar.


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

$ python --version
Python 2.7.12+
$ python3 --version
Python 3.5.2+
Zanna
fonte
Eu tenho apenas um usuário, exceto root, então quem você espera que seja o proprietário?
abdul qayyum
1
É você, UID 1000. Você pode acessar cdesse diretório como usuário normal, mas não como root. Se você executar findsem sudovocê não verá esse erro (mas você obterá outros erros de permissão, é claro)
Zanna
2
@abdulqayyum Você tem certeza? Por padrão, o ubuntu possui muitos usuários associados a vários processos daemon. Então, sim, eles não podem login e eles não têm um diretório casa, mas eles existem e podem possuir arquivos e diretórios ...
Bakuriu
7

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

Específico para Python

Primeiro basta executar pythone python3com 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 -llistará 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 petisco extra. Se você deseja encontrar todos os pacotes com um nome começando python, use um caractere curinga *como este:

$ dpkg -l 'python*'

Isso imprimirá muitas linhas com pacotes.

Jorgen
fonte
Boa resposta, mas o script acima funciona. Eu só estava preocupado com a negação de permissão
Abdul Qayyum
Muitos de nós apenas redirecionamos o stderr para um arquivo temporário. Acontece com muitas operações do tipo varredura.
Mckenzm