Избегание неверных путей к серверу для RSYNC через SSH - PullRequest
0 голосов
/ 29 января 2019

У меня есть клиент, использующий самые нелепые имена файлов / папок, и мне нужно RSYNC свои данные на NAS.Моя логика RSYNC написана на Perl, и quotemeta () работала хорошо, пока нам не пришлось иметь дело с датскими символами.

См. Пример кода:

#!/usr/bin/env perl
$my_string_a = "/data/stuff/folder K/ \snappy/SLE.T.TET/Div (erse)/SLETTET/Disk klæbere";
$my_string_b = quotemeta($my_string_a);
print "\n".$my_string_a."\n".$my_string_b."\n";
exit;

Выводы:

/data/stuff/folder K/ snappy/SLE.T.TET/Div (erse)/SLETTET/Disk klæbere
\/data\/stuff\/folder\ K\/\ snappy\/SLE\.T\.TET\/Div\ \(erse\)\/SLETTET\/Disk\ kl\�\�bere

Примечание: я должен использовать escape-символы, так как ssh / rsync требует "двойного экранирования" в Perl.

Есть ли лучшее консервативное решение или мне нужно будет пересмотреть мой путь через это?

1 Ответ

0 голосов
/ 30 января 2019

Встроенные в Perl вызовы внешних программ (т.е. system, exec и т. Д.) Не всегда корректно обрабатывают кодировки.

Вы можете попробовать использовать Net :: OpenSSH , которыйимеет встроенную поддержку для передачи файлов с rsync и может обрабатывать автоматическое цитирование и кодирование командной строки rsync.

use Net::OpenSSH;
use utf8;

my $ssh = Net::OpenSSH->new(...,
                            argument_encoding => 'utf8');

$ssh->rsync_put("/data/stuff/folder K/ \snappy/SLE.T.TET/Div (erse)/SLETTET/Disk klæbere",
                $target_dir)
    or die "rsync_failed " . $ssh->error;
...