При создании образа командой genisoimage файлы в проекте с кириллицей в образе отображаются кракозяблами. AstraLinux

Есть скрипт на perl который создает iso используя genisoimage. При запуске скрипта в терминале от рута кириллица в iso отображается нормально, при запуске из php русские символы названиях файлов некорректно отображаются.

PHP:

<?php
$find_name = $_SERVER['REMOTE_USER'];
$share = "/SHARE/USERS";
$out_dir = $share."/".$find_name."/result/";

if(isset($_POST["val"]))
{
 $metod = $_REQUEST["val"];
}

if(isset($_POST["tgt"]))
{
 $folder = $_REQUEST["tgt"];
}

exec("/usr/bin/perl /usr/local/bin/md5scr/generate_md5sum.pl --in='".$folder."' --out=".$out_dir." --metod=".$metod."");

?>

PERL:

    #!/usr/bin/perl

use POSIX();
use POSIX qw(strftime);
use File::Basename;
use strict;
use OpenOffice::OODoc;
use Getopt::Long;

my $i_file = "/usr/local/bin/md5scr/template1_0.odt";
my $i_file_lines = 8;

#my $username;
my $in_dir;
my $out_dir;
my $metod;

GetOptions ('--in', 'in:s' => \$in_dir, '--out','out:s' => \$out_dir, '--metod','metod:s' => \$metod);
unless( -d $in_dir || -d $out_dir){print "Directory not found.\n"; exit 0;}

my @thing =();

traverse($in_dir);
push(my @files,@thing);

if(scalar @files == "0"){ exit 0;}
my $size_files =  POSIX::ceil(scalar @files / $i_file_lines);
my @files_md5;

if($metod eq "md5"){
    $metod = "md5sum -b";
    hashsum($metod);
    md5($in_dir, $out_dir, $metod);}

if($metod eq "gost256"){
    $metod = "gostsum --gost-2012 -d";
    hashsum($metod);
    gost256($in_dir, $out_dir, $metod);}

if($metod eq "gost512"){
    $metod = "gostsum --gost-2012-512 -d";
    hashsum($metod);
    gost512($in_dir, $out_dir, $metod);}
    
sub hashsum {
    my ($files) = @_;
    for (my $i=0; $i<scalar @files; $i++){
    my $MD5 = `$metod "$files[$i]"`; 
    $MD5 =~ s/..$files[$i]//;
    chomp $MD5;
    $files_md5[$i] = $MD5;}
    return;
}

sub md5 {
    #Генерация временной метки и версии ОС
    my $os_version = `lsb_release -d | grep 'Description:' |  sed 's/Description:\t//'`;
    my $datestr = strftime "%Y%m%d%H%M%S",localtime;

    #Сделать ISO
    my $create_iso = `genisoimage -v -J -r -V "$datestr" -o "$out_dir/$datestr.iso" "$in_dir"` | grep 'extents written';
    $create_iso =~ s/ extents written .+//;

    #Проверка на результат создания образа
    if ($create_iso eq "") { exit 0; }

    #Расчет контрольной суммы образа
    my $ISO_block_size = `isoinfo -d -i "$out_dir/$datestr.iso" | grep 'Logical block size is:' | sed 's/Logical block size is: //'`;
    my $ISO_volume_size = `isoinfo -d -i "$out_dir/$datestr.iso" | grep 'Volume size is:' | sed 's/Volume size is: //'`;
    chomp $ISO_block_size;
    chomp $ISO_volume_size;
    my $MD5_ISO = `dd if="$out_dir/$datestr.iso" bs=$ISO_block_size count=$ISO_volume_size conv=notrunc,noerror status=none | $metod | sed 's/..-\$//'`;
    chomp $MD5_ISO;

    #Получение размера файла образа
    my $iso_size = -s $out_dir."/".$datestr.".iso";
    report($iso_size, $MD5_ISO, $os_version, $datestr);
}

sub gost256{
    #Генерация временной метки и версии ОС
    my $os_version = `lsb_release -d | grep 'Description:' |  sed 's/Description:\t//'`;
    my $datestr = strftime "%Y%m%d%H%M%S",localtime;

    #Сделать ISO
    my $create_iso = `genisoimage -r -J -joliet-long -iso-level 3 -V $datestr -o "$out_dir/$datestr.iso" "$in_dir"` | grep 'extents written';
    $create_iso =~ s/ extents written .+//;

    #Проверка на результат создания образа
    if ($create_iso eq "") { exit 0; }

    #Расчет контрольной суммы образа
    my $MD5_ISO =  `$metod $out_dir/$datestr.iso | cut -c -64`;
    chomp $MD5_ISO;

    #Получение размера файла образа
    my $iso_size = -s $out_dir."/".$datestr.".iso";
    report($iso_size, $MD5_ISO, $os_version, $datestr);
}

sub gost512{
    #Генерация временной метки и версии ОС
    my $os_version = `lsb_release -d | grep 'Description:' |  sed 's/Description:\t//'`;
    my $datestr = strftime "%Y%m%d%H%M%S",localtime;

    #Сделать ISO
    my $create_iso = `genisoimage -r -J -joliet-long -iso-level 3 -V $datestr -o "$out_dir/$datestr.iso" "$in_dir"` | grep 'extents written';
    $create_iso =~ s/ extents written .+//;

    #Проверка на результат создания образа
    if ($create_iso eq "") { exit 0; }

    #Расчет контрольной суммы образа
    my $MD5_ISO =  `$metod $out_dir/$datestr.iso | cut -c -128`;
    chomp $MD5_ISO;

    #Получение размера файла образа
    my $iso_size = -s $out_dir."/".$datestr.".iso";
    report($iso_size, $MD5_ISO, $os_version, $datestr);
}

sub report{
    my($iso_size, $MD5_ISO, $os_version, $datestr) = @_;
    for (my $l=0; $l<$size_files; $l++){
        #Открываем файл шаблон отчета
        odfWorkingDirectory('/tmp');
        my $doc = ooDocument(file => $i_file,member => 'content');
        #Заполняем общие поля отчета
        doc_element("ISO_MD5_FIELD", "$MD5_ISO",$doc);
        doc_element("ISO_SIZE_FIELD", "$iso_size байт",$doc);
        doc_element("OS_VERSION_FIELD", "$os_version",$doc);
        doc_element("OS_VERSION2_FIELD", "$os_version",$doc);
        my $z = 0;
        for (my $w=$i_file_lines*$l; $w<$i_file_lines+$i_file_lines*$l; $w++){
            $z++;
            #Заполняем элементы таблицы
            my $file_print = $files[$w]; 
            $file_print =~ s/$in_dir\///;
            doc_element("FILE_NAME_".$z."_FIELD", "$file_print",$doc);
            doc_element("FILE_MD5_".$z."_FIELD", "$files_md5[$w]",$doc);
        }
        #Генерируем название исходящего файла
        my $o_file = $out_dir."/md5_".$datestr."_".$l.".doc";
        #Сохраняем файл
        $doc->save($o_file);
        #chown $UID, $GID, $o_file;
    }
}

#chown $UID, $GID, "$out_dir/$datestr.iso";

sub doc_element{
    my($search,$text,$doc) = @_;
    my $element = $doc->selectElementByContent($search);
    $doc->replaceText($element, $search, $text);
    return $doc;
}

sub traverse {
    my ($thing) = @_;
    return if not -d $thing;
    opendir my $dh, $thing or die;
    while (my $sub = readdir $dh) {
        next if $sub eq '.' or $sub eq '..';
        if (not -d "$thing/$sub"){ push (@thing, "$thing/$sub"); }
        traverse("$thing/$sub");
    }
    close $dh;
    return;
}

Ответы (1 шт):

Автор решения: Boliwar

PHP по непонятной мне причине запускал shell в кодировке 1252. Указал явно кодировку

<?php
putenv('LANG=ru_RU.UTF-8');
exec(.......);
?>
→ Ссылка