Podemos usar pastas temporárias como arquivos temporários
TMP=$(mktemp ... )
exec 3<>$TMP
rm $TMP
cat <&3
que será destruído automaticamente após a saída do shell?
file-descriptors
tmpfs
Bob Johnson
fonte
fonte
Respostas:
No caso de um arquivo temporário, seu exemplo na pergunta o criaria, depois o desvincularia do diretório (fazendo com que "desapareça") e, quando o script fechar o filedescriptor (provavelmente após a finalização), o espaço ocupado pelo arquivo seria recuperável pelo sistema. Essa é uma maneira comum de lidar com arquivos temporários em idiomas como C.
Até onde eu sei, não é possível abrir um diretório da mesma maneira, pelo menos de nenhuma maneira que tornaria o diretório utilizável.
Uma maneira comum de excluir arquivos e diretórios temporários no final de um script é instalando uma
EXIT
armadilha de limpeza . Os exemplos de código fornecidos abaixo evitam ter que manipular completamente os filedescriptors.Ou você pode chamar uma função de limpeza:
A
EXIT
interceptação não será executada ao receber oKILL
sinal (que não pode ser interceptado), o que significa que não haverá limpeza realizada. No entanto, ele será executado ao terminar devido a um sinalINT
ouTERM
(se estiver sendo executado combash
ouksh
, em outros shells, você poderá adicionar esses sinais depoisEXIT
natrap
linha de comando) ou quando sair normalmente devido à chegada ao final do script ou à execução de umexit
ligar.fonte
.
e..
. (Testado em Linux, eu não sei se isso é consistente em todas as plataformas.)exec another-command
obviamente.Escreva uma função shell que será executada quando o seu script se terminar. No exemplo abaixo, chamo de 'limpeza' e defino uma armadilha a ser executada nos níveis de saída, como: 0 1 2 3 6
Veja este post para mais informações.
fonte
cleanup
antes de uma saída limpa (0) e ao receber SIGHUP (1), SIGINT (2), SIGQUIT (3) e SIGABRT (6). ele irá não executarcleanup
quando as saídas de script por causa de SIGTERM, SIGSEGV, SIGKILL, SIGPIPE, etc. Isto é claramente deficiente.Você pode chdir e removê-lo, desde que não tente usar os caminhos dentro dele posteriormente:
Não verifiquei, mas provavelmente é o mesmo problema ao usar o openat (2) em C com um diretório que não existe mais no sistema de arquivos.
Se você é root e no Linux, pode jogar com um espaço para nome separado e
mount -t tmpfs tmpfs /dir
dentro dele.As respostas canônicas (coloque uma armadilha em EXIT) não funcionam se seu script for forçado a uma saída impura (por exemplo, com SIGKILL); que podem deixar dados confidenciais por aí.
Atualizar:
Aqui está um pequeno utilitário que implementa a abordagem de namespace. Deve ser compilado com
e determinados
CAP_SYS_ADMIN
recursos de arquivo (como root) comQuando executar um usuário (normalmente) como
ele irá compartilhar seu espaço de nome do sistema de arquivos, montar um sistema de arquivos tmpfs
/proc/sysvipc
, chdir nele e executarcommand
com os argumentos fornecidos.command
vai não herdar asCAP_SYS_ADMIN
capacidades.Esse sistema de arquivos não estará acessível a partir de outro processo não iniciado
command
, e desaparecerá magicamente (com todos os arquivos criados dentro dele) quandocommand
e seus filhos morrerem, não importa como isso aconteça. Observe que isso está apenas compartilhando o espaço para nome da montagem - não há barreiras rígidas entrecommand
e outros processos executados pelo mesmo usuário; eles ainda poderiam deslocar dentro de seu namespace quer atravésptrace(2)
,/proc/PID/cwd
ou por outros meios.O seqüestro do "inútil"
/proc/sysvipc
é, é claro, bobo, mas a alternativa seria enviar spam/tmp
com diretórios vazios que precisariam ser removidos ou complicar bastante esse pequeno programa com garfos e esperas. Como alternativa,dir
pode ser alterado para, por exemplo./mnt/chtmp
e crie-o pela raiz na instalação; não faça com que seja configurável pelo usuário e não o configure como um caminho de propriedade do usuário, pois isso pode expô-lo a desvios de links e outras coisas peludas que não valem a pena gastar tempo.chtmp.c
fonte
rm $PWD
trabalho, shell ainda está nesse diretório. Mas nenhum novo arquivo pode ser colocado nesta "pasta". Somente você pode fazer é ler / gravar com o arquivo & 3, & 4. Portanto, este ainda é "arquivo temporário", não "pasta temporária".Você precisa de um shell específico?
Se zsh for uma opção, leia
zshexpn(1)
:Por exemplo, eu uso isso no rifle (parte do gerenciador de arquivos do ranger) para descriptografar um arquivo e depois executar o rifle no arquivo temporário, que é excluído quando o subprocesso termina. (não se esqueça de definir
$TERMCMD
)fonte