web-dev-qa-db-fra.com

Comment exécuter mon application en tant que superutilisateur depuis Eclipse?

Je rencontre une erreur lorsque j'essaie d'exécuter mon application serveur à partir d'Eclipse. L'erreur est Java.net.BindException: autorisation refusée. Je pense que c'est parce que j'utilise le port 443 pour configurer une connexion SSL. Je peux contourner ce problème si j'exécute mon code sur la ligne de commande en utilisant Java et Sudo. Existe-t-il un moyen de configurer Eclipse de sorte que lorsque je clique sur le bouton Exécuter, mon application soit exécutée avec sudo?

25
Ronald

Vous pouvez suivre ces étapes pour compiler/déboguer des applications en tant que superutilisateur.

  1. Renommez votre application Java

    Sudo mv/usr/lib/jvm/Java-6-openjdk/jre/bin/Java /usr/lib/jvm/Java-6-openjdk/jre/bin/Java.ori

  2. Créez le script suivant et stockez-le sous/usr/lib/jvm/Java-6-openjdk/jre/bin/Java

    #!/bin/bash
    # file:  /usr/lib/jvm/Java-6-openjdk/jre/bin/Java
    # descr: Starter for jdk. Runs jdk as root when 
    #        cmd-line-arg "--run-as-root" is specified.
    #
    jre="/usr/lib/jvm/Java-6-openjdk/jre/bin/Java.ori"
    run_as_root=false
    args=
    
    # Filter command-line argument
    for arg in "$@"
    do
      case "$arg" in
      --run-as-root)  run_as_root=true
                      ;;
      *)              args="$args $arg"
                      ;;
    
      esac
    done
    
    # Remove leading whitespaces
    args=$(echo $args | sed -e 's/^[ \t]*//')
    
    if $run_as_root
    then
      echo "WARNING: Running as root!"
      gksu "$jre $args"
    else
      $jre $args
    fi
    
  3. Modifiez les autorisations pour le rendre exécutable

    Sudo chmod 0755/usr/lib/jvm/Java-6-openjdk/jre/bin/Java

  4. Démarrage Eclipse

  5. Allez dans Fenêtre-> Préférences-> Java-> JRE installés
  6. Dupliquer Java-6-openjdk vers Java-6-openjdk-root
  7. Modifier JRE et ajouter "--run-as-root" comme valeur par défaut VM Argument

Pour exécuter des projets en tant que root, vous devez suivre ces étapes:

  1. Allez dans Projet-> Propriétés-> Chemin de génération Java
  2. Double-cliquez sur la bibliothèque système JRE et choisissez dans JRE alternatif "Java-6-openjdk-root"

Remarque: L'idée vient de http://www.Eclipse.org/forums/index.php/mv/msg/87353/724852/#msg_724852

15
rednammoc

J'écris C pas Java mais cela devrait fonctionner dans les deux cas. J'utilise le débogage à distance - définissez une connexion "distante" à LOCALHOST qui vous permet de spécifier l'utilisateur avec lequel vous vous connecterez, spécifiez ROOT . Ensuite, définissez une application distante dans la connexion de configuration de débogage: LOCALHOST. Assurez-vous de cocher "Ignorer le téléchargement vers le chemin cible" en bas de l'onglet principal ainsi que sous la fenêtre des propriétés de connexion.

1
Eric Spencer

Une meilleure réponse, peut-être, si cela répond à vos besoins ET est possible, pourrait être une simple redirection de port sur votre routeur.

Au lieu d'essayer de forcer votre Linux/Unix à ouvrir un port réservé, lorsque vous ne le développez que maintenant (pas à installer) et que vous souhaitez l'exécuter dans un débogueur, configurez votre routeur pour rediriger le port 443 entrant (externe) vers un port c'est plus pratique pour vos besoins actuels (par exemple 4443).

Je pense que la plupart des routeurs prennent en charge cela, et si le vôtre ne le fait pas, cela donne à votre maman une bonne idée de cadeau de Noël ou d'anniversaire!

1
Sean

En supposant que vous êtes sous Linux (* nix), que diriez-vous de démarrer votre session Eclipse via une commande Sudo?

Tel que

Sudo ~/Eclipse/eclipse

Maintenant, quoi que vous fassiez avec Eclipse aura le contexte Sudo?

1
ring bearer

Comme mentionné dans ce fil :

Pour ouvrir un port inférieur à 1024 sur les systèmes Unix/Linux, vous devez être "root".

J'ai également utilisé l'argument -Dorg.Eclipse.equinox.http.jetty.port=8080 pour changer le port d'écoute, mais cela semble ignoré (selon le stacktrace)

Veuillez utiliser "-Dorg.osgi.service.http.port=8080 ".


Comme mentionné dans Service HTTP :

  • org.osgi.service.http.port - spécifie le numéro de port à utiliser pour le service http. La valeur par défaut de cette propriété est 80 (qui nécessite l'autorisation root), conformément à la spécification OSGi.

  • org.osgi.service.http.port.secure - spécifie le numéro de port à utiliser pour le service http sécurisé. La valeur par défaut de cette propriété est 443 (ce qui nécessite l'autorisation root), selon la spécification OSGi.

Peut-être que si vous essayez de modifier cette dernière propriété à une valeur supérieure à 1024, cela pourrait fonctionner sans nécessiter de privilège spécial.

1
VonC

Une autre option serait d'utiliser iptables ou ipfilter pour transférer le port 80 vers un port supérieur à 1024.

(Quelqu'un peut-il fournir un lien vers une explication pratique et facile à comprendre?)

1
Stephen C

Si vous utilisez des outils externes (menu Exécuter/Outils externes ou une icône à côté des icônes Exécuter/Déboguer dans la barre d'outils), vous pouvez utiliser n'importe quel script ou ce que vous voulez. Les scripts peuvent vous donner des droits élevés, ou quoi que ce soit.

D'un autre côté, cette façon de déboguer l'application peut devenir très difficile, car ni les commandes Exécuter ni Déboguer ne sont associées à cette configuration d'outil externe. Il est peut-être possible de connecter le débogueur Eclipse de l'application, mais je ne sais pas comment cela est possible.

0
Zoltán Ujhelyi

Vous pouvez utiliser le mécanisme Remote Java Application pour cela.

  1. Créer Configuration de débogage pour Remote Java dans Exécuter -> Configurations de débogage ...
  2. Définissez le nom de votre projet
  3. Choisissez Type de connexion as Standard (Socket Attach)
  4. Configurez Propriétés de connexion paramètres pour votre liaison (pour vous, ce sera localhost et 443 ).
  5. Définissez le point d'arrêt dans votre application (par exemple au début de la méthode principale )
  6. Exécutez votre application à partir du terminal en tant que superutilisateur avec les paramètres suivants: -Java Xdebug -Xrunjdwp: transport = dt_socket, server = y, address = 443 MyApp
  7. Appuyez sur le bouton de débogage dans Eclipse pour les premières créations Remote Java Application
  8. Votre code doit être arrêté sur le point d'arrêt dans Eclipse!
0
Michael Z

Vous pouvez suivre cette voie

  1. créer un Makefile avec des appels javac
  2. ajoutez la ligne suivante:
setcap 'cap_net_admin=+ep' Server
  1. configurez Sudo pour permettre à votre utilisateur Eclipse d'exécuter setcap.

Vous aurez donc un débogage transparent (pas de wrapper Sudo - gdb ok). Inconvénients: c'est une faille de sécurité locale.

Solution:

mettez ceci dans/opt/my-stupid-Eclipse

#!/bin/sh

setcap 'cap_net_admin = + ep cap_net_raw = + ep' $ 1

chmod + x ce script et mettez-le en liste blanche sur Sudo config.

nom d'utilisateur ALL = (ALL) NOPASSWD:/opt/my-stupid-Eclipse

Ajoutez-le à votre makefile, spécifiez le chemin vers votre binaire Server.

Maintenant, vous avez un script assez étrange mais sécurisé, qui ne peut pas être modifié par d'autres utilisateurs ... et encore une petite brèche pour remplacer le binaire du serveur par un code malveillant, qui gagnera des majuscules, donc aucune vérification de nom de fichier/stricts n'aidera .. peut $ 1 être contaminé par des commandes bash, non? Je suppose que non.

0
kagali-san