경로에서 실행 파일, 찾을 수 있지만 완전한 경로가 없으면 실행할 수 없습니까?


12

쉘 (ksh, Linux에서 실행 중)이 겁쟁이 호출을 거부하는 $ PATH의 명령으로 기괴한 것처럼 보이는 쉘 문제가 있습니다. 명령을 완전히 규정하지 않으면 다음과 같은 이점이 있습니다.

#  mycommand
/bin/ksh: mycommand: not found [No such file or directory]

그러나 파일은 다음으로 찾을 수 있습니다.

#  which mycommand
/home/me/mydir/admbin/mycommand

또한 $ PATH에 해당 디렉토리가 명시 적으로 표시됩니다.

#  echo $PATH | tr : '\n' | grep adm
/home/me/mydir/admbin

해당 위치의 exe는 정상적으로 보입니다.

#  file /home/me/mydir/admbin/mycommand
/home/me/mydir/admbin/mycommand: setuid setgid ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.4, dynamically linked (uses shared libs), not stripped

# ls -l mycommand  
-r-sr-s--- 1 me mygroup 97892 2012-04-11 18:01 mycommand

그리고 완전한 경로를 사용하여 명시 적으로 실행하면 :

#  /home/me/mydir/admbin/mycommand

예상 출력이 표시됩니다. 뭔가 분명히 여기 껍질을 혼란스럽게하지만, 나는 그것이 무엇인지 상실하고 있습니까?

편집 : 비슷한 질문처럼 보이는 것을 찾으십시오 : 경로로 실행할 때 바이너리가 실행되지 않습니다. 예 :> ./ 프로그램이 작동하지 않지만> 프로그램이 정상적으로 작동 함

또한 $ PATH에서 하나 이상의 이러한 명령을 테스트했지만 하나만 찾습니다.

# for i in `echo $PATH | tr : '\n'` ; do test -e $i/mycommand && echo $i/mycommand ; done
/home/me/mydir/admbin/mycommand

EDIT2 :

오늘 아침부터 문제가 사라졌으며 이제 실행 파일을 실행할 수 있습니다.

로그 아웃 및 로그인 제안을 확인하는 것으로 생각할 수 있지만 지난 밤에 성공하지 못했습니다. 이 로그 아웃 / 로그인은 제안 된 'hash -r'명령을 실행하는 것과 동등한 작업을 수행해야합니다 (fwiw는 bash 내장이 아닌 ksh 내장으로 나타남).

일부 답변에 대한 답변 :

  • 스크립트가 아닌 실행 파일입니다 (파일 명령 출력의 ELF 참조 참조).

  • 나는 strace가 도움이 될 것이라고 생각하지 않습니다. 결과적으로 명령이 정규화되어 실행됩니다. 현재 쉘에서 strace 연결을 수행 할 수 있다고 가정하지만 더 이상 재현 할 수 없으므로 시도 할 필요가 없습니다.

  • $ PATH에 세미콜론이 없습니다. 더 이상 재현 할 수 없으므로 전체 $ PATH 로이 질문을 어지럽히 지 않습니다.

  • 다른 쉘 (예 : bash)을 시도하면 제안 된 것처럼 시도했을 수도 있습니다. 문제가 해결되면 도움이되는지 알 수 없습니다.

또한 디렉토리 권한을 확인하는 것이 좋습니다. 이렇게하면 각 디렉토리 마다이 디렉토리까지 볼 수 있습니다.

# ls -ld $HOME $HOME/mydir $HOME/mydir/admbin
drwxr-xr-x 10 me root    4096 2012-04-12 12:20 /home/me
drwxrwsr-t 22 me mygroup 4096 2012-04-12 12:04 /home/me/mydir
drwxr-sr-x  2 me mygroup 4096 2012-04-12 12:04 /home/me/mydir/admbin

$ HOME 디렉토리 소유권이 엉망입니다 (루트 그룹이 아니어야 함). 그로 인해 다른 문제가 발생할 수 있지만 이것이 어떻게 발생했는지 알 수 없습니다.


2
당신의 스크립팅 쿵푸는 굉장합니다.
Jeff Ferland

2
나는 이것이 지나치게 단순하게 들리는 것을 알고 있지만 한 번 같은 문제가 있었고 콜론 대신 경로 구분 기호로 사용되는 세미콜론으로 판명되었습니다.
John Gardeniers

전체 PATH 설정을 제공 할 수 있습니까?
Jason Huntley

이것은 잘 쓰여진 질문입니다.
gWaldo April

쉘의 캐싱 일 수 있습니까?
Michael Slade

답변:


1

$PATHusing 에서 쉘의 항목 캐시를 업데이트해야 할 수도 있습니다 hash -r.


$ apropos hash | grep ksh-- 아무것도. 당신은 bash내장으로 대답 했지만, 그것은 문제의 껍질이 아닙니다.
Jeff Ferland

1

또한 이러한 경우 실행 파일을 동적 링커에 인수로 전달하여 프로그램을 호출 할 때 발생하는 상황을 확인하십시오 (일부 시스템에서는 setuid / setgid 중에는 거부 할 수 있음).

두 경우의 ldd (1) 출력도 공개 될 수 있습니다. 실행 파일에 "해당 파일이나 디렉토리가 없음"은 실제로 실행 파일에 지정된 동적 링커를 찾을 수 없음을 나타냅니다 (ELFin 형식이 #! / lib / ld-linux.what.so.ever 인 실행 파일을 상상하십시오).

이 행동은 사람들이 libc5 시대의 종말을 목격하기 위해 멍청한 짓을했으며, 때로는 때때로 i386 / amd64 혼합 시대의 사람들을 두 가지 라이브러리 세트를 야생에서 지원하는 다른 방법으로 멍청하게 만듭니다.

실행 파일의 상대 RPATH 대 $ PWD?

추신 : 다른 질문은 MacOSX와 관련이 있으며 libc 제공 링커가 아닌 dyld를 사용합니다. 매우 다른 종류의 동물.


0

알겠습니다. 대답이 없습니다. 나는 몇 가지 사실을 입증했으며 나중에 이것에 추가 할 수 있다고 생각합니다.

  • 테스트 파일을 만들었습니다. 권한은 setuid 및 실행 파일임을 보여줍니다.
  • nosuid가있는 마운트 지점에서 설정을 시도했습니다 : 여전히 실행
  • noexec를 사용하여 마운트 지점에서 설정을 시도했습니다. 다른 오류가 발생합니다.

모든 계정에 따르면 여전히 혼란 스러워요. 미소와 오프 기회에 대해서만 이것은 쉘 관련 버그입니다. 다른 쉘로 시도해 볼 수 있습니까?


0

#! 다음에 스크립트에 유효한 셸이없는 것 같습니다. 예를 들어, 일부 구형 SCO 시스템에서는 bash REALLY가 / usr / bin / bash에 있기 때문에 #! / bin / bash가있는 스크립트가 작동하지 않습니다. 멍청하지만 SCO가 거의 죽었어.

쉘을 점검하고 실제 바이너리 / 스크립트를 가리키는 지 확인하십시오.

편집 : 그것은 스크립트 또는 바이너리인지 알려주지 않지만 'ls -l'출력이 정확하다고 가정하면 93kbyte 스크립트가 없을 것입니다. 그래서 이것은 아마도 내 대답은 바이너리입니다. 완전히 틀렸다.

로그 아웃했다가 다시 로그인 해 보셨습니까? / usr / bin에있는 바이너리를 사용하고 소스에서 / usr / local / bin 버전을 설치하면 시스템은 여전히 ​​로그 아웃하고 다시 로그인 할 때까지 원래 버전을 실행하려고 시도합니다.


스크립트가 아닌 실행 파일이었습니다 (문제의 파일에서 ELF 정보 참조). 예, 로그 아웃하고 로그인했습니다.
Peeter Joot

0

내 추측 :

  • 이라는 별칭이 mycommand있습니다. 예를 들면 다음과 같습니다.

    alias mycommand=something
    
  • 라는 함수가있었습니다 mycommand. 예를 들면 다음과 같습니다.

    mycommand() { something; }
    

다음에이 문제가 발생 command -V mycommand하면 셸이 어떤 종류의 명령을 믿는지 확인하십시오 mycommand.


이들 중 어느 것도이 명령에 해당되지 않았습니다.
Peeter Joot

0

답이없고 단지 많은 생각 :

  1. 파일 이름에 공백이 있는지 확인하십시오. 이것은 탭 완성을 사용할 때 자동으로 무시되고 매개 변수로 사용됩니다.
  2. 디렉토리에서 다른 스크립트 / 프로그램을 시도하십시오.
  3. 스크립트를 실행하려고 시도하는 쉘을 strace-ing하고 그것이 부서지는 곳을보십시오.

0

나는 정확히 같은 문제가 있었고 원래 포스터의 문제 자체가 해결 되었기 때문에 답을 찾지 못했습니다. 그러나 이것은 나에게 효과가 없었으며 마침내 문제를 추적 할 수있었습니다. 그래서 나는 원래 게시물에 대한 답변으로 다음을 추가하고 있습니다.

내가 직면 한 증상은 다음과 같습니다. / my / home 디렉토리에 스크립트 (myscript.pl)가 있습니다. 이제 실행하려고합니다.

> /my/home/myscript.pl
myscript.pl:  permission denied.

파일의 확인 된 권한 (실행 플래그가 설정 됨) $ PATH 확인 (문제는 없어야 함)

그런 다음 스크립트에서 실행 가능 플래그가 설정되어 있는지 확인한 후 시도합니다.

> cd /my/home/
> ./myscript.pl:  permission denied.

흠 ... 그래서 아마도 스크립트가 올바른 스크립트 언어 (이 경우 perl)를 호출하지 않을 것입니다. 스크립트 상단에는 올바른 마법이 있습니다.

#!/usr/bin/perl

실제로 / usr / bin / perl이 존재하고 작동합니다. 따라서 다음 호출이 올바르게 작동합니다.

/usr/bin/perl myscript.pl

탭 자동 완성은 파일을 표시하지 않습니다 ( tcsh또는 안 bash).

이것은 정말로 나를 버렸다. 그런 다음 몇 달 전에 내 하드 디스크가 고장 나서 실험실의 젊은 시스템 관리자가 시스템을 다시 설치했음을 기억했습니다. 그는 파티션에 대한 권한을 망칠 수도 있다고 생각했습니다. 그리고 실제로, /etc/fstabexec 권한이 누락되었습니다!

/dev/sda1    /my     /ext4      rw,user

대신에

/dev/sda1    /my     /ext4      rw,user,exec

변경 /etc/fstab하고 다시 마운트 하여이 문제를 해결했습니다 .

mount -v -o remount /my

이것은 문제를 완전히 해결했습니다. 내 생각에 권한 문제가 간헐적으로 발생했다는 점을 제외하고는 원래 포스터의 문제와 비슷한 일이 발생했을 수 있습니다 (예 : 일시적인 변경으로 인해 재부팅으로 해결되었을 수 있음).


-1

완전한 대답은 아니지만 질문자와 정확히 같은 문제가 발생하여 내 경험을보고하고 싶었고 미래의 사용자가 같은 미친 문제를 겪는 데 도움이 될 것이라고 생각했습니다. 파일을 찾아 내 경로에서 볼 수 있으며 전체 경로를 지정하여 실행할 수도 있지만 그렇지 않으면 실행할 수 없습니다. 그러나 필자의 경우 하위 셸 내에서만 발생했습니다 (예 : 스크립트에서 실행될 때 중첩 된 하위 셸이 몇 개있었습니다). 커맨드 라인에서 잘 실행할 수 있습니다.

중첩 된 스크립트에서 명령 바로 전에 명령을 인쇄했습니다. 예 : echo $ (which mycommand)

mycommand : / home / me / bin / mycommand

그런 다음 부모 스크립트에서 실행하려고합니다.

/ home / me / bin / some_parent_script [72] : mycommand : 찾을 수 없음 [그런 파일이나 디렉토리가 없습니다]

질문자와 마찬가지로 문제의 원인을 진단 할 수 없었습니다. 내 PATH가 올바르게 보였고 어느 것이 가능했으며 해시는 mycommand의 이전 항목을 공개하지 않았습니다. 다음 날 내가 로그인했을 때 모든 것이 마술처럼 다시 작동했습니다. 이제 마운트를 다시 마운트하는이 문제를보기 직전에 알려진 시스템 문제가 있음을 알 수 있습니다. 아마도 그게 실마리일까요?

이런 일이 발생했음을 보여주는 로그 파일 이후에 로그 파일이 없으면 가능하지 않다고 생각합니다! 질문자 덕분에 더 이상 미쳤다고 느끼지 않습니다!

추신 : 나는 user226160이 기자와 정확히 같은 문제를 가지고 있다고 생각하지 않지만 관련 소리가 들리고 마운트 이론에 대한 신뢰를 빌려줍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.