Wie kann ich Sie dtrace ausführen, die verfolgt Befehl keine root-Privilegien?
OS X fehlt linux strace
, aber es hat dtrace
was soll so viel besser sein.
Allerdings vermisse ich die Möglichkeit zu tun, einfache Rückverfolgung auf einzelne Befehle. Zum Beispiel auf linux, ich kann schreiben strace -f gcc hello.c
zu caputre alle system-Aufrufe, die gibt mir die Liste der alle die Dateinamen benötigt der compiler um mein Programm zu kompilieren (die ausgezeichnete memoize Skript baut auf diesen trick)
Möchte ich memoize-port auf dem mac, also brauche ich irgendeine Art von strace
. Was ich eigentlich brauche ist die Liste der Dateien gcc
liest und schreibt in das, was ich also brauche, ist mehr von einer truss
. Sicher genug kann ich sagen dtruss -f gcc hello.c
- und etwas der gleichen Funktionalität, aber dann ist der compiler die Ausführung mit root-Privilegien, was natürlich nicht wünschenswert ist (abgesehen von der massiven Sicherheitsrisiko, ein Problem ist, dass die a.out
Datei ist jetzt im Besitz von root 🙂
Dann habe ich versucht dtruss -f sudo -u myusername gcc hello.c
, aber das fühlt sich ein bisschen falsch, und sowieso nicht funktioniert (ich bekomme keine a.out
Datei überhaupt in dieser Zeit, nicht sicher, warum)
Alle, die lange Geschichte, die versucht zu motivieren, meine ursprüngliche Frage: wie bekomme ich dtrace
meinen Befehl mit normalen Benutzerrechten, wie strace
in linux ?
Edit: scheint, dass ich bin nicht die einzige, die sich Fragen, wie dies zu tun: Frage #1204256 ist so ziemlich das gleiche ist wie meins (und hat die gleichen suboptimalen sudo Antwort 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht die Antwort auf deine Frage, aber etwas zu wissen. OpenSolaris hat dieses Problem gelöst (teilweise) mit "Privilegien" - siehe auf dieser Seite. Auch in OpenSolaris, wäre es nicht möglich, einen Benutzer ohne zusätzliche Berechtigungen, um dtruss Ihren eigenen Prozess.
Der Grund ist die Art, wie dtrace funktioniert - es ermöglicht Sonden in den kernel. So dass ein nicht-privilegierter Benutzer zu untersuchen kernel bedeutet, dass der Benutzer tun können, viele unerwünschte Dinge z.B. sniffing anderen Benutzers passwd durch Aktivierung von Sonden in der Tastatur-Treiber!
chmod a+s dtrace
noch, dtrace ist nicht gedacht als ein "unix power-user" - tool, sondern als ein "unix-administrator" - tool. Das ist, warum versuchen die Verwendung von user-Programmen führt zu einer solchen eine erfundene situation. Vielen Dank für deine Antwort.Der einfachste Weg ist die Verwendung von sudo:
Andere Lösung wäre, den debugger starten, erste und monitor für die neuen spezifischen Prozesse.
E. g.
Dann in einem anderen Terminal einfach ein:
Einfach.
Komplizierter Argumente finden Sie im Handbuch:
man dtruss
Alternativ können Sie dtruss zu den Laufenden user-Prozesse z.B. auf dem Mac:
oder ähnlich auf Linux/Unix mithilfe von strace:
Anderen hacky trick sein könnte, um den Befehl auszuführen und gleich danach an den Prozess Anhängen. Hier sind einige Beispiele:
Hinweis:
ersten sudo ist nur für das caching, das Passwort beim ersten mal laufen,
dieser trick funktioniert nicht für schnelle Befehlszeilen wie
ls, date
wie es einige Zeit dauert, bis debugger an den Prozess Anhängen,geben Sie den Befehl in zwei Orten,
können Sie ignorieren
&
ausführen des Prozesses in den hintergrund, wenn es bereits tun,nach Beendigung Debuggen, müssen Sie manuell löschen Sie die hintergrund-Prozess (z.B.
killall -v tail
)-n
option für dtruss. Das ist 100% die richtige Antwort.Den
-n
argumentdtruss
verursachen dtruss warten und prüfen Prozesse, die mit dem argument-n
. Die-f
option wird noch Folgen Prozesse entstanden aus den Prozessen angepasst durch-n
.All dies bedeutet, dass, wenn Sie wollen dtruss ein Prozess (aus Gründen der argument, lassen Sie uns sagen, es ist
whoami
) laufen als Ihre nicht privilegierten Benutzer, gehen Sie folgendermaßen vor:dtruss -fn whoami
whoami
Diese Antwort kopiert den letzten Teil von @kenorb die Antwort, aber es verdient eine erstklassige Antwort.
Ich weiß nicht, ob Sie bekommen können dtruss zu sein als nicht-invasive wie strace.
Eine Variante von "sudo [root] dtruss sudo [zurück zum nonroot] cmd", das scheint zu funktionieren besser in einigen schnellen Tests für mich ist:
Den äußeren sudo ist natürlich so dtruss als root läuft.
Die innere su ist wieder zu mir zurück, und mit -l erstellt die Umgebung richtig, an dem Punkt müssen wir die cd zurück, wo wir angefangen haben.
Denke ich "su -l "user" ist besser als "sudo -u user", wenn Sie wollen, dass die Umwelt das zu sein, was, der user bekommt normalerweise. Dass Sie Ihre login-Umgebung, obwohl, ich weiß nicht, ob es eine gute Möglichkeit, lassen die Umwelt Erben, die durch die zwei Benutzer änderungen statt.
In Ihrer Frage, eine weitere Beschwerde, die Sie hatte über den "sudo dtruss sudo" Abhilfe, andere als hässlich war, dass "ich bekomme nicht ein.aus Datei in all dieser Zeit, nicht sicher, warum". Ich weiß nicht warum, aber in meinem kleinen test-script, ein "sudo dtruss sudo" - Variante auch nicht zu schreiben, um eine test-Ausgabe-Datei, und das "sudo dtruss su" - Variante oben hast, erstellen Sie die Ausgabe-Datei.
strace
Befehle aus einer makefile-Ersatz-Skript, um Spion auf welche Dateien wurden berührt durch die Befehle. Ich wollte an diesen port Skripten auf mac os x, aber am Ende des Tages merke ich, dass ich nicht wie die Idee des habens alle meine builds, bei denen mehrere Ebenen von sudo einfach zu spy auf meine eigenen Befehle.Scheint es, dass OS X unterstützt nicht die Verwendung von dtrace zu replizieren alle Funktionen von strace, die Sie benötigen. Jedoch, ich würde vorschlagen, Sie versuchen zu erstellen einen wrapper um die passenden syscalls. Es sieht aus wie DYLD_INSERT_LIBRARIES die Umgebungsvariable ist, die Sie wollen zu hacken ein bisschen. Das ist im Grunde das gleiche wie
LD_PRELOAD
für Linux.Entsprechend der Beispiel von Tom Robinson stellen Sie
DYLD_FORCE_FLAT_NAMESPACE=1
auch.Kopie der original-Beispiel (
lib_overrides.c
), der überschreibt nurfopen
:Verwendung:
Disclaimer: dies ist abgeleitet von @kenorb ist Antwort. Es hat einige Vorteile aber: PID ist spezifischer als execname. Und wir können ein kurzlebiger Prozess warten, DTrace, bevor es beginnt.
Dies ist ein bisschen race-conditiony, aber...
Sagen wir, wir möchten zu verfolgen
cat /etc/hosts
:Verwenden wir
sudo true
um sicherzustellen, dass wir klar sudo-s Passwort eingeben, bevor wir starten, läuft alles zeitkritisch.Starten wir einen hintergrund-Prozess ("warten 1 sec, dann tun Sie etwas Interessantes"). Mittlerweile, beginnen wir mit DTrace. Wir haben erfasst den hintergrund-Prozess der PID in
$!
, so dass wir passieren können, dass auf DTrace als arg.Den
kill $!
läuft nach dem schließen wir DTrace. Es ist nicht notwendig für unserecat
Beispiel (Prozess schließt auf seine eigenen), aber es hilft uns end lange im hintergrund Laufenden Prozesse wieping
. Vorbei-p $!
zu DTrace ist der bevorzugte Weg, dies zu tun, aber auf macOS offenbar erfordert eine code-signierte ausführbare.Die andere Sache, die Sie tun können ist, führen Sie den Befehl in eine separate Schale und snoop, die shell. Siehe meine Antwort.
Ich weiß nicht, einen Weg zu laufen, was Sie wollen, wie ein normaler user, wie es scheint, dass dtruss, die verwendet dtrace benötigt su-Rechte.
Aber ich glaube, der Befehl, den Sie gesucht haben, anstatt
dtruss -f sudo -u myusername gcc hello.c
ist
sudo dtruss -f gcc hello.c
Im Anschluss an die Eingabe Ihres Passworts, dtruss wird, führen Sie dtrace wird sudo-Berechtigungen, und Sie werden die trace-als auch die eine.aus Datei.
Sorry, ich konnte nicht weiter helfen.
strace
im Gegenteil, ist fast durchsichtig in Bezug auf funktionale Verhalten der verfolgt Befehl.