При создании образа командой 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(.......);
?>