我注意到我的一些用户在崩溃后根本没有得到一个coredump,即使他们的配置中的其他所有内容都是正确的.
在阅读了核心(5)手册页后,我多次注意到这一点:
[如果不生成核心转储文件]进程正在执行由进程的实际用户(组)ID以外的用户(组)拥有的set-user-ID(set-group-ID)程序.
我的守护进程不是setuid root,但是在很多配置中它以root用户身份启动,如果.conf文件指定了用户名,它会删除权限,使用通常的组合:
setgid(gid);
setuid(uid);
Run Code Online (Sandbox Code Playgroud)
当它这样做时,不再生成coredumps.环境中的其他所有内容似乎都是正确的,删除这些调用(并保持root状态)像往常一样让我获得coredumps.
我尝试通过调用不太便携的setresgid/uid来改变"真正的"uid/gid,因为这个似乎经常被建议永久删除权限:
setresgid(gid, gid, gid);
setresuid(uid, uid, uid);
Run Code Online (Sandbox Code Playgroud)
我希望能解决这个问题,但......根本没有改进.仍然没有coredumps.
Sooo ......现在怎么样?
测试代码:
#include <stdlib.h>
int main(int argc, char **argv) {
if (argc > 1) {
setgid(atoi(argv[2]));
setuid(atoi(argv[1]));
}
abort();
}
Run Code Online (Sandbox Code Playgroud)
用法:
./a.out 任何用户只是在没有setgid/setuid的情况下中止./a.out 1000 100 (其中1000是uid,100是gid)作为root来删除权限并观察coredumps不会发生.我已经在arch linux,centos 6.5和openbsd 5.3中测试了这个
简介:我有一个bash脚本在后台运行一个进程,它应该作为一个普通的命令工作,并在一个命令替换块中,如$(...).脚本本身会生成一个分支到后台的进程.它可以简化为这个测试用例:
#!/bin/sh
echo something
sleep 5 &
Run Code Online (Sandbox Code Playgroud)
在shell中运行此脚本将立即返回(并打印"某些内容"),在其中运行$(...)将挂起5秒钟,等待后台"睡眠"完成.
适用于在命令替换shell中启动的任何内容,并在后台生成进程,包括该进程树中的任何子进程.似乎影响bash和zsh,没有尝试过其他人.
原始问题:我有一个bash脚本,应该将值打印到stdout,并在每次运行时将其复制到X剪贴板.
#!/bin/sh
echo something
echo something | xclip -selection clipboard
Run Code Online (Sandbox Code Playgroud)
这个脚本(让我们称之为"某事")意味着用来获取这个词(实际上是另一个命令的输出)并以不同的方式使用,例如:
$ something
something
$ xclip -o -selection clipboard
something
$ echo $(something)
^C
Run Code Online (Sandbox Code Playgroud)
打印到正常的stdout,将输出复制到剪贴板以在普通的X应用程序中使用,并且还应该能够使用带有bash命令替换的stdout,在任何命令的中间插入这个单词.
然而,bash命令替换似乎强制xclip在前台保持活跃.xclip通常守护自己,因为X剪贴板要求客户端提供剪贴板内容,默认行为是在替换剪贴板内容后退出.
在用xclip解决了这个问题之后,我做了一个我在这个问题开头写的最小测试用例,所以它似乎应用了$(...)shell 中守护进程的任何东西
谁能解释这种行为?有什么办法可以避免吗?
我最近购买了索尼xperia P,但它无法检测到ad-hoc网络.经过一些谷歌搜索后我才知道android不支持ad-hoc网络,我没有修改/ system/bin/wpa_supplicant文件,这样它也可以显示ad-hoc网络.我在github上发现了很多修改过的文件,但我不知道应该使用哪一个.文件wpa_supplicant设备是特定的还是特定于Android版本的?我的Android版本是4.0.4(索尼xperia P),任何人都可以给我我的手机可以使用的确切文件.
android android-networking android-wifi android-wireless android-internet
我有一个关于GCC,ThreadSanitizer和档案,共享库以及PIE和PIC的使用的问题.
我整个上午都在尽力阅读,但我在网上找不到有用的,清晰的信息.
我理解PIC的作用.我想我明白PIE是你喜欢PIC的优化版本,它只适用于可执行文件.
现在来问题......
我可以用PIC而不是PIE编译可执行文件吗?
如果我用PIC编译共享库(.so),那么我是否必须将PIC与任何使用该库的可执行文件一起使用,而不是PIE?
如果我编译存档(.a),我可以使用PIE吗?(我读过-static和-pie不应该一起使用,这意味着没有).
我正在使用ThreadSanitizer.这需要PIC(也许PIE也可以 - 但正如你所看到的,我不清楚这一点).我有一个库,可以编译为存档(.a)或共享库(.so).该库需要使用ThreadSanitizer.但是,使用它的二进制文件也需要使用ThreadSanitizer(因为它有一些需要检查的代码).
构建为共享库的库实际上在使用ThreadSanitizer时无法链接 - 我认为该链接无法链接到libtsan(但我怀疑这不是一个真正的库,而是一堆内置于GCC中的编译器instrinc).这几乎可以肯定是我在某处弄错了.
我真正想要做的是使用存档(.a),因为二进制文件是一个测试程序,应该能够在没有安装库的情况下进行编译(这样用户可以方便地检查/测试库 - 测试二进制文件的makefile具有存档二进制文件的硬编码路径).
如果我可以将PIE与档案(.a)一起使用,那么我会对库和测试二进制文件进行PIE.如果PIE不能与档案一起使用,那么我认为我需要将PIC与库和测试二进制文件一起使用.我根本不想使用共享库,因为ThreadSanitizer大量使用TLS(线程本地存储),而与PIC的共享库具有绝对可怕的TLS性能.