execve /bin /bash:h:没有这样的文件或目录

execve /bin/bash: h: No such file or directory

本文关键字:文件 bash bin execve      更新时间:2023-10-16

在RHEL 5.8的几个,我面临Execve呼叫的问题。但是,Execve并没有失败,获得以下错误:

/bin/bash: h: No such file or directory

我在C 代码中使用以下方式:

::fork();
.
.
.
char achWritePipeDescriptor[8], achReadPipeDescriptor[8];
snprintf(achWritePipeDescriptor, sizeof(achWritePipeDescriptor), "%d", fWritePipeDescriptor);
    snprintf(achReadPipeDescriptor, sizeof(achReadPipeDescriptor), "%d", fReadPipeDescriptor);
// fWritePipeDescriptor and fReadPipeDescriptor are integers
::execl("/bin/sh", "/bin/sh", "Launcher.sh", achWritePipeDescriptor, achReadPipeDescriptor, (char*)0);
switch(errno)
{
default:
    printf("n Failed to launch Launcher.shn");
    break;
}

此处的Exec调用并没有失败,但是当尝试与上述脚本交互时,我会超越错误。此过程的StrACE输出看起来如下:

execve("/bin/bash", ["/bin/bash", "h", "10", "6"], [/* 36 vars */]) = 0
.
.
.
open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
fstat(2, 0x7fff23708910)                = -1 EBADF (Bad file descriptor)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b9d1c785000
write(2, "/bin/bash: h: No such file or di"..., 40) = -1 EBADF (Bad file descriptor)
exit_group(127)                         = ?
Process 13030 detached

这里没有引用" h"文件,但是脚本名称的最后一个字符是" h"。另外,我要执行的脚本确实存在于预期位置,并且具有足够的权限。

我不知道" H"即将到来。

我将执行呼叫更改为以下:

::execl("Launcher.sh", "Launcher.sh", achWritePipeDescriptor, achReadPipeDescriptor,(char*)0);

这样,它可以正常工作,但是在下面的代码下,我看到另一个Execl调用的类似错误。第二次执行的区别在于二进制是不同的,但是错误仍然相同。

我不确定这是服务器特定问题。

任何线索,任何故障排除步骤都会有很大的帮助。

我的坏人,我应该早些时候提到它,<script.sh>是占位符。我试图表明我要执行的shell脚本。另外,writefdreadfd在这里是char*。在我在这里粘贴的strace输出中可以清楚地看到。同样,Exec在这里没有失败,因为我没有看到"无法启动启动器"消息。

除了Mikeyb解决的<script.sh>"script.sh"问题外,这里还有另一个问题。其他问题是将writefdreadfd传递给execl。鉴于名称,我假设这些是一个管道的写入末端,也是另一根管道的读取末端。如果是这种情况,writefdreadfd是整数,而不是char*指针。

使一些脚本通过管道与您的程序通信的最简单方法是dup2一个管道的读取末端到标准输入,而dup2在调用execl之前,将另一管线的写入末端到标准输出。该脚本只需从标准输入读取,并写入标准输出。您不需要将这些文件描述符完全传递给脚本。

execl("/bin/sh", "/bin/sh", <script.sh>, writefd, readfd, NULL);

那只是不工作的……<script.sh>无效C 。

将其更改为:

execl("/bin/sh", "/bin/sh", "script.sh", writefd, readfd, NULL);