我想确定某个应用程序(例如,surf)写入文件系统的位置,以确保它不留下任何痕迹。如果没有专用的沙箱系统,这可能并不容易,但我想知道是否有比简单地使用strace.
例如,这里有一个简单的脚本,名为run:
#!/bin/bash
mkdir history
echo foo bar > history/hist.db
echo hello > test
Run Code Online (Sandbox Code Playgroud)
我strace是这样跑的:
strace ./run 2>&1 | sed -n '/^open.*WRONLY/p' | sed 's/.*"\(.*\)"[^"]*$/\1/'
Run Code Online (Sandbox Code Playgroud)
查看已写入的所有文件(但不是目录)(我认为这不会捕获已创建但未写入的文件,例如由touch.创建的文件)。输出:
history/hist.db
test
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点,因为这对于除微不足道的应用程序之外的任何东西都变得笨拙,或者我可以传递给strace(或更好的正则表达式?)我是否会冒丢失写入文件系统的文件的风险?
我编写了以下代码来确定程序写入哪些文件。我当然想捕获文件名。
strace -f -t -e trace=file -p 8804 2>&1 | grep -oP "\"(.*)\".*O_WRONLY"
Run Code Online (Sandbox Code Playgroud)
这输出类似
/tmp/11111111.txt", O_WRONLY
Run Code Online (Sandbox Code Playgroud)
问题是我无法将所有这些输出传递给任何命令
strace -f -t -e trace=file -p 8804 2>&1 | grep -oP "\"(.*)\".*O_WRONLY" | echo
# does not show anything
Run Code Online (Sandbox Code Playgroud)
而且我无法保存所有这些的输出以供以后使用:
strace -f -t -e trace=file -p 8804 2>&1 | grep -oP "\"(.*)\".*O_WRONLY" > asd.out
# file is empty
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助。:)
我在 Linux 4.2.0 上,Ubuntu 14.04 的 Ubuntu Wily HWE 内核(我正在运行)。
在 MacBook 11,4 和 11,5 型号上有一个令人讨厌的错误,其中笔记本电脑实际上永远不会关闭,它们似乎到达Power down内核消息然后只是挂起而从未关闭。此错误也可能会阻止挂起和恢复。有趣的是,它不会在reboot被调用时表现出来,只有在试图停止机器时才会表现出来。
细节不那么重要,但什么是相关的是我怎么能调试这一点。有没有办法strace在内核关闭时调试或调试内核并以某种方式观察输出?我相当肯定,断电逻辑正在执行一个永远挂起的系统调用,并且由于某些奇怪的原因而没有返回。如果我能找出哪个系统调用不工作,我就可以继续找出它不工作的原因,以及具体是什么硬件导致关机失败。
是否有调试内核关闭的标准做法?我需要特殊的硬件吗?我很好地为内核编写补丁,但我什至不知道从哪里开始寻找这个问题,除非我能找到不起作用的系统调用。
Strace 允许
strace -e trace=$some_class
Run Code Online (Sandbox Code Playgroud)
指定要跟踪的系统调用类。
例如,
strace -e trace=file
Run Code Online (Sandbox Code Playgroud)
应该跟踪所有与文件相关的系统调用。
我怎样才能找出这些究竟是哪些?我想获得属于file该类的系统调用的完整列表。
我正在尝试将 的输出写入strace ls文件。我知道我需要使用>才能将命令的输出转发到文件,但它不起作用。它创建一个文件,但该命令将输出打印strace ls到标准输出,但将文件名写入文件。
$ strace ls > ls_sys.txt
...
strace output
...
$ cat ls_sys.txt
ls_sys.txt
Run Code Online (Sandbox Code Playgroud) 我创建了一个小函数,用于strace按名称 'ing 一组当前用户的进程:
function pstrace() {
local pattern="$1";
shift;
prefixDashP $(pgrep -U $(whoami) $pattern) | xargs strace -o /dev/stdout $@;
}
function prefixDashP() {
local new_args=();
for arg; do
new_args+=( '-p' );
new_args+=( "$arg" );
done;
for arg in "${new_args[@]}"; do
echo "$arg";
done;
}
# Usage: pstrace pattern1 pattern2 ...
Run Code Online (Sandbox Code Playgroud)
问题是,如果我不小心指定了太宽泛的模式,它会尝试监视它不应该监视的进程,因此我的系统会冻结。
是否有我可以随时排除的进程列表?
我正在阅读coreutils的源代码,我是来阅读tty.c代码的。主要功能tty如下:
int
main (int argc, char **argv)
{
char *tty;
int optc;
initialize_main (&argc, &argv);
set_program_name (argv[0]);
setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
initialize_exit_failure (TTY_WRITE_ERROR);
atexit (close_stdout);
silent = false;
while ((optc = getopt_long (argc, argv, "s", longopts, NULL)) != -1)
{
switch (optc)
{
case 's':
silent = true;
break;
case_GETOPT_HELP_CHAR;
case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
default:
usage (TTY_FAILURE);
}
}
if (optind < argc)
error (0, 0, _("extra operand %s"), quote (argv[optind]));
tty = …Run Code Online (Sandbox Code Playgroud) 我想要strace一个正在运行的进程,我知道我可以用它来做strace -p <pid>,但我相信这个进程已经挂在了一些阻塞调用上,例如sem_wait()在一个从未发布过的信号量上等等,并且输出strace只有一行,比如:
Process 195 attached - interrupt to quit
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 3600000^C <unfinished ...>
Run Code Online (Sandbox Code Playgroud)
是否可以指定strace输出更多行的上下文/历史?我猜不是,因为我猜是strace实时输出和每个函数/指令,但我想我会要求确认。
我正在使用 strace,出现以下行:
读(3,“\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\3 \2\0\0\0\0\0@\0\0\0\0\0\00P\265\31\0\0\0\0\0\0\0\0\0@\0008 \0\n\0@\0G\0F\0\6\0\0\0\5\0\0\0@\0\0\0\0\0\0\@\0\0\0 \0\0\0\0@\0\0\0\0\0\0\0000\2\0\0\0\0\0\0000\2\0\0\0\0\0\ 0\10\0\0\0\0\0\0"..., 832) = 832
第二个参数的格式是什么?那些 0、@ 和 \ 是什么?
我正在使用 Debian,搭配 Intel i5 CPU x86_64。
我怎样才能运行strace和记录系统调用的所有内容,但不能read和不能write?