You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言实现的反向Shell中打印当前目录?

解决反向Shell不显示当前目录的问题

这个问题的核心是:当你把/bin/sh的标准输入/输出/错误重定向到套接字后,shell默认会进入非交互式模式,这种模式下它不会主动显示提示符(包括当前目录)。下面给你几个简单直接的解决办法:

方法1:强制shell以交互式模式启动

给/bin/sh加上-i参数,强制它进入交互式模式,这样shell就会自动加载默认提示符(包含当前目录)。修改你的execve调用即可:

execve("/bin/sh", (char*[]){"sh", "-i", NULL}, env);

这里把argv数组改成包含"-i",明确告诉shell“我是交互式会话,需要显示提示符”。绝大多数类Unix系统的sh(包括bash、dash)都支持这个参数,兼容性很好。

方法2:手动设置提示符环境变量

如果某些特殊环境下-i参数不生效,你可以直接控制PS1环境变量(shell的提示符配置变量),让shell即使在非交互式模式下也显示当前目录。

在dup2重定向之后、execve之前添加一行代码:

putenv("PS1='\\w $'");

其中\\w会被shell解析为当前工作目录的完整路径,如果你只想显示目录的最后一部分,可以用\\W,比如把PS1设为'\\W $',提示符就会变成类似home $这样的简洁格式。

修改后的完整handle_connection函数示例:

void handle_connection(socket_t* sock, char** argv, char** env) {
    // 重定向标准输出、标准输入、标准错误流
    for (int i = 0; i <= 2; i++) 
        dup2(*sock, i);
    
    // 手动设置包含当前目录的提示符
    putenv("PS1='\\w $'");
    
    execve("/bin/sh", argv, env);
}

小提示

如果你的argv参数原本是传递的进程原始参数,建议直接像方法1那样硬编码参数数组,避免原始参数干扰shell的启动模式,确保交互式模式能正常生效。

内容的提问来源于stack exchange,提问作者j3141592653589793238

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:28:04