Запуск части Java-программы от имени Root - PullRequest
4 голосов
/ 11 марта 2011

Все,

Я хочу запустить часть моей Java-программы от имени пользователя root.Только одна конкретная функция от имени root.Другая часть программ должна запускаться с правами пользователя, с которыми она была запущена.Я хочу запустить только приведенный ниже код от имени пользователя root, а другой - как есть.Это потому, что я вижу другое поведение для этого кода, когда он работает с привилегиями ROOT.

 try
    {
         addr = Inet6Address.getByName(host);
         isReachable = addr.isReachable(20*1000);
    } catch (UnknownHostException e)

Заранее спасибо

Ответы [ 3 ]

4 голосов
/ 11 марта 2011

У Java-программы нет переносимого способа изменить эффективный идентификатор пользователя;то есть перейти от работы с привилегиями root к другому пользователю.(И даже в C приложение не может переключаться между привилегированным и непривилегированным суетой. Смена привилегий - это улица с односторонним движением.)

Чтение javadoc для InetAddress.isReachable использует различные механизмы в зависимости от привилегии процесса JVM.Однако ни один из двух подходов, используемых isReachable, не гарантированно сработает;например,

  • некоторые брандмауэры могут выборочно блокировать сообщения ICMP ECHO,
  • на целевой машине может не работать служба Echo на порту 7 ... или порт 7 может быть заблокирован брандмауэром.

Таким образом, я бы полностью решил проблему.Просто попробуйте сделать то, что вы действительно пытаетесь сделать , и забудьте об использовании isReachable.Или, если это под вашим контролем, исправьте машины / сети так, чтобы оба механизма работали на машинах, которые вы хотите протестировать.


@ Geek - вы говорите, что не можете тестировать определенные порты, потому что ониможет быть заблокирован. все, что может быть заблокировано, включая ICMP PING, ICMP ECHO и все, что вы можете использовать для проверки доступности хоста.

Есть только одна вещь, которая действительно имеет значение: можете ли вы поговорить с сервисом, который вы фактически собираетесь использовать.И есть только один способ выяснить это: попробуйте использовать его.

Или, если сказать по-другому, проверка наличия хоста не имеет смысла.Хозяева не доступны: специальные услуги.

1 голос
/ 11 марта 2011

Разделение привилегий в JAVA невозможно, поскольку в разных ОС оно работает очень по-разному.

Возможный способ решения вашей проблемы - попытка TCP-соединения. Вы можете поймать IOException, которое будет содержать дополнительную информацию. Это сильно зависит от платформы, поэтому будьте внимательны при их интерпретации.

0 голосов
/ 11 марта 2011

Для запуска частей программы с другими привилегиями вам потребуются JNI и системные вызовы. Проще было бы просто вызвать внешнюю программу с помощью ProcessBuilder или Runtime.exec:

Process p = Runtime.getRuntime().exec(new String[]{"sudo", "ping", "-c", "5", "host"});
int result = p.waitFor();
if(result == 0) {
   // reachable
}
else {
   // unreachable, or some error
}

Для этого потребуется соответствующая запись в файле конфигурации sudoers (а для других систем и / или других версий ping может быть другие параметры).

Но, как говорили другие, достижимость с помощью ping не эквивалентна услуга, которую вы хотите использовать, достижима .

...