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.
Há uma informação muito detalhada aqui . Outra excelente referência está aqui . Para citar a primeira referência:
Da segunda referência:
fonte
O principal problema está no valor da variável do sistema
PATH
que contém pastas relativas, portanto, por razões de segurançafind
comando não permitirá a execução de binários, porque potencialmente ele pode executar programas errados.Então, por exemplo, se você tem o seu diretório atual no seu PATH conforme o aviso que você recebe:
e você executará seu comando:
caso você tenha um script local (
rm
com sinalizadores executáveis)rm -fr /
, ele poderá remover todos os seus arquivos, porque, em vez de executar o esperado/bin/rm
, você executarárm
partir do diretório atual, portanto, provavelmente não é o que você queria.Como observação lateral, esse é um problema conhecido no Travis CI ( GH # 2811 ) quando falha com o erro:
Portanto, a solução é remover a entrada afetada da variável PATH, por exemplo
como proposto por drogus . O progresso deste bug pode ser acompanhado em GH # 4862 .
Aqui está a solução alternativa da versão Bash:
Exemplo de uso (passando filtrado
PATH
para um comando específico):fonte
sed
que parece remover todas as coisasfind
que não gosta: askubuntu.com/questions/621132/…xargs
ebash -c cd
solução alternativaOk eu desisto:
sed
GambiarraUm pouco menos agradável que a solução alternativa anterior:
Um testcase:
Para
rename
especificamente, você também pode solucionar com algum Perl regex-fu: /programming/16541582/finding-multiple-files-recursively-and-renaming-in-linux/54163971#54163971RTFS espera esmagamento
Para aqueles que têm esperanças de que exista uma maneira de ignorar
find
a opinião de opinião, deixe-me esmagar isso com alguma fonte:A partir disso, vemos que parece não haver maneira de desativar a verificação do caminho.
A regra exata que ele verifica é: falha se
PATH
estiver vazia ou não começar/
.fonte