Como {} e + são expandidos dentro do find com a opção -execdir

Como {} e + são expandidos dentro do find com a opção -execdir

Ao usar o findprograma com a -execdiropção, tenho visto pessoas dizerem que o {}será substituído pelo diretório e o +pelo nome do arquivo, mas o manual não diz o que eles fazem. Existe alguma documentação oficial que explica isso? Também quero saber se eles são expandidos como caminhos relativos ou absolutos. Tentei criar um script que pegasse os parâmetros e {}as +e salvasse seu conteúdo em arquivos separados. Presumi que eles seriam passados ​​como dois parâmetros separados e isso me permitiria ver como cada um é expandido, mas os resultados que estou obtendo fazem parecer que apenas um único parâmetro está sendo passado para o script, então ainda não consigo completamente provar para mim mesmo o que são e como são expandidos.

Aqui está o comando que estou executando:find '/home/jesse/hacking/sh_sandbox' -type f -execdir /home/jesse/hacking/sh_sandbox/save_params.sh {} +

O script save_params.sh é um script de shell executável com o seguinte código:

echo $0 >> /home/jesse/hacking/sh_sandbox/zero_param.txt
echo $1 >> /home/jesse/hacking/sh_sandbox/first_param.txt
echo $2 >> /home/jesse/hacking/sh_sandbox/second_param.txt
echo $3 >> /home/jesse/hacking/sh_sandbox/third_param.txt

O arquivo de texto zero_param é preenchido com o nome do script que está sendo executado, o que é esperado. O arquivo first_param.txt está sendo preenchido ./filenamecom nomes de arquivos diferentes. Os arquivos de texto second_param e third_param são preenchidos com linhas em branco, cada um com o mesmo número de linhas que os outros arquivos. Isso é o que me leva a acreditar que não há nenhum segundo parâmetro sendo passado para save_params.sh.

Responder1

+é o marcador final, {}é substituído pelos nomes dos arquivos, o diretório atual é o caminho.

então

  • $PWD=/home/jesse/hacking/sh_sandbox/
  • $0=/home/jesse/hacking/sh_sandbox/save_params.sh
  • $1=./zero_param.txt
  • $2=./first_param.txt
  • $3=./second_param.txt
  • $4=./third_param.txt

ou algo assim... relendo a pergunta parece que o script foi escrito para modificar o diretório que está sendo pesquisado pelo find, então o que realmente acontece pode ser mais complexo.

na primeira execução, apenas um arquivo foi encontrado

  • $PWD=/home/jesse/hacking/sh_sandbox/
  • $0=/home/jesse/hacking/sh_sandbox/save_params.sh
  • $1=./save_params.sh

então os arquivos seriam criados com conteúdo para refletir isso.

Responder2

find ... -execdir command {} +não faz nada disso.

Funciona exatamente da mesma forma, find ... -execexceto que findprimeiro muda o diretório para o diretório em que os arquivos correspondentes estão antes de executar o comando.

Execute man find(ou se estiver usando GNU find, info findou pinfo findpara documentação mais detalhada) e procure por -execdir.

Na findpágina de manual do GNU:

-execdir command ;

-execdir command {} +

Semelhante a -exec, mas o comando especificado é executado a partir do subdiretório que contém o arquivo correspondente, que normalmente não é o diretório no qual você iniciou a localização. Este é um método muito mais seguro para invocar comandos, pois evita condições de corrida durante a resolução dos caminhos para os arquivos correspondentes.

Tal como acontece com a -execação, o +formulário -execdircriará uma linha de comando para processar mais de um arquivo correspondente, mas qualquer invocação de comando listará apenas os arquivos que existem no mesmo subdiretório.

Se você usar esta opção, deverá garantir que sua $PATHvariável de ambiente não faça referência a .; caso contrário, um invasor poderá executar qualquer comando que desejar, deixando um arquivo com nome apropriado em um diretório no qual você executará o -execdir.

O mesmo se aplica a entradas $PATHvazias ou que não sejam nomes de diretório absolutos. Se find encontrar um erro, isso às vezes pode causar uma saída imediata, portanto, alguns comandos pendentes podem nem ser executados.

O resultado da ação depende se + a ; variante está sendo usada; -execdir command {} +sempre retorna verdadeiro, enquanto -execdir command {} ;retorna verdadeiro apenas se o comando retornar 0.

Observe que, mesmo que o extrato da página de manual não mencione isso, o ;tem que ser escapado como \;se fosse executado a partir de uma linha de comando ou script do shell, para que o shell não o interprete como o final do findcomando, em vez de sendo passado como um argumento para findindicar o final do comando findde -exec. O +não precisa ser escapado.

informação relacionada