हैलो मैं निम्नलिखित निष्पादित करने का प्रयास कर रहा हूं:

Process p = null;
StringBuffer rbCmd = new StringBuffer();

rbCmd.append("rsync -e \"ssh -i /root/.ssh/key\" -va --relative /home/lego/hyb/abc/PVR2/Testdata/./R887/SCM/System root@myMachine:/xyz/data/SCMdata/");

p = Runtime.getRuntime().exec(rbCmd.toString());

लेकिन मुझे कमांड लाइन पर निम्न त्रुटि मिल रही है। कमांड लाइन पर कमांड सही ढंग से निष्पादित होता है:

अनुगामी अनुगामी-" रिमोट-शेल कमांड में। rsync त्रुटि: सिंटैक्स या उपयोग त्रुटि (कोड 1) main.c(361) पर [sender=3.0.6]

समस्या कमांड के अंदर दोहरे उद्धरण चिह्नों के कारण है जहाँ मैं ssh कुंजी का उल्लेख करता हूँ।

कृपया सुधार में मदद करें।

0
Piyush Vinchurkar 9 सितंबर 2020, 14:54

1 उत्तर

सबसे बढ़िया उत्तर

आपका दृष्टिकोण काम नहीं करेगा क्योंकि Runtime.exec() को यह एहसास नहीं है कि "ssh -i /root/.ssh/key" rsync के लिए एक ही तर्क है। डबल-कोट्स से बचने से कंपाइलर खुश रहता है, लेकिन मूलभूत समस्या को दूर नहीं करता है, जो कि बिल्ट-इन टोकननाइज़र की सीमा है।

आपके पास कुछ इस तरह से अधिक भाग्य हो सकता है:

Process p = Runtime.getRuntime().exec
    (new String[]{"rsync", "-e", "ssh -i /root/.ssh/key", "-va" "--relative" ... });

यही है, कमांड लाइन को स्वयं टोकन करें, और अलग-अलग टोकन को String[] में बनाएं। आप पहले से तय कर रहे हैं कि rsync के तर्क क्या हैं, बजाय इसके कि exec() को यह पता लगाने की अनुमति दी जाए (गलत तरीके से)।

यह न भूलें कि यदि rsync कोई आउटपुट उत्पन्न करता है, तो आपको अपने एप्लिकेशन को इसके stdout और stderr उपभोग करने की व्यवस्था करनी होगी, अन्यथा यह रुक सकता है।

1
Kevin Boone 9 सितंबर 2020, 15:08