8
votes

Linux: Processus de suspension au démarrage

Je souhaiterais apparaître un processus suspendu, éventuellement dans le contexte d'un autre utilisateur (par exemple via sudo -u ...), configurez certaines règles d'IPTABLES pour le processus de génie, continuez à exécuter le processus et supprimez les règles IPTABLES. lorsque le processus existe.

Y a-t-il des moyens standard (bash, corutils, etc.) qui me permet d'atteindre ce qui précède? En particulier, comment puis-je apparaître un processus dans un état suspendu et obtenir son PID?


6 commentaires

Pourquoi avez-vous besoin de démarrer le processus avant de configurer l'environnement? Cela sonne comme une utilisation typique de Fork / Exec Combo.


Je dois m'assurer que toute la communication traverse mes IPTables personnalisées.


@Let_me_be Parce que les IPTABLES doivent connaître le PID à fonctionner dans ce cas


@hanshans tu n'as pas répondu à ma question. Je demande pourquoi vous devez démarrer le processus avant de la configurer. Le processus normal est de configurer l'environnement, puis de démarrer le processus. Cela semble juste bizarre.


@Robin Eh bien, c'est toujours un scénario de Fork / Exec normal. Mais peu importe, je manque évidemment le point.


Y a-t-il une magie Bash pour mettre en œuvre un scénario de Fork / Exec?


5 Réponses :


0
votes

Un moyen de le faire est d'enrôler gdb pour mettre en pause le programme au début de sa fonction principale (à l'aide de la commande "Pause principale"). Cela garantira que le processus est suspendu suffisamment rapidement (bien que certaines routines d'initialisation puissent exécuter avant principal , ils ne feront probablement rien de pertinent). Cependant, pour cela, vous aurez besoin d'informations de débogage pour le programme que vous souhaitez démarrer suspendus.

Je vous suggère d'essayer cela manuellement d'abord, voyez comment cela fonctionne, puis de déterminer comment script ce que vous avez fait.

Alternativement, il peut être possible de contraindre le processus (si c'est en fait ce que vous essayez de faire!) sans à l'aide d'IPTABLES, à la place de SELINUX ou d'un outil basé sur PTRACE comme SYDBOX.


3 commentaires

Non, cela ne fonctionnera pas. J'ai besoin d'un outil générique qui fonctionne avec n'importe quelle application.


Qu'en est-il de Selinux ou SydBox? (Je vois maintenant que j'aurais dû faire cette partie de ma réponse dans une réponse distincte.)


SELINUX semble être surchargé pour ce que je veux faire (que Debian 6 aide-t-il même cela), mais je vais essayer de regarder dans Sydbox



0
votes

Vous avez probablement besoin du pid d'un programme que vous démarrez, avant ce programme commence réellement à exécuter. Vous pouvez le faire comme ça.

  • Démarrer un script simple
  • forcer le script à attendre
    • Vous pouvez probablement utiliser Suspendre < / Strong> qui est une builitine Bash mais dans le pire des cas, vous pouvez le faire s'arrêter avec un signal
    • Utilisez le PID du processus de bash de toutes les manières que vous voulez
    • redémarrez le processus Bash arrêté ( SIGCONT ) et faites un exec - une autre intégrée - Démarrage de votre processus réel ( il héritera du PID )

0 commentaires

0
votes

Je suppose que vous pouviez écrire vous-même d'écrire vous-même des fourches et où l'enfant de la fourche suspend juste avant de faire un EXEC. Sinon, envisagez d'utiliser une LD_PRELOAD lib liber pour faire votre activité "personnalisée".

Si vous vous souciez de le faire en sécurité, vous devriez probablement regarder des pistolets plus gros (avec chroot, peut-être paravirtualiser, mode utilisateur Linux, etc.);

Dernier conseil: Si cela ne vous dérange pas de faire plus de codage, l'interface PTRACE devrait vous permettre de faire ce que vous décrivez (puisqu'il est utilisé pour mettre en œuvre des debuggers avec)


0 commentaires

3
votes

Vous pouvez écrire une wrapper C pour votre programme qui fera quelque chose comme ceci:

  1. Fourchette code> et imprimez enfant pid. Li>
  2. chez l'enfant, attendez que l'utilisateur appuie sur ENTER. Cela met l'enfant au sommeil et vous pouvez ajouter les règles avec le PID. LI>
  3. Une fois que des règles sont ajoutées, l'utilisateur appuie sur Entrée. L'enfant dirige votre programme d'origine, soit en utilisant exécutant code> ou système code>. Li> ol>

    Est-ce que cela fonctionnera? P>

    EDIT: En fait, vous pouvez faire la procédure ci-dessus avec un script shell. Essayez de suivre le script Bash: P>

    #!/bin/bash
    
    echo "Pid is $$"
    echo -n "Press Enter.." 
    read 
    exec $@
    


0 commentaires

5
votes

écrire un script wrapper start-stopped.sh code> comme ceci: xxx pré>

puis appelez-le comme: p>

setup_iptables_and_start mycommand || report errors
teardown_iptables


0 commentaires