Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > like "runas"


Автор: tepkuh 19.5.2008, 13:14
Доброе, Уважаемые.

Я вот тут дня три пытаюся отсерчить гугл и все как то без результатно. У меня такая вот задача:

Есть jre которая запускается с админскими правами (либо root под *никсом либо administrator под виндой) мне надо чтобы моя программа запускала новый поток под правами другого пользователя(а именно пользователь операц. системы oracle) и брала весь энваремент этого(oracle) пользователя. Т.е. аналог "su -" под никсом или "runas" под виндой.
Не мог бы ты подсказать хотя бы направление куда копать?

Автор: AntonSaburov 19.5.2008, 13:52
Так может как раз через sudo и запускать - из командной строки.

Автор: tepkuh 19.5.2008, 14:22
Цитата(AntonSaburov @  19.5.2008,  13:52 Найти цитируемый пост)
Так может как раз через sudo и запускать - из командной строки.

Я думал по поводу этого но это не юзабельно не фига( по двум пунктам
- Мне нужно запускать именно поток под опред. юзером с передачей туда параметров, а не команды вида "ps -ef".
- Как быть под виндой не представляю даже. Там ведь выскочить консоль cmd'шная где надо будет ввесли пароль. А это вроде как не круто.

Вообщем я это решение оставил на самый крайний случай

Автор: LSD 19.5.2008, 14:35
Цитата(tepkuh @  19.5.2008,  15:22 Найти цитируемый пост)
Мне нужно запускать именно поток под опред. юзером с передачей туда параметров, а не команды вида "ps -ef".

А вообще есть ОС которая бы такое позволяла?

Автор: tepkuh 20.5.2008, 08:47
Цитата(LSD @  19.5.2008,  14:35 Найти цитируемый пост)
А вообще есть ОС которая бы такое позволяла?

не много не понял вас. Что значит есть такая ОС? 
- Если вы про команду "ps -ef" то это вывод спика процессов под боьшенством *никс лайк систем
- Если вы про возможность операц. системы работать сразу с несколькими пользоватеялми то это большенство операц. систем от виндовзов НТ4.0 до любыйх *никсов.
- Если вы про мою фразу "запускала новый поток под правами другого пользователя" то я естсественно очепятался так как все потоки работают в рамках одного процесса (соответственно, с общим адресным пространством и привилегиями). Т.е. нужен новый процесс под правами др. польвателя)

Автор: ecologist 20.5.2008, 09:20
Ну так и надо писать - "процесс". А то "поток" - у меня аж голова уехала.

Под Виндой можно javaw запускать. Параметры - ну в конце концов можно в файл записать - хоть 10 метров параметров.

Автор: tepkuh 20.5.2008, 10:19
Нуу... виноват)

Но возникают дальше вопросы как мне дальше то быть. Т.е. мне то нужен в конечном итоге результат отработки метода под заданным юзером и соотвветсвенно его энварементом? 
Это все безобразие так чтоли должно выглядеть:
Runtime.getRuntime().exec(runas /user:Юзер "java any.jsp any.method");
Как мне получить то что отработал метод, что то я с процессами не очень дружу( Мне ведь от него объект надо получить( 

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

Автор: tepkuh 20.5.2008, 11:00
Цитата(ecologist @  20.5.2008,  10:45 Найти цитируемый пост)
Если второй процесс тоже на JAVA - то можно сериализовать.

Пасиба большое, помоему вы мне очень помогли)  

Автор: tepkuh 20.5.2008, 12:42
хотя фиг знает. Не поперло меня с сериализацией. Не сериализуются мои объекты(
Буду думать через сокеты(

ЗЫ. Я же говорил))) Runtime.getRuntime().exec... это попытка выкрутится( чем придумать хорошее решение

Автор: AntonSaburov 20.5.2008, 13:01
Цитата(tepkuh @  20.5.2008,  12:42 Найти цитируемый пост)
Runtime.getRuntime().exec... это попытка выкрутится(

Так другого решения все равно нет - процесс-то отдельный. А как с ним общаться - тут уже вариантов много.
Ну можно попробовать через ProcessBuilder - там всяких возможностей с установкой окружения побольше.

Автор: LSD 20.5.2008, 15:07
Цитата(tepkuh @  20.5.2008,  09:47 Найти цитируемый пост)
Если вы про мою фразу "запускала новый поток под правами другого пользователя" то я естсественно очепятался так как все потоки работают в рамках одного процесса (соответственно, с общим адресным пространством и привилегиями). Т.е. нужен новый процесс под правами др. польвателя)

Именно об этом. И без Runtime.exec() не обойтись. Можно использовать RMI, в данном случае все будет достаточно просто.

Автор: tepkuh 20.5.2008, 15:46
Цитата(LSD @  20.5.2008,  15:07 Найти цитируемый пост)
Можно использовать RMI, в данном случае все будет достаточно просто.

нипалучится(
Вот копи-паси из учибника про RMI:
RMI использует механизм сериализации по умолчанию Java для передачи параметров
методу и возврата значений через сеть. В этой связи все параметры метода и возвращаемые
значения должны иметь описатель Serializable или один из примитивных типов.


А у меня мой один объект не сериалзуется. Часть серилизуется, а часть нет. Не знаю мож не так что то делаю.
У меня вот есть такой код котороя должна работать отдельным процессом под отдельным юзером.
Код

import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;

public class ser_par implements java.io.Serializable {
    Browser browser;
    Shell shell;

    ser_par()
     {
     shell = new Shell();
     browser = new Browser(shell, SWT.NONE);
     shell.setLayout(new FillLayout());
     }
}


И есть другой класс который выполняется из под root'а\administrtor'а:
Код

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class ser 
{

    public static void main(String[] args)

    {
    ser_par rolodex = new ser_par();
      try 
        {
          FileOutputStream fo=new FileOutputStream("rolodata");
          ObjectOutputStream serial=new ObjectOutputStream(fo);
          serial.writeObject(rolodex);
          serial.flush();
        } 
      catch (Exception ex) 
        {
          System.out.println(ex);
        }

    }
}


получаю вот такую вот ошибку:
java.io.NotSerializableException: org.eclipse.swt.browser.Browser

если Серилизация не поперла, то и RMI не должен( Но чуть попозже попробую Надо еще разобратся как он работает) Что то там мудренно очень)

Автор: LSD 20.5.2008, 15:53
1. Что мешает сделать классы сериализуемыми?
2. В любом случае как-то данные передавать придется, хоть в бинарном виде, хоть в текстовом виде (по сокетам ничего другого не передашь). А byte[] и String прекрасно передаются с помощью сериализации.

Автор: tepkuh 20.5.2008, 16:03
Цитата(LSD @  20.5.2008,  15:53 Найти цитируемый пост)
1. Что мешает сделать классы сериализуемыми?

там бабка за дедку ципляется. Делаю класс  org.eclipse.swt.browser.Browser Сериализованным он цепляется дальше к org.eclipse.swt.browser.IE делаю его сериализованным он идет дальше... 
Я не уверен можно ли так вообще делать? Там этих классов... они вообщем все на свет лезут.  И то я могу сделать так лишь по причине того что org.eclipse.swt является опенсорсовым продуктом и я могу просто править там все что хочу. А оказался он бы закрытым... что бы делать тогда?
Если так можно делать я могу по ним пройтись и понаставить у всех классов сериализацию.

Цитата(LSD @  20.5.2008,  15:53 Найти цитируемый пост)
2. В любом случае как-то данные передавать придется, хоть в бинарном виде, хоть в текстовом виде (по сокетам ничего другого не передашь). А byte[] и String прекрасно передаются с помощью сериализации.

у меня они тоже передались хорошо из других классов помощью сериализации, без проблем. А вот с этим классом заглох.

Автор: LSD 20.5.2008, 17:40
Цитата(tepkuh @  20.5.2008,  17:03 Найти цитируемый пост)
там бабка за дедку ципляется. Делаю класс  org.eclipse.swt.browser.Browser Сериализованным он цепляется дальше к org.eclipse.swt.browser.IE делаю его сериализованным он идет дальше... 
Я не уверен можно ли так вообще делать? Там этих классов... они вообщем все на свет лезут.  И то я могу сделать так лишь по причине того что org.eclipse.swt является опенсорсовым продуктом и я могу просто править там все что хочу. А оказался он бы закрытым... что бы делать тогда?
Если так можно делать я могу по ним пройтись и понаставить у всех классов сериализацию.

Ты пытаешься сделать что-то противоестественное. Эклипсовские классы лучше вообще не трогать, там есть куча завязок на JNI и что произойдет при десериализации неизвестно, может и JVM рухнуть.

Что за данные ты пытаешься передать? Зачем тебе Browser?

Автор: tepkuh 21.5.2008, 09:14
Цитата(LSD @  20.5.2008,  17:40 Найти цитируемый пост)
Ты пытаешься сделать что-то противоестественное. Эклипсовские классы лучше вообще не трогать

Я так и подумал)) Куда то вообще в дебри уехал)

Цитата(LSD @  20.5.2008,  17:40 Найти цитируемый пост)
Что за данные ты пытаешься передать?

Грубя говоря DOM объекты. 
Я хотел их всем скопом передать в рутовый процесс(объект Browser), а далее вытащить только нужные мне объекты.(И повставлять в табличку\базу)
Цитата(LSD @  20.5.2008,  17:40 Найти цитируемый пост)
 Зачем тебе Browser?

С рутового процесса поимев объект Browser смогу давать команды этому Браузеру например куда идти(по урлу) определенному браузеру(который в свою очередь запущен под определ. юзером с его энварементом).

Использую org.eclipse.swt.browser использую для того что там реализованны все механизмы работы Интернет-браузера(CSS, javascripts, cookie...) все что умеет браузер умеет swt.


Автор: LSD 21.5.2008, 15:57
Цитата(tepkuh @  21.5.2008,  10:14 Найти цитируемый пост)
С рутового процесса поимев объект Browser смогу давать команды этому Браузеру например куда идти(по урлу) определенному браузеру(который в свою очередь запущен под определ. юзером с его энварементом).

Использую org.eclipse.swt.browser использую для того что там реализованны все механизмы работы Интернет-браузера(CSS, javascripts, cookie...) все что умеет браузер умеет swt.

Ну так тут RMI самое то.
Сделай интрефейс BrowserControl, куда включи методы openUrl(), getElementName(), getElementValue() и т.д. И вызывай их из рутового процесса.

Автор: tepkuh 22.5.2008, 08:20
Да, все заработало. Пасиба тебе большое.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)