2011-07-20 16 views
6

मैं ऐसे एप्लिकेशन पर काम कर रहा हूं जिसे दूरस्थ सर्वर पर कमांड भेजने की आवश्यकता है। एसएसएच क्लाइंट पुस्तकालयों की पर्याप्तता के साथ आदेश भेजना काफी आसान है।प्रोग्रामिंग एसएसएच शैल सत्र प्रोग्रामेटिक रूप से कैसे प्राप्त करें?

हालांकि, मुझे प्रत्येक आदेश के बीच संरक्षित शैल स्थिति (यानी वर्तमान कार्यशील निर्देशिका, पर्यावरण चर, आदि) चाहिए। मैंने देखा है कि सभी क्लाइंट पुस्तकालय यह नहीं करते हैं। उदाहरण के लिए, निम्नलिखित कोड है कि नहीं मैं क्या चाहते हो का एक उदाहरण है:

use Net::SSH::Perl; 
my $server = Net::SSH::Perl->new($host); 
$server->login($user, $pass); 

$server->cmd('cd /var'); 
$server->cmd('pwd');  # I _would like_ this to output /var 

वहाँ, आदेश भेजने के बीच प्रदर्शन किया तो $server->cmd('cd /var; pwd') तरह आदेशों के संयोजन अन्य कार्यों स्वीकार्य नहीं है हो जाएगा।

उत्तर

0

मुझे यकीन नहीं है कि आप वास्तव में क्या कर रहे हैं, लेकिन आप बस एक एसएसएच सत्र शुरू कर सकते हैं। यदि आप वास्तव में ऐसा नहीं कर सकते हैं, तो आप बस सबकुछ के लिए पूर्ण पथ का उपयोग कर सकते हैं।

2

Net::SSH::Expect जो आप चाहते हैं वह करता है, हालांकि "उम्मीद" तरीका पूरी तरह से विश्वसनीय नहीं है क्योंकि यह आपके आदेशों के आउटपुट को पार्स कर रहा है और जब शेल प्रॉम्प्ट फिर से प्रकट होता है तो पता लगाने की कोशिश कर रहा है।

+0

यह ठीक है जब तक आप केवल उन आदेशों को चलाते हैं जिन्हें आप जानते हैं कि आउटपुट को कैसे पार्स करना है। – Joshua

+0

@ जोशुआ: ठीक है, मैंने बाद में पाया कि नेट :: एसएसएच :: उम्मीद कमांड के दौरान पता लगाने के लिए किसी भी तर्क का उपयोग नहीं करती है। इसमें सिर्फ एक (अनुकूलन योग्य) टाइमआउट है और मानता है कि टाइमआउट खत्म होने पर कमांड किया जाता है। पूरी तरह से अविश्वसनीय! – salva

+0

ईडब्ल्यूडब्ल्यूडब्ल्यू। फिर आप सीधे उम्मीद में डर्न चीज लिखने के लिए अच्छा कर सकते हैं। – Joshua

संबंधित मुद्दे