Onde é que CGI.pm normalmente criam arquivos temporários?
-
01-07-2019 - |
Pergunta
Em todos os meus servidores Windows, exceto por uma máquina, quando eu executar o código a seguir para atribuir um arquivos temporários pasta:
use CGI;
my $tmpfile = new CGITempFile(1);
print "tmpfile='", $tmpfile->as_string(), "'\n";
O $tmpfile
variável é atribuído o valor '.\CGItemp1'
e é isso que eu quero. Mas em um dos meus servidores é incorretamente definido para C:\temp\CGItemp1
.
Todos os servidores estão executando o Windows 2003 Standard Edition, IIS6 e ActivePerl 5.8.8.822 (upgrade para a versão mais recente do Perl não é uma opção). O resultado é sempre o mesmo ao executar um script a partir da linha de comando ou no IIS como um script CGI (onde de script .pl
= c:\perl\bin\perl.exe "%s" %s
).
Como posso corrigir esta instalação Perl e forçá-lo a voltar '.\CGItemp1
' por padrão?
Eu mesmo copiado toda a pasta Perl de um dos servidores que trabalham para esta máquina, mas nenhuma alegria.
Eu verifiquei o 'TMP
' e 'TEMP
' variáveis ??de ambiente e também $ENV{TMP}
e $ENV{TEMP}
e eles são idênticos.
A partir da linha de comando que apontar para o diretório de perfil de usuário, por exemplo:
C:\DOCUME~1\[USERNAME]\LOCALS~1\Temp\1
Quando executado sob o IIS como um script CGI que ambos apontam para:
c:\windows\temp
Na chave de registro HKEY_USERS/.DEFAULT/Environment
, ambos os servidores têm:
%USERPROFILE%\Local Settings\Temp
A implementação ActiveState de CGITempFile()
está claramente usando um mecanismo alternativo para determinar como deve gerar a pasta temporária.
O problema real é com o módulo CGI.pm
e manuseio anexo. Sempre que um arquivo é enviado para as necessidades local CGI.pm
para armazená-lo em algum lugar temporário. Para fazer isso CGITempFile()
é chamado dentro CGI.pm
para alocar uma pasta temporária. Então, infelizmente eu não posso usar File::Temp
. Obrigado na mesma.
Isso ajudou um monte. Eu tinha uma verificação rápida através da fonte CGI.pm
mais cedo, mas sua sugestão me fez voltar e olhar mais cuidadosamente para entender o algoritmo subjacente. Eu tenho coisas a trabalhar, mas a coisa mais estranha é que havia originalmente nenhuma pasta c:\temp
no servidor.
Para obter uma correção temporária Eu criei uma pasta c:\temp
e definir as permissões relevantes para a conta de usuário anônimo do site. Mas porque esta é uma caixa compartilhada eu não podia deixar as coisas dessa maneira, mesmo que os arquivos temporários foram sendo excluído. Para cortar uma longa história curta, eu renomeado a pasta c:\temp
para algo diferente e magicamente o '.\
' caminho pasta correta estava sendo devolvidos. Notei também que o cliente tinha permitido extensões do FrontPage no site, que remove o acesso de escrita para a conta de usuário anônimo nas pastas do site, assim que esta permissão necessária re-aplicação. Eu ainda estou em uma perda a respeito de porque no início desta questão CGITempFile()
estava retornando c:\temp
, embora essa pasta não existia, e por isso magicamente começou a trabalhar novamente.
Solução
O nome do diretório temporário é realizada em $CGITempFile::TMPDIRECTORY
e inicializado na função find_tempdir
em CGI.pm.
O algoritmo para escolher o diretório temporário é descrito na documentação CGI.pm (procurar -private_tempfiles ).
IIUC, se uma pasta C: \ Temp existe no servidor, CGI.pm vai usá-lo. Se nenhum dos diretórios check-in exist find_tempdir
, em seguida, o diretório atual "" é usado.
Espero que isso ajude.
Outras dicas
Nem a resposta directa à sua pergunta, mas você já tentou usar File :: Temp ?
Ele é projetado especificamente para trabalhar em qualquer sistema operacional.
Se você estiver executando este script como você, verifique a variável de ambiente% TEMP% para ver se se for diferente.
Se o IIS está em execução, verifique os valores no registro para TMP e TEMP sob HKEY_USERS / .DEFAULT / Meio Ambiente