Os curingas com comandos sudo são um pouco arriscados. Eles podem parecer dar segurança sem realmente fazer isso. Para sudo
, o *
não significa "nenhum arquivo sob este diretório" como no shell. Em vez disso, significa "qualquer opção adicional" e deve ser independente. Infelizmente, você não pode em sudo restringir parte dos argumentos e, além disso, não seria seguro (porque o usuário pode especificar ../../
que frustraria suas intenções).
Então, aqui está o que você faz: escrever um script que valide cuidadosamente os argumentos da linha de comando e certifique-se de que eles não contenham elementos como ../
. Então esse script é incluído no sudo para o usuário. Mais um ponto: bash é uma má escolha neste contexto, devido às inúmeras maneiras pelas quais o usuário mal-intencionado pode subverter sua intenção. Então aqui está um perl Exemplo que eu testei e deve se encaixar em suas necessidades (após a customização, e substituindo echo
pela string vazia).
#!/usr/bin/perl -w
my $user = "aabuhasna";
my $group = "aabuhasna";
my $prefix = "/test_dir";
$mode=shift @ARGV or die "Please provide a mode for the new file";
die "Invalid chmod input: $mode" unless $mode =~ /^[0-9]+$/;
$mode = oct($mode);
die "Invalid permissions in mode: $mode" if $mode != ($mode & 0777);
my $uid = (getpwnam($owner))[2] or die "Unknown user: $user";
my $gid = (getpwnam($group))[2] or die "Unknown group: $group";
foreach (@ARGV) {
die "Invalid Directory Argument: $_" if m:\.\./:;
next if -l $prefix."/".$_;
push @files,$prefix."/".$_;
}
die "No files specified!" unless @files;
chmod $mode, @files;
chown $uid, @gid, @files;
A entrada do sudo para este script, digamos que você o coloque em /usr/local/bin/changemodeowner
é simples:
aabuhasna ALL=(ALL) NOPASSWD: /usr/local/bin/changemodeowner
Não há *
necessário aqui.