2009-06-18 32 views
13

से अलग उपयोगकर्ता के रूप में यूनिक्स कमांड चला रहा है, एक यूनिक्स कमांड को एक अलग यूनिक्स उपयोगकर्ता के रूप में चलाने में सक्षम जावा प्रोग्राम लिखने का प्रयास कर रहा है। मेरे पास उपयोगकर्ता का पासवर्ड है, और मुझे वह आदेश पता है जिसे मैं चलाने के लिए चाहता हूं, लेकिन कमांड को उस उपयोगकर्ता के रूप में चलाने के लिए है - इसलिए मुझे पहले उस उपयोगकर्ता के रूप में लॉगिन करना होगा।जावा

उदाहरण के लिए: कहें कि हमारे पास एक उपयोगकर्ता है, जिम, जो बॉब की होम निर्देशिका में क्या देखना चाहता है, और (किसी भी कारण से) जिम के पास एलएस निष्पादित करने की पहुंच है जबकि बॉब नहीं है। हम वर्तमान में बॉब के रूप में लॉग इन हैं। यहां हम क्या कर सकते हैं:

[email protected]$ su jim && ls ~bob 

समस्या यह है कि हमें जिम के पासवर्ड के लिए संकेत मिलता है। इस के बाद से, एक जावा प्रोग्राम से चलाया जाता है अर्थात

Process p = Runtime.getRuntime().exec("su jim && ls ~bob"); 

हम जिम की पासवर्ड के लिए संकेत और काट दिया मिलता है। हम जिम के पासवर्ड जानते हैं। हालांकि, मैं इसे दर्ज नहीं कर सकता।

इसके अतिरिक्त, हम एक अपेक्षित स्क्रिप्ट का उपयोग नहीं कर सकते हैं (इसे इंस्टॉल नहीं किया है) और हम सुपरसियर नहीं बन सकते हैं। मैं भी SSH का उपयोग कर इस प्रयास करने के लिए में देखा, क्योंकि हम तकनीकी रूप से

[email protected]$ ssh [email protected] "ls ~bob" 

कर सकता है, लेकिन यह भी के बाद से मैं सेटअप passwordless SSH करने के लिए अनुमति नहीं है काम नहीं करता।

मेरा आखिरी प्रयास प्रयास जावा के लिए एक एसएसएच लाइब्रेरी का प्रयास और उपयोग करना है, क्योंकि पासवर्ड जावा प्रोग्राम के लिए उपलब्ध है और मैं इसके साथ लॉगिन करने में सक्षम हूं (और उचित आदेश निष्पादित करता हूं)। लेकिन चूंकि मैं एक ही मेजबान पर दौड़ने जा रहा हूं, ऐसा लगता है कि यह अधिक है।

कोई सुझाव?

पीएस: जावा संस्करण 1.4.2, अपग्रेड नहीं कर सकता; ऐक्स यूनिक्स 5.3।

+0

क्या आप किसी तृतीय पक्ष लाइब्रेरी का उपयोग किए बिना वर्कअराउंड ढूंढने में सक्षम थे, यदि आप कृपया साझा कर सकते हैं? – HyperioN

उत्तर

6

समस्या हल हो गई। ज्ञात JSCH (http://www.jcraft.com/jsch/) एसएसएच को ज्ञात उपयोगकर्ता नाम और पासवर्ड के साथ सर्वर में, और कमांड निष्पादित करें। आपके सुझावों के लिए सभी को धन्यवाद!

+0

है कृपया यहां एक उदाहरण जोड़ें। – vijendra

7

सुडो स्थापित है, क्या उपयोगकर्ता प्रश्न में कमांड के लिए/etc/sudoers में दर्ज जावा प्रोग्राम चला रहा है, और sudo -u jim ls ~bob का उपयोग करें।

+0

यह एक समाधान नहीं है। दुर्भाग्यवश, मैं किसी भी तरह से सिस्टम को संशोधित नहीं कर सकता - सुडो स्थापित करने सहित। –

+2

आपको मेजबान स्विच करने की आवश्यकता है। –

+0

एंड्रयू के साथ सहमत हैं। यदि आपका होस्ट आपको पब्की एसएसएच की तरह सामान की अनुमति नहीं देता है, और आपको "सुडो" भी इंस्टॉल नहीं किया जा सकता है, तो संभावना है कि आप अपनी "सु" योजना के संबंध में कुछ भी कर सकते हैं, जबकि संभवतः आपके होस्टर द्वारा इसकी अनुमति नहीं है या तो, और आप परेशानी के लिए बाध्य हैं। सूडो को अनुमति देने वाला एक होस्टर ढूंढें, यह केवल एकमात्र समझदार समाधान के बारे में है। – DevSolar

0

संभावित रूप से उम्मीद का जावा कार्यान्वयन? ExpectJ गूंजते समय आता है लेकिन मुझे 1.4.2 के तहत चलने के बारे में कोई दस्तावेज नहीं मिला।

+0

यह एक समाधान हो सकता है। पारितोषिक के लिए धन्यवाद। –

+0

खैर, एक्सपेक्टजे ऐसा लगता है कि इसे काम करना चाहिए - निर्भरताओं को कॉपी और निर्मित करने में कामयाब रहे। समस्या यह है कि, एक्सपेक्टजे स्ट्रिंगबिल्डर का उपयोग करता है, जिसे 1.5 तक लागू नहीं किया गया था। कोई सुझाव? –

+0

यदि आप उनके पास पुराना संस्करण रखते हैं तो आप ExpectJ लोगों से पूछ सकते हैं (Sourceforge पर कोई नहीं है)। यदि एकमात्र समस्या स्ट्रिंगबिल्डर है, तो आप कोड को स्वयं संशोधित करने में सक्षम होना चाहिए। –

0

क्या आपने सूडो कमांड इनपुट को पुनर्निर्देशित करने और उस पर लिखने का प्रयास किया है। मैंने थोड़ी देर में जावा का उपयोग नहीं किया है, लेकिन मेरा मानना ​​है कि इनपुट स्ट्रीम प्राप्त करने और इसे लिखने का एक तरीका है। आप उस पासवर्ड को लिखने के लिए एक नई लाइन के बाद इस्तेमाल कर सकते हैं और सुडो या सु को पासवर्ड स्वीकार करना चाहिए।

getInputStream() का उपयोग करें और उस पर अपना पासवर्ड लिखें।

su jim -c ls ~Bob 
-1

शायद यह काम करेगा:

Process process = Runtime.getRuntime().exec("su jim && ls ~bob"); 

OutputStream standardInput = process.getOutputStream(); 
Writer standardInputWriter = new OutputStreamWriter(standardInput); 
standardInputWriter.write("password\n"); 
standardInputWriter.close(); 
+0

धन्यवाद, लेकिन यह काम नहीं किया। मैंने पहले कुछ ऐसा करने की कोशिश की है, लेकिन उसी परिणाम के साथ। –

-1

मुझे यकीन है कि इस कोड को नहीं कर रहा हूँ:

Process p = Runtime.getRuntime().exec("su jim && ls ~bob"); 

एक खोल में निष्पादित किया जाएगा, & & का मूल्यांकन करने की जरूरत है, वह यह है कि एक शेल कमांड (/ बिन/श)। आपको su के कमांड लाइन स्विथ के माध्यम से "ls ~ bob" कमांड को पास करना चाहिए।कुछ ऐसा:

su jim -c 'ls ~bob' 
+0

उपरोक्त उत्तर के समान परिणाम। –

+0

फिर एसएसएच इमहो एकमात्र व्यवहार्य विकल्प – dfa