Estou escrevendo um arquivo em lote para executar alguns outros programas. Nesse caso, preciso solicitar uma senha. Eu tenho alguma maneira de mascarar o texto de entrada? Não preciso imprimir caracteres ******* em vez de caracteres de entrada. O comportamento do prompt de senha do Linux (não imprimir nada ao digitar) é suficiente.
@echo off
SET /P variable=Password :
echo %variable%
Pause
Isso lerá a entrada, mas não consigo mascarar o texto usando essa abordagem.
batch-file
cmd
command-prompt
Chathuranga Chandrasekara
fonte
fonte
Respostas:
Até o XP e o Server 2003, você pode usar outra ferramenta incluída (VBScript) - os dois scripts a seguir fazem o trabalho que você deseja.
Primeiro
getpwd.cmd
:Então
getpwd.vbs
,:O
getpwd.vbs
simplesmente usa o objeto de senha para inserir a senha do usuário e depois imprime na saída padrão (o próximo parágrafo irá explicar por que isso não aparece no terminal).O
getpwd.cmd
script de comando é um pouco mais complicado, mas basicamente funciona da seguinte maneira.O efeito do
"<nul: set /p passwd=Password: "
comando é produzir o prompt sem nenhum caractere de nova linha à direita - é uma maneira sorrateira de emular o"echo -n"
comando dobash
shell. Ele é definidopasswd
como uma string vazia como um efeito colateral irrelevante e não espera pela entrada, pois está recebendo a entrada donul:
dispositivo.A
"for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"
declaração é a parte mais complicada. Ele executa o VBScript sem "publicidade" da Microsoft, de modo que a única saída de linha é a senha (do VBscript"Wscript.StdOut.WriteLine strPassword"
.Definir os delimitadores para zero é necessário para capturar uma linha de entrada inteira com espaços, caso contrário, você apenas obterá a primeira palavra. O
"for ... do set ..."
bit é definidopasswd
como a saída de senha real do VBScript.Em seguida, ecoamos uma linha em branco (para encerrar a
"Password: "
linha) e a senha estará napasswd
variável de ambiente após a execução do código.Agora, conforme mencionado,
scriptpw.dll
está disponível apenas até XP / 2003. Para corrigir isso, você pode simplesmente copiar oscriptpw.dll
arquivo daWindows\System32
pasta de um sistema XP / 2003 para a pastaWinnt\System32
ouWindows\System32
em seu próprio sistema. Depois que a DLL for copiada, você precisará registrá-la executando:Para registrar com êxito a DLL no Vista e posterior, você precisará de privilégios de administrador. Eu não examinei a legalidade de tal movimento, então leitor das cavernas.
Se você não estiver muito interessado em rastrear e registrar arquivos DLL mais antigos (por conveniência ou por motivos legais), existe outra maneira. Versões posteriores do Windows (aquelas que não têm a DLL necessária) devem ter o Powershell disponível para você.
E, de fato, você realmente deve considerar atualizar seus scripts para usá-los totalmente, já que é uma linguagem de script muito mais capaz do que
cmd.exe
. No entanto, se você deseja manter a maior parte do seu código comocmd.exe
scripts (por exemplo, se você tiver muitos códigos que não deseja converter), pode usar o mesmo truque.Primeiro, modifique o
cmd
script para que ele chame Powershell em vez de CScript:O script Powershell é igualmente simples:
embora com algum empacotamento para obter o texto da senha real.
Lembre-se de que, para executar scripts Powershell locais não assinados em sua máquina, você pode precisar modificar a política de execução do padrão (draconiano, embora muito seguro), com algo como:
de dentro do próprio Powershell.
fonte
scriptpw.dll
.Sim - estou 4 anos atrasado.
Mas descobri uma maneira de fazer isso em uma linha, sem precisar criar um script externo; chamando comandos do PowerShell de um arquivo em lote.
Graças a TessellatingHeckler - sem enviar para um arquivo de texto (eu defini o comando powershell em uma variável, porque é muito confuso em uma linha longa dentro de um loop for).
Originalmente, eu o escrevi para gerar um arquivo de texto e depois li esse arquivo de texto. Mas o método acima é melhor. Em uma linha extremamente longa e quase incompreensível:
Vou dividir isso - você pode dividir em algumas linhas usando o cursor
^
, que é muito melhor ...Este artigo explica o que os comandos do PowerShell estão fazendo; essencialmente, ele obtém a entrada usando
Read-Host -AsSecureString
- as duas linhas a seguir convertem aquela string segura de volta em texto simples, a saída (senha em texto simples) é então enviada para um arquivo de texto usando>.tmp.txt
. Esse arquivo é então lido em uma variável e excluído.fonte
for /f "usebackq tokens=*" %%p in (``powershell -Command "$pword = read-host 'Enter Password' -AsSecureString ; $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)"``) do set password=%%p
e entãoecho %password%
. NB. Não consigo fazer com que este comentário escape de crases corretamente - antes de "powershell" e antes do final ")" são duas crases, mas devem ser uma crase.1. Solução em lote pura que (ab) usa o
XCOPY
comando e suas/P /L
opções encontradas aqui (algumas melhorias podem ser encontradas aqui ):1.2 Outra forma baseada no comando de substituição
2. Submissor de senha que usa um pop-up HTA . Este é um arquivo hybrit .bat / jscript / mshta e deve ser salvo como um .bat :
3. Um .net híbrido auto-compilado .Again deve ser salvo como
.bat
. Ao contrário de outras soluções, ele criará / compilará um pequeno arquivo .exe que será chamado (se desejar, pode excluí-lo). Também requer estrutura .net instalada, mas isso não é um problema:fonte
Eu provavelmente faria apenas:
Assim, você recebe um prompt e a tela é limpa depois de inserida.
Observe que a senha inserida será armazenada no histórico do CMD se o arquivo em lote for executado a partir de um prompt de comando (Obrigado @Mark K Cowan ).
Se isso não fosse bom o suficiente, eu mudaria para o python ou escreveria um executável em vez de um script.
Eu sei que nenhuma dessas são soluções perfeitas, mas talvez uma seja boa o suficiente para você :)
fonte
doskey /reinstall
para limpar o buffer de comando anterior imediatamente apóscls
, se o histórico de comando no console não for importante para você.C:\>start "console" cmd /c ireadconsole.bat
Você pode usar a sub-rotina ReadFormattedLine para todos os tipos de entrada formatada. Por exemplo, o comando abaixo lê uma senha de 8 caracteres, exibe asteriscos na tela e continua automaticamente sem a necessidade de pressionar Enter:
Esta sub-rotina é escrita em puro Lote, portanto, não requer nenhum programa adicional e permite várias operações de entrada formatadas, como ler apenas números, converter letras em maiúsculas, etc. Você pode baixar a sub-rotina ReadFormattedLine em Ler uma linha com formato específico .
EDITAR 18/08/2018 : Novo método para inserir uma senha "invisível"
O comando FINDSTR tem um bug estranho que acontece quando este comando é usado para mostrar caracteres em cores E a saída de tal comando é redirecionada para o dispositivo CON. Para obter detalhes sobre como usar o comando FINDSTR para mostrar texto em cores, consulte este tópico .
Quando a saída desta forma do comando FINDSTR é redirecionada para CON, algo estranho acontece depois que o texto é gerado na cor desejada: todo o texto depois dele é produzido como caracteres "invisíveis", embora uma descrição mais precisa é que o texto é saída como texto preto sobre fundo preto. O texto original aparecerá se você usar o comando COLOR para redefinir as cores de primeiro e segundo plano de toda a tela. Porém, quando o texto está "invisível" podemos executar um comando SET / P, de forma que todos os caracteres inseridos não apareçam na tela.
fonte
outra alternativa são minhas ferramentas de linha de comando EditV32 (x86) ou EditV64 (x64). Por exemplo:
-m significa "entrada mascarada" e -p é o prompt. A entrada do usuário é armazenada na variável de ambiente PWD. Você pode obtê-lo aqui:
https://westmesatech.com/?page_id=19
fonte
Se a falta de código-fonte o incomoda, tenho outra alternativa.
Você pode obtê-lo em https://westmesatech.com/?page_id=49 . O código-fonte está incluído.
fonte
Se você tiver o Python instalado, poderá usar:
a saída:
fonte
Eu usei a solução de Blorgbeard acima, que é realmente ótima na minha opinião. Então eu o aprimorei da seguinte maneira:
Use-o assim:
Isso muda o console para cinza em cinza para a entrada da senha e volta quando você terminar. O ESC deve ser, na verdade, um caractere não imprimível, que você pode copiar do arquivo de texto de amostra baixado (aparece como uma seta para a esquerda no Bloco de notas) para o arquivo em lote. Você pode usar o arquivo de texto de amostra para encontrar os códigos para todas as combinações de cores.
Se você não for o administrador da máquina, provavelmente conseguirá instalar os arquivos em um diretório que não seja do sistema, então terá que anexar o diretório ao PATH em seu script antes de chamar o programa e usar as sequências de escape. Provavelmente, este pode até ser o diretório atual, se você precisar de um pacote distribuível não administrativo de apenas alguns arquivos.
fonte
faça um arquivo em lote que chame aquele necessário para caracteres invisíveis e, em seguida, faça um atalho para o arquivo em lote que está sendo chamado.
clique direito
propriedades
cores
texto == preto
fundo == preto
Aplique
Está bem
espero assim te ajude !!!!!!!!
fonte
ATUALIZAÇÃO:
adicionei dois novos métodos que, em vez de utilizar cls para ocultar a entrada, criam um novo pop-up com apenas uma linha.
As desvantagens são que um método (método 2) deixa lixo no registro - "Se executado sem os direitos apropriados", e o outro (método três) adiciona lixo ao script. Desnecessário dizer que ele pode ser facilmente gravado em qualquer arquivo tmp e excluído. Eu apenas tentei pensar em uma alternativa.
Limitação: A senha só pode ser alfanumérica - sem outros caracteres!
Atualização: achei a postagem de sachadee perfeita e acabei de adicionar minha peculiaridade "pop-up" a ela.
fonte
Eu escrevi um programa de código aberto chamado
editenv
que substitui meuseditv32
/editv64
utilitários mais antigos :https://github.com/Bill-Stewart/editenv
A opção
--maskinput
(-m
) [*] permite ocultar (mascarar) a entrada digitada e tem um caractere configurável (o caractere padrão é*
); por exemplo:A opção
--prompt
(-p
) permite especificar um prompt de entrada. OPassword:
item acima exibirá um prompt e esperará que você insira algo. Os caracteres digitados aparecerão como*
. Pressionar Ctrl+ Cencerrará o programa com um código de saída 1223.O download está aqui:
https://github.com/Bill-Stewart/editenv/releases
[*] Observe que a opção
--maskinput
(-m
) não é segura - a string inserida é inserida como texto simples no ambiente. Este recurso é apenas para conveniência.fonte
Este pode ser um tópico antigo, mas se você estiver usando o Windows Vista ou 7, tenho uma solução que funcionará muito bem. Fiz um vídeo disso aqui: http://www.youtube.com/watch?v=mk8uAa6PIFM
Pastebin para o arquivo em lote está aqui
fonte
fonte
Outra opção, na mesma linha que Blorgbeard está fora de questão, é usar algo como:
O
^
escapa do>
para que o prompt de senha pareça um prompt de console cmd padrão.fonte
Eu li todas as soluções desajeitadas na rede sobre como mascarar senhas em um arquivo em lote, as que usam uma solução hide.com e até as que fazem o texto e o fundo da mesma cor. A solução hide.com funciona decentemente, não é muito segura e não funciona no Windows de 64 bits. De qualquer forma, usando utilitários 100% Microsoft, existe uma maneira!
Primeiro, deixe-me explicar meu uso. Tenho cerca de 20 estações de trabalho que fazem logon automático no Windows. Eles têm um atalho em sua área de trabalho - para um aplicativo clínico. As máquinas estão bloqueadas, eles não podem clicar com o botão direito, eles não podem fazer nada além de acessar o atalho em sua área de trabalho. Às vezes, é necessário que um técnico execute alguns aplicativos de depuração, navegue no Windows Explorer e examine os arquivos de log sem fazer logoff da conta do usuário do autolog.
Então aqui está o que eu fiz.
Faça como quiser, mas coloquei meus dois arquivos em lote em um compartilhamento de rede ao qual o computador bloqueado tem acesso.
Minha solução utiliza 1 componente principal do Windows - runas. Coloque um atalho nos clientes para o runas.bat que você está prestes a criar. Para sua informação, em meus clientes, renomeei o atalho para uma melhor visualização e mudei o ícone.
Você precisará criar dois arquivos em lote.
Chamei os arquivos em lote de runas.bat e Debug Support.bat
runas.bat contém o seguinte código:
Você pode adicionar tantos se "% un%" e se não "% un%" para todos os usuários aos quais deseja dar acesso. O @ping é minha maneira de fazer um cronômetro de segundos.
Então isso cuida do primeiro arquivo em lote - muito simples, não é?
Aqui está o código para Debug Support.bat:
Não sou um programador e na verdade comecei a trabalhar com scripts em lote há cerca de um ano, e essa maneira geral que descobri de mascarar uma senha em um arquivo em lote é incrível!
Espero ouvir que outra pessoa além de mim possa tirar algum proveito disso!
fonte