2016-07-27 5 views
1
use Net::SSH2; 
my $ssh2 = Net::SSH2->new(); 
$ssh2->connect($hostname); 
$ssh2->auth_password($user,$pass); 
$chan = $ssh2->channel(); 
$chan->exec("cd dir1"); 
$chan->exec("command file1.txt"); 

Вышеуказанное не работает и command не найдено dir1/file1.txt. Как изменить рабочий каталог с помощью Net::SSH2?Как изменить рабочий каталог с помощью Net :: SSH2?

+0

# $ chan-> exec ('ls -la'); [см. здесь] (http://www.perlmonks.org/?node_id=569657) – ssr1012

+0

@ ssr1012 Это будет список каталогов. Я не хочу этого делать. – CJ7

+1

'$ chan-> exec (" ./ command ");' –

ответ

1

Согласно the documentation, каждый вызов $chan->exec() работает в своем собственном процессе на пульте дистанционного управления. cd dir1 в первом exec влияет только на это выполнение. Следующий exec - это совершенно отдельный процесс.

Самый простой способ решить эту проблему было бы пройти полный путь в команде, т.е.

$chan->exec("command dir1/file1.txt"); 

Можно также попробовать установить переменную PATH, используя $chan->setenv() но это, вероятно, будет запрещено на удаленной стороне ,

Заметим также (из раздела process):

... также можно запустить удаленную оболочку (с использованием оболочки) и имитировать взаимодействие с пользователем команды печати на его стандартного ввода потока и считывания данных обратно от его stdout и stderr. Но по возможности следует избегать такого подхода; говорить с оболочкой сложно и, в общем, ненадежным.