Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从c+;调用bash脚本时出现权限问题+;apache正在运行的代码_C++_Apache_Bash_Shell_Centos6 - Fatal编程技术网

C++ 从c+;调用bash脚本时出现权限问题+;apache正在运行的代码

C++ 从c+;调用bash脚本时出现权限问题+;apache正在运行的代码,c++,apache,bash,shell,centos6,C++,Apache,Bash,Shell,Centos6,这段代码的目标是在捕获sigterm/sigint/sigsegv/etc时创建堆栈跟踪。为了不依赖于C++代码中的内存管理,在SigSeSV的情况下,我决定编写一个BASH脚本,该脚本将接收跟踪数组中的PID和内存地址。 正在捕获Sig事件 下面是我生成bash脚本调用的地方 trace_size = backtrace(trace, 16); trace[1] = (void *)ctx->rsi; messages = backtrace_symbols(trace, trace_s

这段代码的目标是在捕获sigterm/sigint/sigsegv/etc时创建堆栈跟踪。为了不依赖于C++代码中的内存管理,在SigSeSV的情况下,我决定编写一个BASH脚本,该脚本将接收跟踪数组中的PID和内存地址。 正在捕获Sig事件

下面是我生成bash脚本调用的地方

trace_size = backtrace(trace, 16);
trace[1] = (void *)ctx->rsi;
messages = backtrace_symbols(trace, trace_size);

char syscom[356] = {0};
sprintf(syscom,"bash_crash_supp.sh %d", getpid());
for (i=1; i<(trace_size-1) && i < 10; ++i)
{
    sprintf(syscom,"%s %p",syscom,trace[i]);
}
bash脚本的目的是获取/proc/pid/maps的偏移量,然后使用该偏移量运行addr2line以获取文件名/行号

strResult=$(sudo cat /proc/"$1"/maps | grep "target_file" | grep -m 1 '[0-9a-fA-F]')

offset=$( cut -d '-' -f 1 <<< "$strResult");
strResult=$(sudo cat/proc/“$1”/maps | grep“目标文件”| grep-m1'[0-9a-fA-F])

offset=$(cut-d'-'-f1长话短说,几乎所有基于Unix的系统都会忽略任何解释脚本上的
setuid
(任何带有shebang
#!
)作为安全预防措施

您可以在实际可执行文件上使用
setuid
,但不能在shell脚本本身上使用。如果您愿意承担巨大的安全风险,您可以制作一个包装器可执行文件来运行shell脚本,并将可执行文件
setuid


有关更多信息,请参阅Unix StackExchange上的这个问题:

1)在
bash\u crash\u supp.sh
脚本中,您的shabang(起始行
#!
)是什么,2)在shell脚本中包含
echo“$*”
,并发布结果。#/bin/bash是位于顶部的沙邦。添加了PARAMs的回声,以及从C++代码中生成的命令,<代码> >结果> /代码>包含什么?你能做一个
echo“${strResult}”
并发布它吗?试图缩小问题是运行错误的命令还是获得错误的输出。strResult不包含任何内容,这就是为什么我认为这是一个权限问题,如果我在终端中以我的用户(而不是apache)的身份运行strResult=$(sudo…)命令,它将正常工作。好的,开始计时。在脚本开头附近包含一个
whoami
,以验证它是否以root用户身份运行。尝试
strResult=$(sudo cat/proc/“$1”/maps 2>&1)
然后立即
echo$?
检查返回代码,然后
echo“${strResult}”
查看是否捕获了任何STDERR输出。
strResult=$(sudo cat /proc/"$1"/maps | grep "target_file" | grep -m 1 '[0-9a-fA-F]')

offset=$( cut -d '-' -f 1 <<< "$strResult");