64 votes

Comment obtenir dtrace pour exécuter la commande tracée avec des privilèges non root?

OS X manque de linux strace, mais il a dtrace qui est censé être tellement mieux.

Cependant, je manque de la capacité à faire simple le suivi sur les commandes individuelles. Par exemple, sur linux, je peux écrire strace -f gcc hello.c de caputre tous les appels système, ce qui me donne la liste de tous les fichiers requis par le compilateur pour compiler mon programme (l'excellent memoize script est construit sur ce truc)

Je tiens à port memoize sur le mac, j'ai donc besoin d'une sorte d' strace. Ce que j'ai réellement besoin est la liste de fichiers gcc lectures et écritures dans, donc ce que j'ai besoin est de plus d'un truss. Bien sûr je peux dire dtruss -f gcc hello.c et d'obtenir un peu de la même fonctionnalité, mais alors le compilateur est exécuté avec des privilèges root, ce qui n'est évidemment pas souhaitable (en dehors de l'énorme risque de sécurité, un problème est que l' a.out le fichier est maintenant détenue par la racine :-)

J'ai ensuite essayé dtruss -f sudo -u myusername gcc hello.c, mais cela se sent un peu mal, et ne fonctionne pas de toute façon (je n'ai pas de a.out le fichier à tout ce temps, ne sais pas pourquoi)

Toute cette longue histoire essaie de motiver ma question initiale: comment puis-je obtenir de l' dtrace pour exécuter ma commande avec la normale de l'utilisateur des privilèges, tout comme strace n'en linux ?

Edit: il semble que je ne suis pas le seul à se demander comment faire ceci: question #1204256 est à peu près la même que la mienne (et qui a le même sous-optimale sudo réponse :-)

58voto

kenorb Points 2464

Le plus simple est d'utiliser sudo:

sudo dtruss -f sudo -u $USER whoami

Une autre solution serait d'exécuter le débogueur premier et le moniteur pour les nouveaux processus spécifiques. E. g.

sudo dtruss -fn whoami

Puis dans un autre Terminal, exécutez simplement:

whoami

Simple que cela.

Plus délicate que les arguments que vous pouvez trouver dans le manuel:" man dtruss


Sinon, vous pouvez joindre dtruss à l'exécution d'un processus utilisateur, par exemple sur Mac:

sudo dtruss -fp PID

ou similaires sur Linux/Unix à l'aide de strace:

sudo strace -fp PID

Un autre hacky truc qui pourrait être de l'exécution de la commande et tout de suite après la joindre au processus. Voici quelques exemples:

sudo true; (./Pages &); sudo dtruss -fp `pgrep -n -x Pages`
sudo true; (sleep 1 &); sudo dtruss -fp `pgrep -n -x sleep`
sudo true; (tail -f /var/log/system.log &); sudo dtruss -fp `pgrep -n -x tail`

Note:

  • première sudo est juste pour la mise en cache du mot de passe lors de la première heure de course,

  • cette astuce ne fonctionne pas pour la commande rapide, des lignes comme celles - ls, date car il faut un certain temps jusqu'à ce débogueur se joindre au processus,

  • vous devez taper votre commande en deux endroits,

  • vous pouvez ignorer & pour exécuter le processus à l'arrière-plan, si c'est déjà ce que,

  • après avoir terminé le débogage, vous devrez supprimer manuellement les processus d'arrière-plan (par exemple, killall -v tail)

9voto

wfaulk Points 430

L' -n argument dtruss entraînera dtruss d'attendre et d'examiner les processus qui correspondent à l'argument d' -n. L' -f option fonctionne toujours à suivre les processus lancés par le processus appariés en -n.

Tout cela signifie que si vous voulez dtruss un processus (pour la clarté de l'exposé, disons que c'est l' whoami) en cours d'exécution comme le votre sans privilège d'utilisateur, procédez comme suit:

  1. Ouvrez un shell root
  2. Exécutez dtruss -fn whoami
    • cela permettra de s'asseoir et d'attendre pour un processus nommé "whoami" d'exister
  3. Ouvrez un shell sans privilège
  4. Exécutez whoami
    • cela permettra d'exécuter et de quitter normalement
  5. Observer la trace d'appel système dans dtruss fenêtre
    • dtruss ne sera pas de sortie sur son propre, il continuera d'attente pour la correspondance des processus afin de l'interrompre lorsque vous avez terminé

Cette réponse doublons la dernière partie de @kenorb de la réponse, mais elle a le mérite d'être un premier de la classe de réponse.

5voto

metamatt Points 3276

Je ne sais pas si vous pouvez obtenir dtruss d'être non invasive, que strace.

Une variante de la "sudo [racine] dtruss sudo [retour à la nonroot] cmd" qui semble mieux fonctionner dans certains test rapide pour moi, c'est:

sudo dtruss -f su -l `whoami` cd `pwd` && cmd....

L'extérieur sudo est donc dtruss s'exécute en tant que root.

L'intérieure de la ligue est de retour pour moi, et avec-l-il recrée l'environnement correctement, à quel point nous avons besoin de cd de retour là où nous avons commencé.

Je pense que "su -l utilisateur" est mieux que "sudo -u utilisateur" si vous voulez de l'environnement à être ce que l'utilisateur obtient normalement. Ce sera leur connexion à l'environnement; je ne sais pas si il y a un bon moyen de faire de l'environnement hériter à travers les deux modifications de l'utilisateur à la place.

Dans votre question, une autre plainte que vous avez eu sur le "sudo dtruss sudo" solution de contournement, autres que la laideur, c'était que "je n'ai pas une.fichier à tout ce temps, ne sais pas pourquoi". Je ne sais pas pourquoi, mais mon petit script de test, un "sudo dtruss sudo" variante a également omis d'écrire dans un test du fichier de sortie, et le "sudo dtruss su" variante ci-dessus n'créer le fichier de sortie.

5voto

netcharmer Points 344

Pas de réponse à votre question, mais quelque chose à savoir. OpenSolaris résolu ce problème (en partie) avec des "privilèges" - voir cette page. Même dans OpenSolaris, il ne serait pas possible de permettre à un utilisateur, sans aucun droit à des privilèges supplémentaires, à dtruss leur propre processus. La raison est la façon de dtrace fonctionne - il permet à des sondes dans le noyau. Afin de permettre à un utilisateur non privilégié pour sonder le noyau signifie que l'utilisateur peut faire beaucoup de choses indésirables par exemple, en reniflant d'un autre utilisateur passwd par l'activation des sondes dans le pilote de clavier!

1voto

aqua Points 2014

Je ne connais pas de moyen d'exécuter ce que vous voulez en tant qu'utilisateur normal, car il semble que dtruss, qui utilise dtrace, nécessite des privilèges su.

Cependant, je crois que la commande que vous cherchiez au lieu de

dtruss -f sudo -u myusername gcc hello.c

est

sudo dtruss -f gcc hello.c

Après avoir tapé votre mot de passe, dtruss exécutera les privilèges dtrace will sudo, et vous obtiendrez la trace ainsi que le fichier a.out.

Désolé, je n'ai pas pu vous aider davantage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X