Wenn Sie darüber nachdenken, wie es strace
funktioniert, ist es absolut sinnvoll, dass keines der in Bash eingebauten Elemente nachvollziehbar ist. strace
kann nur aktuelle ausführbare Dateien verfolgen, die eingebauten jedoch nicht.
Zum Beispiel mein cd
Befehl:
$ type cd
cd is a function
cd ()
{
builtin cd "$@";
local result=$?;
__rvm_project_rvmrc;
__rvm_after_cd;
return $result
}
Trick um die CD zu stracen?
Ich bin auf diese Technik gestoßen, strace
bei der Sie den tatsächlichen bash
Prozess aufrufen und auf cd
diese Weise indirekt verfolgen können.
Beispiel
$ stty -echo
$ cat | strace bash > /dev/null
Was dazu führt, dass ich den bash
Prozess wie folgt straffen kann:
....
getegid() = 501
getuid() = 500
getgid() = 501
access("/bin/bash", X_OK) = 0
stat("/bin/bash", {st_mode=S_IFREG|0755, st_size=940312, ...}) = 0
geteuid() = 500
getegid() = 501
getuid() = 500
getgid() = 501
access("/bin/bash", R_OK) = 0
getpgrp() = 32438
rt_sigaction(SIGCHLD, {0x43e360, [], SA_RESTORER, 0x34e7233140}, {SIG_DFL, [], SA_RESTORER, 0x34e7233140}, 8) = 0
getrlimit(RLIMIT_NPROC, {rlim_cur=1024, rlim_max=62265}) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
fcntl(0, F_GETFL) = 0 (flags O_RDONLY)
fstat(0, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
lseek(0, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0,
Dies ist die Bash-Eingabeaufforderung, in der sie auf Eingaben wartet. Also lass es uns den Befehl geben cd ..
:
read(0, "c", 1) = 1
read(0, "d", 1) = 1
read(0, " ", 1) = 1
read(0, ".", 1) = 1
read(0, ".", 1) = 1
read(0, "\n", 1) = 1
stat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/saml", {st_mode=S_IFDIR|0700, st_size=32768, ...}) = 0
stat("/home/saml/tst", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/saml/tst/90609", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/saml/tst/90609", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
chdir("/home/saml/tst") = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0,
An der obigen Ausgabe können Sie sehen, wo ich den Befehl eingegeben habe cd ..
und die Eingabetaste ( \n
) drücken . Von dort aus können Sie sehen, dass die stat()
Funktion aufgerufen wurde und dass Bash danach an einer anderen read(0..
Eingabeaufforderung sitzt und auf einen anderen Befehl wartet.
strace
ein Programm, das nicht ausgeführt wird, nicht zu einer Ablaufverfolgung führt?