C++ 从c+;调用bash脚本时出现权限问题+;apache正在运行的代码
这段代码的目标是在捕获sigterm/sigint/sigsegv/etc时创建堆栈跟踪。为了不依赖于C++代码中的内存管理,在SigSeSV的情况下,我决定编写一个BASH脚本,该脚本将接收跟踪数组中的PID和内存地址。 正在捕获Sig事件 下面是我生成bash脚本调用的地方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
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");