Для использования функций исполнения роли sudo (это принимает значение по умолчанию к пользовательскому корню) необходимо использовать-u опцию как это:
sudo -u agupta ls ~agupta
Кроме того, если agupta находится в Дочерней группе, чтобы сделать это необходимо выполнить sudo под sudo:
sudo -u agupta sudo cat /etc/sudoers
Для решения на Perl можно использовать модуль Win32::Filenames
.
http://search.cpan.org/~bch/Win32-Filenames-0.01/lib/Win32/Filenames.pm
Простая программа, использующая этот модуль:
#!/usr/bin/env perl
use strict;
use warnings;
use Win32::Filenames qw(validate sanitize);
while ( my $filename = shift ) {
printf( "checking filename %s\t", $filename );
if ( validate($filename) ) {
print("ok.\n");
}
else {
printf( "failed, try this instead: %s\n", sanitize($filename) );
}
}
Вы вызываете ее с одним или несколькими именами файлов в командной строке:
$ ./check.pl '<a>' 'hi?' '"right"' 'pipe|me'
checking filename <a> failed, try this instead: -a-
checking filename hi? failed, try this instead: hi-
checking filename "right" failed, try this instead: -right-
checking filename pipe|me failed, try this instead: pipe-me
Для целой файловой иерархии:
$ find . -exec basename {} \; | xargs ./check.pl