27

サーバー アプリケーションを Eclipse から実行しようとすると、エラーが発生します。エラーはjava.net.BindException: Permission deniedです。これは、ポート 443 を使用して SSL 接続をセットアップしているためだと思います。java と sudo を使用してコマンド ラインでコードを実行すると、この問題を回避できます。実行ボタンを押すとアプリケーションが sudo で実行されるように Eclipse をセットアップする方法はありますか?

4

9 に答える 9

16

次の手順に従って、スーパーユーザーとしてアプリケーションをコンパイル/デバッグできます。

  1. Java アプリケーションの名前を変更します

    sudo mv /usr/lib/jvm/java-6-openjdk/jre/bin/java /usr/lib/jvm/java-6-openjdk/jre/bin/java.ori

  2. 次のスクリプトを作成し、/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. 権限を変更して実行可能にします

    sudo chmod 0755 /usr/lib/jvm/java-6-openjdk/jre/bin/java

  4. 起動日食

  5. [ウィンドウ] -> [設定] -> [Java] -> [インストール済みの JRE] に移動します。
  6. java-6-openjdk を java-6-openjdk-root に複製します
  7. JRE を編集し、デフォルトの VM 引数として「--run-as-root」を追加します

プロジェクトをルートとして実行するには、次の手順に従う必要があります。

  1. [プロジェクト] -> [プロパティ] -> [Java ビルド パス] に移動します。
  2. JRE System Library をダブルクリックし、代替 JRE で「java-6-openjdk-root」を選択します。

注:アイデアはhttp://www.eclipse.org/forums/index.php/mv/msg/87353/724852/#msg_724852からのものです

于 2012-04-02T15:18:26.213 に答える
2

Linux (*nix) を使用していると仮定すると、sudo コマンドを使用して Eclipse セッションを開始するのはどうですか?

そのような

sudo ~/eclipse/eclipse

今、あなたが日食から何をしても、sudoコンテキストがありますか?

于 2010-04-05T19:18:35.217 に答える
1

おそらく、これがニーズを満たし、可能であれば、より良い答えは、ルーターの単純なポートリダイレクトである可能性があります.

Linux/Unix に予約済みのポートを強制的に開かせる代わりに、これを開発しているだけで (インストールはしていません)、デバッガーで実行したい場合は、ルーターを設定して着信 (外部) ポート 443 をポートにリダイレクトします。これは、現在のニーズにとってより便利です (4443 など)。

ほとんどのルーターがこれをサポートしていると思いますが、あなたのルーターがサポートしていない場合は、お母さんへのクリスマスや誕生日のプレゼントに最適です。

于 2011-12-10T04:39:24.370 に答える
1

別のオプションは、iptables または ipfilter を使用してポート 80 を 1024 より上のポートに転送することです。

(誰かが実用的でわかりやすい説明へのリンクを提供できますか?)

于 2010-04-05T22:59:13.240 に答える
1

このスレッドで述べたように:

Unix/Linux システムで 1024 未満のポートを開くには、「root」になる必要があります。

リッスンポートを変更する引数も使用しました-Dorg.eclipse.equinox.http.jetty.port=8080が、これは無視されているようです(スタックトレースによると)

「 」を使用してください-Dorg.osgi.service.http.port=8080


HTTP サービスで述べたように:

  • org.osgi.service.http.port- http サービスに使用するポート番号を指定します。OSGi 仕様に従って、このプロパティのデフォルト値は 80 (ルート権限が必要) です。

  • org.osgi.service.http.port.secure- 安全な http サービングに使用するポート番号を指定します。OSGi 仕様に従って、このプロパティのデフォルト値は 443 (ルート権限が必要) です。

最後のプロパティを 1024 を超える値に変更しようとすると、特別な特権を必要とせずに機能する可能性があります。

于 2010-04-05T20:05:41.500 に答える
1

私はJavaではなくCを書いていますが、これはどちらの場合でも機能するはずです。私はリモート デバッグを使用します。接続先のユーザーを指定できる LOCALHOST への「リモート」接続を定義し、ROOT を指定します。次に、デバッグ構成接続でリモート アプリケーションを定義します: LOCALHOST。メインタブの下部と接続プロパティウィンドウの下にある「ターゲットパスへのダウンロードをスキップする」を必ずチェックしてください。

于 2012-02-06T16:01:11.633 に答える
0

外部ツール (実行メニュー/外部ツール、またはツールバーの実行/デバッグ アイコンの横にあるアイコン) を使用する場合は、任意のスクリプトまたは好きなものを使用できます。スクリプトは、昇格された権限などを与える場合があります。

一方、この方法では、実行コマンドもデバッグ コマンドもこの外部ツール構成に関連付けられないため、アプリケーションのデバッグが非常に難しくなる可能性があります。アプリケーションの Eclipse デバッガーを接続することは可能かもしれませんが、それがどのように可能かはわかりません。

于 2010-04-05T19:09:35.513 に答える
0

あなたはこの道を行くかもしれません

  1. javac 呼び出しで Makefile を作成する
  2. 次の行を追加します。
setcap 'cap_net_admin=+ep' Server
  1. sudo を構成して、Eclipse ユーザーが setcap を実行できるようにします。

したがって、透過的なデバッグが行われます (sudo ラッパーなし - gdb は問題ありません)。短所: ローカルのセキュリティ違反です。

解決:

これを /opt/my-stupid-eclipse に入れます

#!/ビン/sh

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

このスクリプトを chmod +x し、sudo config でホワイトリストに登録します。

ユーザー名 ALL=(ALL) NOPASSWD: /opt/my-stupid-eclipse

これをメイクファイルに追加し、Server バイナリへのパスを指定します。

これで、他のユーザーが変更できない、かなり奇妙ですが安全なスクリプトが作成されました...サーバーバイナリを悪意のあるコードに置き換えると、キャップが取得されるため、ファイル名のチェック/制限は役に立ちません.. can $1 bashコマンドで汚染されていますか?いいえ、そうではありません。

于 2010-11-17T01:02:40.423 に答える