Цитирование Сеть :: SSH2 :: Канал
Также можно запустить удаленную оболочку (используя
оболочки) и имитировать пользовательские команды печати взаимодействия с его
поток stdin и чтение данных обратно из stdout и stderr. Но
следует избегать такого подхода, если это возможно; говорить с оболочкой
сложно и вообще ненадежно.
Более того, использование ls
для определения, существует ли файл / каталог, является хрупким и ненадежным. Вместо этого вы должны использовать файловые тестовые операции, например
sub exec_remote($$) {
my($ssh2, $cmd) = @_;
# every exec() requires a new channel
my $chan = $ssh2->channel()
or $ssh2->die_with_error;
# send command to remote
$chan->exec($cmd)
or $ssh2->die_with_error;
# we're done from our side
$chan->send_eof;
# ignore command output
while (<$chan>) {}
# wait for remote command to complete and return its exit status
return $chan->exit_status;
}
sub copy_remote_if_necessary($$$$) {
my($ssh2, $source, $destination, $file) = @_;
if (exec_remote($ssh2, "/usr/bin/test -f ${destination}/${file}") ne 0) {
die "Copy failed!\n"
unless (exec_remote($ssh2, "cp ${source}/${file} ${destination}/") ne 0);
}
}
copy_remote_if_necessary($ssh2, '/data/Directory1', '/data/Directory2', 'ABC.csv');