如何在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
相关产品推荐
相关产品推荐

