Скрыть ввод в пакетном файле

Мне было интересно, как я могу скрыть ввод команды set / p в пакетном файле.

set / p Password = Какой у вас пароль?

Все мы знаем, что, введя свой пароль, вы сможете его увидеть. Как мне это скрыть?

Я пробовал conset.exe из здесь. И использовал:

conset / PH Password = Какой у вас пароль?

И я получаю «Conset: Error setting variable» :(

Другая идея, которая у меня возникла, заключалась в том, чтобы изменить цвет окна консоли. Но как я мог изменить цвет в той же строке? Чтобы вы могли видеть вопрос, но не видеть ответа?

Есть идеи от профи?


person James    schedule 02.05.2011    source источник
comment
Возможный дубликат stackoverflow.com/questions/286871/   -  person nobody    schedule 25.06.2014
comment
Возможный дубликат Могу ли я замаскировать вводимый текст в летучей мыши файл   -  person Mofi    schedule 29.03.2016


Ответы (4)


Вероятно, вы можете посмотреть ответы здесь: Могу ли я замаскировать вводный текст в bat-файле

Я думаю, что EditV32.exe и EditV64.exe - лучшие варианты, которые у вас есть (и, поскольку вы согласились использовать conset, который, насколько я знаю, не поставляется с Windows, я не думаю, что вы возражаете против использования editv?)

http://www.westmesatech.com/editv.html

Также: http://social.technet.microsoft.com/Forums/en-US/ITCG/thread/7d2d92a5-5d59-4954-bf3e-22eeb5cf0ee6/

person manojlds    schedule 02.05.2011
comment
Обратите внимание, что мои _1 _ / _ 2_ утилиты были заменены моей утилитой с открытым исходным кодом editenv. - person Bill_Stewart; 16.07.2020

1. Чистое пакетное решение, в котором (ab) используется команда XCOPY и ее /P /L переключатели, найденные здесь:

:: Hidden.cmd
::Tom Lavedas, 02/05/2013, 02/20/2013
::Carlos, 02/22/2013
::https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/f7mb_f99lYI


@Echo Off
:HInput
SetLocal EnableExtensions EnableDelayedExpansion
Set "FILE=%Temp%.\T"
Set "FILE=.\T"
Keys List >"%File%"
Set /P "=Hidden text ending with Ctrl-C?: " <Nul
Echo.
Set "HInput="
:HInput_
For /F "tokens=1* delims=?" %%A In (
 '"Xcopy /P /L "%FILE%" "%FILE%" 2>Nul"'
) Do (
  Set "Text=%%B"
  If Defined Text (
    Set "Char=!Text:~1,1!"
    Set "Intro=1"
    For /F delims^=^ eol^= %%Z in ("!Char!") Do Set "Intro=0"
    Rem If press Intro
    If 1 Equ !Intro! Goto :HInput#
    Set "HInput=!HInput!!Char!"
  )
)
Goto :HInput_
:HInput#
Echo(!HInput!
Goto :Eof 

2.1 Другой способ, основанный на команде replace

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

Set /P "=Enter a Password:" < Nul
Call :PasswordInput
Echo(Your input was:!Line!

Goto :Eof

:PasswordInput
::Author: Carlos Montiers Aguilera
::Last updated: 20150401. Created: 20150401.
::Set in variable Line a input password
For /F skip^=1^ delims^=^ eol^= %%# in (
'"Echo(|Replace.exe "%~f0" . /U /W"') Do Set "CR=%%#"
For /F %%# In (
'"Prompt $H &For %%_ In (_) Do Rem"') Do Set "BS=%%#"
Set "Line="
:_PasswordInput_Kbd
Set "CHR=" & For /F skip^=1^ delims^=^ eol^= %%# in (
'Replace.exe "%~f0" . /U /W') Do Set "CHR=%%#"
If !CHR!==!CR! Echo(&Goto :Eof
If !CHR!==!BS! (If Defined Line (Set /P "=!BS! !BS!" <Nul
Set "Line=!Line:~0,-1!"
)
) Else (Set /P "=*" <Nul
If !CHR!==! (Set "Line=!Line!^!"
) Else Set "Line=!Line!!CHR!"
)
Goto :_PasswordInput_Kbd

2. Средство отправки пароля, которое использует всплывающее окно HTA. Это гибридный файл .bat / jscript / mshta, и он должен быть сохраненным как .bat:

<!-- :
:: PasswordSubmitter.bat
@echo off
for /f "tokens=* delims=" %%p in ('mshta.exe "%~f0"') do (
    set "pass=%%p"
)

echo your password is %pass%
exit /b
-->

<html>
<head><title>Password submitter</title></head>
<body>

    <script language='javascript' >
        function pipePass() {
            var pass=document.getElementById('pass').value;
            var fso= new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1);
            close(fso.Write(pass));

        }
    </script>

    <input type='password' name='pass' size='15'></input>
    <hr>
    <button onclick='pipePass()'>Submit</button>

</body>
</html>

3. Самостоятельно скомпилированный гибрид .net < / strong>. Снова следует сохранить как .bat. В отличие от других решений он создаст / скомпилирует небольшой файл .exe, который будет вызываться (при желании вы можете его удалить). Также требуется установленный .net framework, но это не проблема:

@if (@X)==(@Y) @end /* JScript comment
@echo off
setlocal enableDelayedExpansion
for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do (
   set "jsc=%%v"
)
if not exist "%~n0.exe" (
    "%jsc%" /nologo /out:"%~n0.exe" "%~dpsfnx0"
)

for /f "tokens=* delims=" %%p in ('"%~n0.exe"') do (
    set "pass=%%p"
)
echo your password is !pass!

endlocal & exit /b %errorlevel%
*/

import System;

var pwd = "";
var key;
Console.Error.Write("Enter password: ");

        do {
           key = Console.ReadKey(true);

           if ( (key.KeyChar.ToString().charCodeAt(0)) >= 20 && (key.KeyChar.ToString().charCodeAt(0) <= 126) ) {
              pwd=pwd+(key.KeyChar.ToString());
              Console.Error.Write("*");
           }

           if ( key.Key == ConsoleKey.Backspace && pwd.Length > 0 ) {
               pwd=pwd.Remove(pwd.Length-1);
               Console.Error.Write("\b \b");
           }   
        } while (key.Key != ConsoleKey.Enter);
        Console.Error.WriteLine();
        Console.WriteLine(pwd);
person npocmaka    schedule 24.06.2014
comment
Хороший ответ, но xcopy.exe не является чисто пакетным решением. Насколько мне известно, нет никакого чистого пакетного решения. - person Eryk Sun; 18.06.2017

Хорошо, значит, ответ приходит 9 лет спустя, но я думаю, лучше поздно, чем никогда ...

Я написал инструмент editv32 / editv64, указанный в отмеченном ответе, но с тех пор я написал немного лучший инструмент:

https://github.com/Bill-Stewart/editenv

Инструмент бесплатный и с открытым исходным кодом. Бинарная загрузка доступна на вкладке Releases.

Параметр --maskinput (-m) позволяет маскировать ввод (необязательно с помощью определяемого пользователем символа). Обратите внимание, что эта функция НЕ БЕЗОПАСНА (значение переменной все еще находится в памяти, а среда в виде обычного текста) - это только для удобства.

Я чаще всего использую этот инструмент для интерактивного редактирования переменной Path для текущего процесса (оказалось, что для этой цели он очень удобен).

person Bill_Stewart    schedule 01.04.2020

У меня сработал простой код

:CVSPassword
echo hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5>hide.com
set /P cvspassword=Please enter CVS Password:: <nul
for /f "tokens=*" %%i in ('hide.com') do set cvspassword=%%i
IF "%cvspassword%"=="" GOTO CVSPassword
echo cvspassword %cvspassword%
person Vinayak Dornala    schedule 07.07.2015
comment
hide.com? Где это находится? (и разве это не 16-битное приложение, которое не работает в 64-битных окнах?) - person Stephan; 07.07.2015
comment
Забыл добавить команду echo, которая создаст файл hide.com, который используется для сокрытия пароля. - person Vinayak Dornala; 07.07.2015
comment
@Stephan верен, это не работает в 64-битной ОС. - person Bill_Stewart; 02.04.2020