使用带有 execve 的新路径来运行 ls 命令

2023-12-04

我正在尝试使用 execve 运行 ls 命令。目前我正在使用以下参数运行它:

execve(args[0], args, env_args)
//args looks like {"ls", "-l", "-a", NULL}
//env_args looks like {"PATH=/bin", "USER=me", NULL}

我期望这样做的是使用我的新 env_args 运行 ls 命令,这意味着它将在我的 PATH 中查找 ls 。然而,这段代码实际上没有做任何事情,当我运行该代码时,它只是返回到我的命令提示符而没有输出。

使用相同的 args[] 我正在使用 execvp 和 ls 工作并搜索我当前的路径。

你能告诉我我做错了什么吗?

我想做的是编写自己的 shell 程序,在其中我可以创建和导出自己的环境,并让 exec 使用我在 char** 中定义的环境。本质上,我正在编写自己的函数来对 env_args 进行操作以添加和删除变量,当我调用 exec 时,我希望能够在 {"ls", "-l", NULL} 上调用 exec 并让它查看我的新环境名为 ls 的有效程序的路径变量。我希望这能更好地解释我正在做的事情。在这种情况下,我认为外部环境变量对我不起作用。


The execve()函数不查看 PATH;为此,你需要execvp()。您的程序无法执行ls,显然你不会报告执行程序失败后execve()。请注意,成员exec*()函数族仅在出错时返回。

如果您运行该程序,您会得到您期望的结果(或多或少)/bin作为您当前的目录(因为./ls - aka ls- 然后就会存在)。

您需要在第一个参数中提供可执行文件的路径名execve(),使用适当的 PATH 设置找到它后。

或者继续使用execvp(),但设置变量environ到你的新环境。注意environ在 POSIX 全局变量中是独一无二的,因为它没有在任何标头中声明。

extern char **environ;

environ = env_args;
execvp(args[0], &args[0]);

您不需要保存旧值并恢复它;您处于子进程中,切换其环境不会影响主程序(shell)。


这似乎按照我的预期工作 - 并证明原始代码的行为符合我的预期。

#include <stdio.h>
#include <unistd.h>

extern char **environ;

int main(void)
{
    char *args[]     = { "ls", "-l", "-a", NULL };
    char *env_args[] = { "PATH=/bin", "USER=me", NULL };

    execve(args[0], args, env_args);
    fprintf(stderr, "Oops!\n");

    environ = env_args;
    execvp(args[0], &args[0]);
    fprintf(stderr, "Oops again!\n");

    return -1;
}

我听到“哎呀!”接下来是我的目录列表。当我创建可执行文件时ls在我当前的目录中:

#!/bin/sh
echo "Haha!"

然后我就听不到“哎呀!”并得到“哈哈!”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用带有 execve 的新路径来运行 ls 命令 的相关文章

  • Web UI 中的 .Result 出现死锁

    我正在阅读以下主题http blog stephencleary com 2012 07 dont block on async code html http blog stephencleary com 2012 07 dont bloc
  • .NET 可移植类库中的 .ToShortDateString 发生了什么

    我想知道为什么没有 ToShortDateString在 NET 可移植类库中 我有 2 个项目 Silverlight 和常规 NET 类库 使用相同的代码 并且代码涉及调用 ToShortDateString on a DateTime
  • 在 Windows Phone 上启动 pdf 文件时出现 System.Runtime.InteropServices.COMException

    我正在尝试使用我之前在另一个应用程序上使用过的以下工作代码打开 pdf 文件 但这一次 当流程到达此行时 我收到 System Runtime InteropServices COMException Windows System Laun
  • 我应该在单元测试中使用 AutoMapper 吗?

    我正在为 ASP NET MVC 控制器方法编写单元测试 这些控制器依赖于IMapper 我创建的用于抽象 AutoMapper 的接口 使用 Castle Windsor 通过构造函数注入传入 动作方法使用IMapper从领域对象映射到
  • Linq Where 本地计数器关闭在 VS watch 中的结果不同

    我尝试删除前 3 个元素array与 LinQWhere扩展功能 这是一个例子 var array new 1 2 3 4 5 6 7 8 9 var count 3 var deletedTest1 0 var test1 array W
  • 身份未映射异常

    System Security Principal IdentityNotMappedException 无法转换部分或全部身份引用 该错误仅在应用程序注册后出现一次 当 SecurityIdentifier 无法映射时 例如 返回 Ide
  • C++ 在 Vector 中使用不可分配的对象

    我想将对象列表存储在std vector 但对象包含引用且无法分配给 但是 我可以复制构造该对象 我能想到的唯一选择是使用指针来包装对象并在需要分配指针时重新设置指针 但这样做的语法会显着降低可读性 特别是在使用迭代器时 我更喜欢另一种选择
  • Qt中正确的线程方式

    我的图像加载非常耗时 图像很大 并且在加载时也完成了一些操作 我不想阻止应用程序 GUI 我的想法是在另一个线程中加载图像 发出图像已加载的信号 然后用该图像重绘视图 我的做法 void Window loadImage ImageLoad
  • glDrawElements 只绘制半个四边形

    这是我的功能 void Object draw2 if mIsInitialised return Tell OpenGL about our vertex and normal data glEnableClientState GL VE
  • 防止复制构造和返回值引用的分配

    如果我有一个函数返回对类实例的引用 但我无法控制其源 比如说list
  • CMake - 将预构建库链接到 C# 项目

    我正在使用 CMake 构建 C 库 该库依赖于已构建的库 dll 我似乎无法让图书馆链接到我的图书馆 我尝试过使用target link libraries mylib external lib 我也尝试过暴力破解 reference e
  • 推送 Lua 表

    我已经创建了一个Lua表C 但我不知道如何将该表推入堆栈顶部 以便我可以将其传递给 Lua 函数 有谁知道如何做到这一点 这是我当前的代码 lua createtable state libraries size 0 int table i
  • 抽象类和接口之间的区别[重复]

    这个问题在这里已经有答案了 可能的重复 接口与基类 https stackoverflow com questions 56867 interface vs base class 我不明白抽象类和接口之间的区别 我什么时候需要使用哪种字体
  • C#:如何使用 SHOpenFolderAndSelectItems [重复]

    这个问题在这里已经有答案了 有人可以举例说明如何使用 shell 函数吗SH打开文件夹并选择项目 http msdn microsoft com en us library bb762232 VS 85 aspx来自 C 我不太明白如何使用
  • C++ Primer 5th Edition 错误 bool 值没有指定最小大小?

    bool 的最小大小不应该是 1 个字节吗 这有点学术性的东西 尽管它们会转换为数字 并且 与其他所有事物一样 它们最终将基本上由计算机内存中的数字表示 但布尔值不是数字 你的bool可以取值true 或值false 即使您确实需要至少 1
  • 编写专门用于类及其子类的函数模板

    我正在尝试编写一个函数模板 一个版本应该用于不满足另一版本标准的所有类型 当参数是给定类的基类或该类本身时 应使用另一个版本 我尝试过超载Base 但是当类派生自Base 他们使用通用的 而不是特定的 我也尝试过这种 SFINAE 方法 s
  • 在 unix 中编译 dhrystone 时出错

    我是使用基准测试和 makefile 的新手 我已经从下面的链接下载了 Dhrystone 基准测试 我正在尝试编译它 但我遇到了奇怪的错误 我尝试解决它 但没有成功 有人可以帮助我运行 dhrystone 基准测试吗 以下是我尝试编译的两
  • 多个同名内存数据库

    关系到这个答案 https stackoverflow com a 48446491 596758 我试图通过设置让多个上下文工作UseInMemoryDatabase以同名 下面的测试失败 第二个上下文为空 我还需要做什么才能在内存数据库
  • 有没有办法让 VS2010 在我的方法中扩展或收缩 try 块?

    我的代码有很多 try catch finally 块 与我在 VS2010 中的方法不同 除了添加区域之外 我无法在开发时扩展或收缩这些区域来隐藏内容 try vm R vm Qu vm T vm D vm Fil vm Type vm
  • ASP.NET Core:会话 ID 始终变化

    今天启动了一个全新的 ASP NET Core 网站 按照说明添加会话 我们在索引页上打印出会话 ID 它始终是唯一的 我认为这可能是 cookie 合规性 所以我在 Chrome 的高级设置和调试器中删除了所有 cookie 但横幅不会再

随机推荐

  • python中小于负无穷大的数字? [复制]

    这个问题在这里已经有答案了 这在 python2 中是可能的 None lt float inf 还有 它always returns True 然而 在 python3 上 这会抛出 TypeError unorderable types
  • 为多个用户主动安装/推送团队中的应用程序

    我有一个关于如何在 Teams 中为多个用户主动安装 推送应用程序 的疑问 我们已将 Bot 应用程序添加为 Teams 应用程序目录的一部分 并且我按照以下有关 Microsoft Teams 中的管理应用程序设置策略的文档来安装应用程序
  • 地图和法律提及

    在 iOS 我的问题是我必须向我的地图添加页脚子视图 它将隐藏合法链接 如何解决这个问题而不被 App Store 拒绝 我可以自己创建另一个合法按钮并将其添加到地图视图中我想要的位置吗 我不知道我能做什么 有一些答案建议您将合法标签移至v
  • Html.Partial 与 Html.RenderPartial 和 Html.Action 与 Html.RenderAction

    在 ASP NET MVC 中 有什么区别 Html Partial and Html RenderPartial Html Action and Html RenderAction Html Partial返回一个字符串 Html Ren
  • 当前上下文中不存在名称“ViewBag”

    我正在尝试在我的应用程序中使用 ViewBag 我拥有所有最近的 dll 最新版本的 MVC 3 但我仍然收到错误 名称 ViewBag 在当前上下文中不存在 我什至卸载并重新安装了 MVC 3 但没有任何变化 另外 我不相信 dll 会出
  • 通过 Gmail 发送电子邮件

    我有一个代码 用于发送电子邮件 Intent i new Intent Intent ACTION SEND i setType text plain i putExtra Intent EXTRA EMAIL new String to
  • 计算中使用的提示或宏变量

    我使用 EG 中的提示管理器创建了一个数字变量 该变量称为 HYr 代表我提取的数据最高年份 运行程序时 我根据最高年份创建了 4 个新变量 这就是我遇到问题的地方 我有以下内容 Let Yr2 HYr 1 Let Yr3 HYr 2 Le
  • Vapor 4:如何将急切加载的父关系映射为不同的格式?

    我在如何返回包含父关系的模型 同时将急切加载的模型映射到不同的形式方面遇到了一些困难 让我们考虑以下 2 个模型 Course and User final class Course Model Content static let sch
  • docker-compose 主机和容器上的持久数据

    我在 docker compose yml 3 0 中遇到卷问题 所以我知道一个卷的行为就像一个挂载 但是我已经设置了一个wiki 当我在docker compose中设置一个卷时 容器上的数据将被删除 隐藏 那么我怎样才能先将数据从容器保
  • 递归搜索并删除数组?

    我正在使用一个多维数组 我希望能够删除与 id 匹配的数组 和所有子数组 我尝试过的功能是 function removeKey key array childKey children if isset array key unset ar
  • 浮动/浮动=奇怪的结果

    我有两个值 一个来自用户输入 另一个来自数据库 var userinput form someInput var valuefromDB GetValue someNumber public float GetValue int id re
  • XSLT 2.0 通过多阶段转换在 HTML 输出中创建增量脚注编号

    这个问题建立在我对我的回答的基础上原问题 有人建议我发布后续内容 这涉及到尝试集成上一篇文章中的 XSL 代码 在上一个问题中 我提出了 TEI XML 文档的简化版本 我正在使用 XSLT 2 0 将其转换为 HTML 完整的 tei 文
  • 如何计算体素大小?

    提供了 DICOM 标头中的以下信息 如何计算体素大小的第三个值 我假设前两个值为 0 515625 和 0 515625 BitsAllocated 16 BitsStored 12 Columns 512 HighBit 11 Imag
  • 为什么 scanf 在提供 double 时返回 0.000000?

    我有以下汇编代码 为 Linux 上的 NASM 编写 This code has been generated by the 7Basic compiler
  • Python - 将日期时间参数传递到 SQL 命令中

    我正在尝试用Python做这样的事情 SQLCommand Delete From s where Date gt s and Date lt s calendar table name required starting date req
  • 使用 ruby​​ 和 active_record 保存时出现弃用警告

    我是 ruby 新手 正在编写一个需要将消息写入数据库日志的小脚本 我使用 ruby 1 9 3 和 active record 但没有 Rails 所有选择语句都工作正常 但我的写入日志函数返回以下错误 DEPRECATION WARNI
  • Python - 时间数据与格式不匹配

    我有以下格式的字符串时间 2016 12 10T13 54 15 294 我使用以下方法来格式化时间 time strptime ts b d H M S Y 这会引发错误 time data did not match format da
  • 使用 shell 变量查找具有多个文件名的 -name

    我有一个find命令查找名称与提到的多个模式匹配的文件 name范围 find L name SystemOut log o name out o name log o name javacore 这可以在命令行成功找到所需的文件 我正在寻
  • 如何管理 DOM 元素

    我已经实现了无限滚动 即当滚动条到达 div 底部时加载记录 它工作正常 但在页面上加载太多记录后 页面变得太重并导致渲染缓慢 实际上 我正在使用这种技术来替代 gridview 那么在这种情况下我如何管理繁重的 DOM 将 DOM 元素减
  • 使用带有 execve 的新路径来运行 ls 命令

    我正在尝试使用 execve 运行 ls 命令 目前我正在使用以下参数运行它 execve args 0 args env args args looks like ls l a NULL env args looks like PATH