路径中的可执行文件,可以通过它找到,但如果没有完全限定的路径就无法执行?

Pee*_*oot 12 linux ksh

我有一个看起来很奇怪的 shell 问题,在 $PATH 中有一个命令,shell(ksh,在 Linux 上运行)似乎怯懦地拒绝调用。没有完全限定命令,我得到:

#  mycommand
/bin/ksh: mycommand: not found [No such file or directory]
Run Code Online (Sandbox Code Playgroud)

但是可以通过以下方式找到该文件:

#  which mycommand
/home/me/mydir/admbin/mycommand
Run Code Online (Sandbox Code Playgroud)

我还在 $PATH 中明确看到该目录:

#  echo $PATH | tr : '\n' | grep adm
/home/me/mydir/admbin
Run Code Online (Sandbox Code Playgroud)

该位置的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
Run Code Online (Sandbox Code Playgroud)

如果我使用完全限定的路径显式运行它:

#  /home/me/mydir/admbin/mycommand
Run Code Online (Sandbox Code Playgroud)

我看到了预期的输出。这里肯定有一些东西让 shell 感到困惑,但我不知道它可能是什么?

编辑:找到一个类似的问题:Binary 在使用路径运行时不会执行。例如 >./program 不起作用但 >program 工作正常

我还在 $PATH 中测试了不止一个这样的命令,但只找到了一个:

# for i in `echo $PATH | tr : '\n'` ; do test -e $i/mycommand && echo $i/mycommand ; done
/home/me/mydir/admbin/mycommand
Run Code Online (Sandbox Code Playgroud)

编辑2:

到今天早上,问题已经消失,我现在可以执行可执行文件了。

这可以被认为是验证注销和登录的建议,但我昨晚做了没有成功。注销/登录也应该相当于运行建议的“hash -r”命令(fwiw 似乎也是 ksh 内置命令,而不仅仅是 bash 内置命令)。

针对部分回答:

  • 这是一个可执行文件而不是脚本(请参阅文件命令输出中的 ELF 参考)。

  • 我不认为 strace 会有所帮助。这最终会强制命令执行完全限定。我想我可以在当前的 shell 上做一个 strace attach,但是因为我不能再复制了,所以没有必要尝试。

  • $PATH 中没有分号。由于我无法再重现,我不会用完整的 $PATH 来混淆这个问题。

  • 正如所建议的那样,我也曾尝试过尝试另一个 shell(即 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
Run Code Online (Sandbox Code Playgroud)

$HOME 目录所有权搞砸了(不应该是根组)。这可能会导致其他问题,但我不知道它会如何导致这个问题。

Jef*_*and 0

好吧,我没有答案。我确实证明了一些事情,并认为我可以稍后补充:

  • 创建了一个测试文件——您的权限显示它是 setuid 且可执行的。
  • 尝试使用 nosuid 将其设置在安装点上:仍然运行
  • 尝试使用 noexec 将其设置在安装点上:给出了不同的错误

所以,从各方面来看,我仍然很困惑。只是为了一笑,万一这是一个与 shell 相关的错误,你能用不同的 shell 尝试一下吗?