Estoy escribiendo un archivo por lotes para ejecutar algunos otros programas. En este caso, necesito solicitar una contraseña. ¿Tengo alguna forma de enmascarar el texto de entrada? No necesito imprimir caracteres ******* en lugar de introducir caracteres. El comportamiento de solicitud de contraseña de Linux (no imprima nada mientras escribe) es suficiente.
@echo off
SET /P variable=Password :
echo %variable%
Pause
Esto leerá la entrada pero no puedo enmascarar el texto usando este enfoque.
batch-file
cmd
command-prompt
Chathuranga Chandrasekara
fuente
fuente
Respuestas:
Hasta XP y Server 2003, puede hacer uso de otra herramienta incluida (VBScript): los dos scripts siguientes hacen el trabajo que desea.
Primero
getpwd.cmd
:Entonces
getpwd.vbs
,:los
getpwd.vbs
simplemente utiliza el objeto contraseña que introduzca la contraseña del usuario y luego imprimir en la salida estándar (el párrafo siguiente explicará por qué no se presenta en el terminal).los
getpwd.cmd
script de comando es un poco más complicado, pero básicamente funciona de la siguiente manera.El efecto del
"<nul: set /p passwd=Password: "
comando es generar el indicador sin un carácter de nueva línea al final; es una forma engañosa de emular el"echo -n"
comando desde elbash
shell. Se establecepasswd
en una cadena vacía como un efecto secundario irrelevante y no espera la entrada, ya que la toma delnul:
dispositivo.La
"for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"
declaración es la parte más complicada. Ejecuta VBScript sin "publicidad" de Microsoft, por lo que la única salida de línea es la contraseña (de VBscript"Wscript.StdOut.WriteLine strPassword"
.No es necesario establecer los delimitadores en nada para capturar una línea de entrada completa con espacios; de lo contrario, solo obtiene la primera palabra. los
"for ... do set ..."
bit se establecepasswd
como la salida de contraseña real de VBScript.Luego hacemos eco de una línea en blanco (para terminar la
"Password: "
línea) y la contraseña estará en elpasswd
variable de entorno después de que se haya ejecutado el código.Ahora, como se mencionó,
scriptpw.dll
solo está disponible hasta XP / 2003. Para rectificar esto, simplemente puede copiar elscriptpw.dll
archivo de laWindows\System32
carpeta de un sistema XP / 2003 a la carpetaWinnt\System32
oWindows\System32
en su propio sistema. Una vez que se haya copiado la DLL, deberá registrarla ejecutando:Para registrar correctamente la DLL en Vista y versiones posteriores, necesitará privilegios de administrador. No he examinado la legalidad de un movimiento así, lector de cuevas.
Si no está demasiado interesado en intentar rastrear y registrar archivos DLL más antiguos (por conveniencia o razones legales), existe otra forma. Versiones posteriores de Windows (las que no tienen la DLL requerida) deberían tener Powershell disponible para usted.
Y, de hecho, debería considerar actualizar sus scripts para usarlos por completo, ya que es un lenguaje de scripting mucho más capaz que
cmd.exe
. Sin embargo, si desea mantener la mayor parte de su código comocmd.exe
scripts (por ejemplo, si tiene un muchos código que no desea convertir), puede usar el mismo truco.Primero, modifique el
cmd
script para que llame a Powershell en lugar de CScript:El script de Powershell es igualmente simple:
aunque con algunas referencias para obtener el texto real de la contraseña.
Recuerde que, para ejecutar scripts de Powershell locales sin firmar en su máquina, es posible que deba modificar la política de ejecución del valor predeterminado (draconiano, aunque muy seguro), con algo como:
desde dentro de Powershell.
fuente
scriptpw.dll
.Sí, llego 4 años tarde.
Pero encontré una manera de hacer esto en una línea sin tener que crear un script externo; llamando a los comandos de PowerShell desde un archivo por lotes.
Gracias a TessellatesHeckler, sin generar un archivo de texto (configuré el comando powershell en una variable, porque es bastante complicado en una línea larga dentro de un bucle for).
Originalmente lo escribí para enviarlo a un archivo de texto, luego lo leí desde ese archivo de texto. Pero el método anterior es mejor. En una línea extremadamente larga, casi incomprensible:
Desglosaré esto: puedes dividirlo en unas pocas líneas usando el símbolo de intercalación
^
, que es mucho mejor ...Este artículo explica qué están haciendo los comandos de PowerShell; esencialmente obtiene entrada usando
Read-Host -AsSecureString
: las siguientes dos líneas convierten esa cadena segura nuevamente en texto sin formato, la salida (contraseña de texto sin formato) se envía a un archivo de texto usando>.tmp.txt
. Luego, ese archivo se lee en una variable y se elimina.fuente
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
y luegoecho %password%
. NÓTESE BIEN. No puedo hacer que este comentario escape correctamente a las comillas inversas: antes de "powershell" y antes del final ")" hay dos comillas inversas, pero debería ser una tilde.Solución por lotes pura que (ab) usa el
XCOPY
comando y sus/P /L
interruptores que se encuentran aquí (algunas mejoras en esto se pueden encontrar aquí ):1.2 Otra forma basada en el comando reemplazar
2. Remitente de contraseña que utiliza una ventana emergente de HTA . Este es un archivo hybrit .bat / jscript / mshta y debe guardarse como .bat :
3. Un .net híbrido autocompilado .De nuevo debe guardarse como
.bat
.A diferencia de otras soluciones, creará / compilará un pequeño archivo .exe que se llamará (si lo desea, puede eliminarlo). También requiere un marco .net instalado, pero eso no es un problema:fuente
Probablemente solo haría:
Entonces recibe un mensaje, luego la pantalla se borra después de ingresar.
Tenga en cuenta que la contraseña ingresada se almacenará en el historial de CMD si el archivo por lotes se ejecuta desde un símbolo del sistema (Gracias @Mark K Cowan ).
Si eso no fuera lo suficientemente bueno, cambiaría a Python o escribiría un ejecutable en lugar de un script.
Sé que ninguna de estas son sociones perfectas, pero tal vez una sea lo suficientemente buena para ti :)
fuente
doskey /reinstall
para borrar el búfer de comandos anterior inmediatamente despuéscls
, si el historial de comandos en la consola no es importante para usted.C:\>start "console" cmd /c ireadconsole.bat
Puede utilizar la subrutina ReadFormattedLine para todo tipo de entrada formateada. Por ejemplo, el siguiente comando lee una contraseña de 8 caracteres, muestra asteriscos en la pantalla y continúa automáticamente sin necesidad de presionar Enter:
Esta subrutina está escrita en Batch puro por lo que no requiere ningún programa adicional, y permite varias operaciones de entrada formateadas, como leer solo números, convertir letras a mayúsculas, etc. Puede descargar la subrutina ReadFormattedLine desde Leer una línea con un formato específico .
EDITAR 2018-08-18 : Nuevo método para ingresar una contraseña "invisible"
El comando FINDSTR tiene un error extraño que ocurre cuando este comando se usa para mostrar caracteres en color Y la salida de dicho comando se redirige al dispositivo CON. Para obtener detalles sobre cómo usar el comando FINDSTR para mostrar texto en color, consulte este tema .
Cuando la salida de esta forma de comando FINDSTR se redirige a CON, sucede algo extraño después de que el texto se imprime en el color deseado: todo el texto después de que sale como caracteres "invisibles", aunque una descripción más precisa es que el texto es salida como texto negro sobre fondo negro. El texto original aparecerá si usa el comando COLOR para restablecer los colores de primer plano y fondo de toda la pantalla. Sin embargo, cuando el texto es "invisible" podríamos ejecutar un comando SET / P, por lo que todos los caracteres ingresados no aparecerán en la pantalla.
fuente
otra alternativa son mis herramientas de línea de comandos EditV32 (x86) o EditV64 (x64). Por ejemplo:
-m significa "entrada enmascarada" y -p es el indicador. La entrada del usuario se almacena en la variable de entorno PWD. Puedes obtenerlo aqui:
https://westmesatech.com/?page_id=19
fuente
Si la falta de código fuente te molesta, tengo otra alternativa.
Puede obtenerlo en https://westmesatech.com/?page_id=49 . Se incluye el código fuente.
fuente
Si tiene Python instalado, puede usar:
La salida:
fuente
Utilicé la solución anterior de Blorgbeard, que en mi opinión es genial. Luego lo mejoré de la siguiente manera:
Úselo así:
Esto cambia la consola a gris sobre gris para la entrada de su contraseña y vuelve a cambiar cuando haya terminado. El ESC debería ser un carácter no imprimible, que puede copiar del archivo de texto de muestra descargado (aparece como una flecha hacia la izquierda en el Bloc de notas) en su archivo por lotes. Puede utilizar el archivo de texto de muestra para encontrar los códigos de todas las combinaciones de colores.
Si no es el administrador de la máquina, probablemente podrá instalar los archivos en un directorio que no sea del sistema, luego deberá agregar el directorio a la RUTA en su script antes de llamar al programa y usar las secuencias de escape. Probablemente, este podría ser el directorio actual, si necesita un paquete distribuible que no sea de administrador de solo unos pocos archivos.
fuente
cree un archivo por lotes que llame al que se necesita para los caracteres invisibles y luego cree un acceso directo para el archivo por lotes que se está llamando.
botón derecho del ratón
propiedades
colores
texto == negro
fondo == negro
aplicar
Okay
Espero que así te ayude !!!!!!!!
fuente
ACTUALIZACIÓN:
agregué dos nuevos métodos que, en lugar de utilizar cls para ocultar la entrada, crean una nueva ventana emergente con una sola línea.
Los inconvenientes son que un método (método 2) deja basura en el registro - "Si se ejecuta sin los derechos adecuados", y el otro (método tres) agrega algo de basura al script. No hace falta decir que se puede escribir fácilmente en cualquier archivo tmp y eliminarlo. Intenté encontrar una alternativa.
Limitación: La contraseña solo puede ser alfanumérica, ¡sin otros caracteres!
Actualización: Encontré que la publicación de sachadee era perfecta y solo le agregué mi peculiaridad "emergente".
fuente
Escribí un programa de código abierto llamado
editenv
que reemplaza mis antiguaseditv32
/editv64
utilidades:https://github.com/Bill-Stewart/editenv
La opción
--maskinput
(-m
) [*] le permite ocultar (enmascarar) la entrada escrita y tiene un carácter configurable (el carácter predeterminado es*
); p.ej:La opción
--prompt
(-p
) le permite especificar una solicitud de entrada. Lo anterior mostrará unPassword:
mensaje y esperará a que ingrese algo. Los caracteres escritos aparecerán como*
. Al presionar Ctrl+ Cfinalizará el programa con un código de salida de 1223.La descarga está aquí:
https://github.com/Bill-Stewart/editenv/releases
[*] Tenga en cuenta que la opción
--maskinput
(-m
) no es segura : la cadena ingresada se ingresa como texto sin formato en el entorno. Esta función es solo para su comodidad.fuente
Este puede ser un tema más antiguo, pero si está usando Windows Vista o 7, tengo una solución que funcionará muy bien. Hice un video de esto aquí: http://www.youtube.com/watch?v=mk8uAa6PIFM
Pastebin para el archivo por lotes está aquí
fuente
fuente
Otra opción, en la misma línea que Blorgbeard está fuera , es usar algo como:
El
^
escapa>
para que la solicitud de contraseña se vea como una solicitud de consola cmd estándar.fuente
Leí todas las soluciones torpes en la red sobre cómo enmascarar contraseñas en un archivo por lotes, las que usan una solución de hide.com e incluso las que hacen que el texto y el fondo tengan el mismo color. La solución hide.com funciona decente, no es muy segura y no funciona en Windows de 64 bits. De todos modos, usando utilidades 100% de Microsoft, ¡hay una manera!
Primero, déjame explicarte mi uso. Tengo alrededor de 20 estaciones de trabajo que inician sesión automáticamente en Windows. Tienen un acceso directo en su escritorio: una aplicación clínica. Las máquinas están bloqueadas, no pueden hacer clic con el botón derecho, no pueden hacer nada más que acceder a un acceso directo en su escritorio. A veces es necesario que un técnico inicie algunas aplicaciones de depuración, explore el explorador de Windows y observe los archivos de registro sin cerrar la cuenta de usuario de autolog.
Así que esto es lo que hice.
Hágalo como desee, pero pongo mis dos archivos por lotes en un recurso compartido de red al que tiene acceso la computadora bloqueada.
Mi solución utiliza 1 componente principal de Windows: runas. Ponga un acceso directo en los clientes al runas.bat que está a punto de crear. Para su información, en mis clientes cambié el nombre del acceso directo para una mejor visualización y cambié el icono.
Deberá crear dos archivos por lotes.
Nombré los archivos por lotes runas.bat y Debug Support.bat
runas.bat contiene el siguiente código:
Puede agregar tantos si "% un%" y si no "% un%" para todos los usuarios a los que desea dar acceso. El @ping es mi forma coonass de hacer un temporizador de segundos.
Así que eso se encarga del primer archivo por lotes, bastante simple, ¿eh?
Aquí está el código de Debug Support.bat:
No soy un codificador y realmente comencé a hacer scripts por lotes hace aproximadamente un año, ¡y esta forma redonda que descubrí de enmascarar una contraseña en un archivo por lotes es bastante impresionante!
¡Espero escuchar que alguien que no sea yo pueda aprovecharlo!
fuente