find 명령이 왜 / run /에서 폭발합니까?


13

이 대답에 따라 파이썬 버전을 확인하기 위해 다음 명령을 사용했습니다 . 아래에 표시된 하나의 오류를 제외하고 작동합니다. 아무도 이유를 설명 할 수 있습니까?

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

오류:

find: ‘/run/user/1000/gvfs’: Permission denied

2
python --versionpython3 --version활성 버전을 표시합니다. 우리는 모두 2.x 버전과 3.x 버전을 가지고 있습니다;)
Rinzwind

6
그리고 오류는 정상이며 명령에 문제가 없습니다. /run/"찾기"에 포함되지 않아야합니다. gvfs사용자가 소유하지 않았습니다.
Rinzwind

1
python콘솔에 입력 하고 탭 키를 두 번 누르면 경로의 모든 실행 파일이로 시작됩니다 python.
Timo

7
슬픔, 사람들. 일부 사람들은 첫 번째 단락으로 처리하지 못했기 때문에 질문을 상당히 많이 편집하고 있습니다. OP는 어떤 버전을 찾는 방법을 알고 있습니다.이 명령 ( 모든 Python 버전 을 찾는 )이 특정 오류를 해결하는 이유에 대한 질문입니다 . 에 대한 python -V대안 및 대안 을 게시 하려면 해당 정보를 실제로 요청하는 질문으로 가져 가십시오 .
Oli

1
질문에서 명령을 실행하는 것은 나쁜 생각입니다. 시스템에서 이름이 python으로 시작하는 파일을 찾아 root로 실행합니다 . 사용자가이 명령을 사용하는 것을 발견하면 사소한 루트 익스플로잇을 건네줍니다.
피터 그린

답변:


20

권한 :

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

따라서 소유자 만이 실행 권한 (디렉토리를 검색 할 수 있음)을 갖습니다. 그러나 사용 sudo하고 루트는 가능한 모든 권한을 가지고 있습니까? 실제로 예외를 발견했습니다.

이 답변 에 의한 유닉스와 리눅스 SE에 대한 권한이 FUSE에 대한 마운트 지점 인 루트 디렉토리에 대한 거부 이유를 설명 :

파일 시스템 드라이버는 기존 파일 시스템의 커널 코드와 달리 권한이없는 사용자로 실행되기 때문에 FUSE 파일 시스템으로 신뢰 경계를 관리하기가 어렵습니다. 복잡성을 피하기 위해 기본적으로 FUSE 파일 시스템은 드라이버 프로세스를 실행하는 사용자 만 액세스 할 수 있습니다. 루트 조차도이 제한을 무시하지 않습니다.

디렉토리를 소유하고 있기 때문에 (사용자 자신의 UID 1000) find없이 명령 을 실행하면 sudo해당 오류가 발생하지 않지만 대신 다른 권한 오류가 발생하므로 sudoGilles의 조언을 사용하십시오.

로컬 파일 시스템에서만 파일을 검색하는 경우 -xdev를 전달하여 찾으십시오.


파이썬 버전을 확인하는 가장 쉬운 방법 :

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

루트 이외의 사용자는 한 명 뿐이며 누가 소유 할 것으로 예상합니까?
abdul qayyum

1
바로 UID 1000 cd입니다. 루트는 아닌 일반 사용자로 해당 디렉토리에 액세스 할 수 있습니다 . 당신이 find없이 실행 sudo하면 그 오류를 볼 수 없습니다 (물론 다른 권한 오류가 나타납니다)
Zanna

2
@abdulqayyum 확실합니까? 기본적으로 우분투에는 다양한 데몬 프로세스와 관련된 많은 사용자가 있습니다. 따라서, 그들은 로그인 할 수없고 홈 디렉토리는 없지만 존재 하며 파일과 디렉토리를 소유 할 수 있습니다.
Bakuriu

7

어떤 버전의 파이썬을 찾는 방법은 여러 가지가 있습니다. 다음은 Python 2 및 Python 3 버전을 모두 얻는 두 가지 방법입니다.

파이썬 특정

먼저 실행 python하고 python3옵션으로--version

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

이것은 파이썬에만 해당되지만 다른 많은 프로그램에서도 비슷한 방법을 사용합니다.

모든 패키지 / 프로그램의 일반

보다 일반적인 방법은 설치된 패키지를 확인하는 것입니다. dpkg -l모든 패키지를 나열하지만 원하는 패키지를 지정할 수 있습니다. python과 python3의 경우 다음을 사용하십시오.

$ 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 

여분의 titbit로. 로 시작하는 이름을 가진 모든 패키지를 찾으려면 다음과 같이 python와일드 카드 문자를 사용할 수 있습니다 *.

$ dpkg -l 'python*'

패키지와 함께 많은 줄을 인쇄합니다.


좋은 답변이지만 위의 스크립트가 작동합니다. 난 그냥 허가 거부에 대해 우려했다
압둘 코이 욤 장관을

우리 대부분은 stderr을 임시 파일로 리디렉션합니다. 많은 스캔 유형 작업이 발생합니다.
mckenzm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.