Como o {} e + é expandido dentro de find com a opção -execdir

0

Ao usar o programa find com a opção -execdir , vi pessoas dizerem que {} será substituído pelo diretório e + com o nome do arquivo, mas o manual não diz o que isso faz . Existe alguma documentação oficial que explica isso? Também quero saber se eles são expandidos como caminhos relativos ou absolutos. Eu tentei criar um script que usaria os parâmetros {} e + as e salvasse seu conteúdo em arquivos separados. Eu assumi 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 eu ainda não consigo 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 com ./filename com nomes de arquivos diferentes. Os arquivos de texto second_param e third_param são preenchidos com linhas em branco, cada uma com o mesmo número de linhas que os outros arquivos. Isso é o que me leva a acreditar que não há segundo parâmetro sendo passado para save_params.sh .

    
por still_dreaming_1 22.05.2016 / 04:28

2 respostas

1

+ é o marcador final, {} é substituído pelos nomes dos arquivos que 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 ... releitura da pergunta parece que o script foi escrito para modificar o diretório que está sendo pesquisado por find, então o que realmente acontece pode ser mais complexo.

na primeira execução, há apenas um arquivo encontrado

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

para que os arquivos sejam criados com conteúdo para refletir isso.

    
por 22.05.2016 / 06:50
1

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

Funciona exatamente da mesma forma que find ... -exec , exceto que find primeiro altera 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 o GNU find, info find ou pinfo find para obter uma documentação mais detalhada) e procure por -execdir .

Na página do GNU find man:

-execdir command ;

-execdir command {} +

Like -exec, but the specified command is run from the subdirectory containing the matched file, which is not normally the directory in which you started find. This a much more secure method for invoking commands, as it avoids race conditions during resolution of the paths to the matched files.

As with the -exec action, the + form of -execdir will build a command line to process more than one matched file, but any given invocation of command will only list files that exist in the same subdirectory.

If you use this option, you must ensure that your $PATH environment variable does not reference .; otherwise, an attacker can run any commands they like by leaving an appropriately-named file in a directory in which you will run -execdir.

The same applies to having entries in $PATH which are empty or which are not absolute directory names. If find encounters an error, this can sometimes cause an immediate exit, so some pending commands may not be run at all.

The result of the action depends on whether the + or the ; variant is being used; -execdir command {} + always returns true, while -execdir command {} ; returns true only if command returns 0.

Observe que, mesmo que a extração man page não a mencione, o ; deve ser salvo como \; se for executado a partir de uma linha de comando ou script do shell, para que o shell não o interprete como o final do comando find , em vez de ser passado como um argumento para find para indicar o final do comando find s -exec . O + não precisa ser escapado.

    
por 23.05.2016 / 02:53

Tags