Você pode executar o programa errado. Alguém poderia fazer você executar o programa deles.
A -execdir
ação executa seu comando no diretório que contém os arquivos encontrados. Quando $PATH
contém caminhos relativos, como .
ou qualquer coisa que não comece/
, -execdir
é inseguro porque um diretório em que um arquivo é encontrado (ou outro diretório resolvido em relação a ele) também pode conter um executável com o mesmo nome que você está tentando para correr. Esse executável potencialmente não confiável seria executado.
Isso pode ser deliberadamente explorado por outro usuário para fazer com que você execute o programa dele, o que pode causar danos ou violar a segurança dos dados, em vez do programa que você está tentando executar. Ou, com menos frequência, isso pode resultar simplesmente na execução inadvertida do programa errado, mesmo sem que ninguém tente fazer o problema acontecer.
Se tudo em sua PATH
variável de ambiente é um caminho absoluto, este erro não deve ocorrer, mesmo que o diretório que você está pesquisando e -execdir
ing de está contido no PATH
. (Verifiquei se isso funciona.) Se você acredita que não possui nenhum diretório relativo, $PATH
mas ainda está recebendo esse erro, atualize sua pergunta com detalhes, incluindo a saída de echo "$PATH"
.
Um exemplo concreto.
Como um exemplo do que poderia dar errado, suponha:
- Alice tem
.
nela $PATH
porque quer ser capaz de executar programas em qualquer diretório que deseje cd
, sem se preocupar em acrescentar seus nomes ./
.
- Eve frenemy de Alice compartilhou
/home/eve/shared
com Alice.
- Alice deseja estatísticas (linhas, palavras, bytes) nos
.c
arquivos que Eve compartilhou com ela.
Então Alice corre:
find ~eve/shared -name \*.c -execdir wc {} \;
Infelizmente para Alice, Eve criou seu próprio script, nomeou-o wc
, definiu-o como executável ( chmod +x
) e o colocou clandestinamente em um dos diretórios abaixo /home/eve/shared
. O script de Eve é assim:
#!/bin/sh
/usr/bin/wc "$@"
do_evil # Eve replaces this command with whatver evil she wishes to do
Então, quando Alice usa find
com -execdir
para executar wc
nos arquivos que Eve compartilhou, e chega aos arquivos no mesmo diretório que o wc
script personalizado de Eve, ela é wc
executada - com todos os privilégios de Alice!
(Sendo esperta, Eve fez seu wc
script atuar como um invólucro para o sistema wc
, para que Alice nem saiba que algo deu errado, isto é, do_evil
foi executado. No entanto, variações mais simples - e também mais sofisticadas - são possíveis. )
Como find
evita isso.
find
evita que esse problema de segurança ocorra ao recusar a -execdir
ação quando $PATH
contém um diretório relativo.
find
oferece duas mensagens de diagnóstico, dependendo da situação específica.
Se .
estiver dentro $PATH
, então (como você viu) diz:
find: The current directory is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove the current directory from your $PATH (that is, remove "." or leading or trailing colons)
Provavelmente tem uma mensagem especial para o .
caso, pois é especialmente comum.
Se um caminho relativo que não .
--say, foo
--appears em $PATH
e você corre find
com -execdir
, ele diz:
find: The relative path `foo' is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove that entry from $PATH
É melhor não ter caminhos relativos $PATH
.
O risco de ter .
ou outros caminhos relativos $PATH
é especialmente aumentado ao usar um utilitário que altera automaticamente o diretório, e é por isso find
que não o deixa usar -execdir
nessa situação.
Mas ter caminhos relativos, especialmente .
no seu, $PATH
é inerentemente arriscado e é realmente melhor evitado de qualquer maneira. Considere a situação fictícia no exemplo acima. Suponha que, em vez de correr find
, Alice simplesmente cd
vá ~eve/shared/blah
e corra wc *.c
. Se blah
contém o wc
script de Eve , do_evil
é executado como Alice.