Piszę plik wsadowy, aby wykonać inne programy. W takim przypadku muszę poprosić o hasło. Czy mogę w jakiś sposób zamaskować wprowadzany tekst? Nie muszę drukować znaków ******* zamiast znaków wejściowych. Wystarczające jest zachowanie monitu o hasło w Linuksie (nic nie drukuj podczas pisania).
@echo off
SET /P variable=Password :
echo %variable%
Pause
Spowoduje to odczytanie danych wejściowych, ale nie mogę zamaskować tekstu przy użyciu tego podejścia.
batch-file
cmd
command-prompt
Chathuranga Chandrasekara
źródło
źródło
Odpowiedzi:
Do XP i Server 2003 możesz użyć innego dołączonego narzędzia (VBScript) - dwa poniższe skrypty wykonają zadanie, które chcesz.
Po pierwsze
getpwd.cmd
:Następnie
getpwd.vbs
:Po
getpwd.vbs
prostu używa obiektu password do wprowadzenia hasła od użytkownika, a następnie wypisuje je na standardowe wyjście (następny akapit wyjaśnia, dlaczego nie pojawia się to w terminalu).getpwd.cmd
Skrypt poleceń jest nieco trudniejsze, ale to w zasadzie działa w następujący sposób.Efektem
"<nul: set /p passwd=Password: "
polecenia jest wyświetlenie zachęty bez końcowego znaku nowej linii - jest to sprytny sposób na emulację"echo -n"
polecenia zbash
powłoki. Ustawiapasswd
pusty łańcuch jako nieistotny efekt uboczny i nie czeka na dane wejściowe, ponieważ pobiera dane wejściowe znul:
urządzenia.To
"for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"
stwierdzenie jest najtrudniejsze. Uruchamia VBScript bez "reklam" Microsoftu, więc jedyną linią wyjściową jest hasło (z VBscript"Wscript.StdOut.WriteLine strPassword"
.Ustawienie ograniczników na zero jest wymagane, aby przechwycić cały wiersz wejściowy ze spacjami, w przeciwnym razie otrzymasz tylko pierwsze słowo. Te
"for ... do set ..."
zestawy bitówpasswd
być rzeczywista moc hasło z VBScript.Następnie wywołujemy echo pustej linii (aby zakończyć
"Password: "
linię), a hasło będzie wpasswd
zmiennej środowiskowej po uruchomieniu kodu.Teraz, jak wspomniano,
scriptpw.dll
jest dostępny tylko do XP / 2003. Aby to naprawić, możesz po prostu skopiowaćscriptpw.dll
plik zWindows\System32
folderu systemu XP / 2003 do folderuWinnt\System32
lubWindows\System32
we własnym systemie. Po skopiowaniu biblioteki DLL należy ją zarejestrować, uruchamiając:Aby pomyślnie zarejestrować bibliotekę DLL w systemie Vista lub nowszym, będziesz potrzebować uprawnień administratora. Nie badałem legalności takiego posunięcia, więc jaskiniowiec.
Jeśli nie jesteś przesadnie zainteresowany próbami wyśledzenia i zarejestrowania starszych plików DLL (dla wygody lub ze względów prawnych), istnieje inny sposób. Późniejsze wersje systemu Windows (te, które nie mają wymaganej biblioteki DLL) powinny mieć dostępny program PowerShell.
I faktycznie, naprawdę powinieneś rozważyć uaktualnienie swoich skryptów, aby w pełni go używać, ponieważ jest to znacznie bardziej wydajny język skryptowy niż
cmd.exe
. Jeśli jednak chcesz zachować większość swojego kodu jakocmd.exe
skrypty (na przykład jeśli masz dużo kodu, którego nie chcesz konwertować), możesz użyć tej samej sztuczki.Najpierw zmodyfikuj
cmd
skrypt tak, aby wywoływał Powershell zamiast CScript:Skrypt Powershell jest równie prosty:
chociaż z pewnym uporządkowaniem, aby uzyskać faktyczny tekst hasła.
Pamiętaj, że aby uruchomić lokalne niepodpisane skrypty Powershell na swoim komputerze, może być konieczne zmodyfikowanie zasad wykonywania z (drakońskiej, choć bardzo bezpiecznej) wartości domyślnej, na przykład:
z samego Powershell.
źródło
scriptpw.dll
.Tak - spóźniłem się 4 lata.
Ale znalazłem sposób na zrobienie tego w jednej linii bez konieczności tworzenia zewnętrznego skryptu; wywołując polecenia PowerShell z pliku wsadowego.
Dzięki TessellatingHeckler - bez wyprowadzania do pliku tekstowego (ustawiam polecenie PowerShell w zmiennej, ponieważ jest dość niechlujne w jednej długiej linii wewnątrz pętli for).
Pierwotnie napisałem go, aby wyprowadzić do pliku tekstowego, a następnie odczytać z tego pliku tekstowego. Ale powyższa metoda jest lepsza. W jednej niezwykle długiej, prawie niezrozumiałej linii:
Wyjaśnię to - możesz to podzielić na kilka wierszy za pomocą daszka
^
, co jest o wiele przyjemniejsze ...W tym artykule wyjaśniono, co robią polecenia PowerShell; zasadniczo pobiera dane wejściowe za pomocą
Read-Host -AsSecureString
- następujące dwie linie konwertują ten bezpieczny ciąg z powrotem na zwykły tekst, a dane wyjściowe (hasło w postaci zwykłego tekstu) są następnie wysyłane do pliku tekstowego przy użyciu>.tmp.txt
. Ten plik jest następnie wczytywany do zmiennej i usuwany.źródło
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
i wtedyecho %password%
. NB. Nie mogę uzyskać tego komentarza, aby poprawnie uciec przed znakami odwrotnymi - przed „powershell” i przed końcem „)” są dwa znaki grawerowane, ale powinien być jeden lewy apostrof.Czyste rozwiązanie wsadowe, które (ab) wykorzystuje
XCOPY
polecenie i jego/P /L
przełączniki znalezione tutaj (niektóre ulepszenia można znaleźć tutaj ):1.2 Inny sposób oparty na komendzie zamiany
2. Osoba przesyłająca hasło, która korzysta z wyskakującego okienka HTA . To jest plik hybrit .bat / jscript / mshta i powinien zostać zapisany jako .bat :
3. Samodzielnie skompilowana hybryda .net .Again powinna zostać ponownie zapisana jako.
.bat
W odróżnieniu od innych rozwiązań utworzy / skompiluje mały plik .exe, który zostanie wywołany (jeśli chcesz, możesz go usunąć). Wymaga również zainstalowanej platformy .net, ale to raczej nie jest problem:źródło
Prawdopodobnie po prostu zrobiłbym:
Zostanie wyświetlony monit, a po jego wprowadzeniu ekran zostanie wyczyszczony.
Zwróć uwagę, że wprowadzone hasło zostanie zapisane w historii CMD, jeśli plik wsadowy zostanie wykonany z wiersza polecenia (Thanks @Mark K Cowan ).
Gdyby to nie wystarczyło, przełączyłbym się na Pythona lub napisałbym plik wykonywalny zamiast skryptu.
Wiem, że żadna z nich nie jest idealna, ale może jedna Ci wystarczy :)
źródło
doskey /reinstall
aby wyczyścić poprzedni bufor poleceń natychmiast pocls
, jeśli historia poleceń w konsoli nie jest dla Ciebie ważna.C:\>start "console" cmd /c ireadconsole.bat
Możesz użyć procedury ReadFormattedLine dla wszelkiego rodzaju sformatowanych danych wejściowych. Na przykład poniższe polecenie odczytuje hasło składające się z 8 znaków, wyświetla gwiazdki na ekranie i kontynuuje automatycznie bez konieczności naciskania klawisza Enter:
Ten podprogram jest napisany w czystej Batch, więc nie wymaga żadnego dodatkowego programu i pozwala na kilka sformatowanych operacji wejściowych, takich jak odczyt samych liczb, zamiana liter na duże itp. Możesz pobrać podprogram ReadFormattedLine z Read a line o określonym formacie .
EDYCJA 2018-08-18 : Nowa metoda wprowadzania „niewidocznego” hasła
Polecenie FINDSTR ma dziwny błąd, który pojawia się, gdy to polecenie jest używane do wyświetlania znaków w kolorze ORAZ wyjście takiego polecenia jest przekierowywane do urządzenia CON. Szczegółowe informacje na temat używania polecenia FINDSTR do wyświetlania tekstu w kolorze można znaleźć w tym temacie .
Kiedy wynik tej postaci polecenia FINDSTR jest przekierowywany do CON, dzieje się coś dziwnego po wyświetleniu tekstu w żądanym kolorze: cały tekst po jego wyświetleniu jako „niewidoczne” znaki, chociaż dokładniejszy opis jest taki, że tekst jest wyjście jako czarny tekst na czarnym tle. Oryginalny tekst pojawi się, jeśli użyjesz polecenia KOLOR, aby zresetować kolory pierwszego planu i tła całego ekranu. Jednak gdy tekst jest „niewidoczny” możemy wykonać polecenie SET / P, więc wszystkie wprowadzone znaki nie pojawią się na ekranie.
źródło
inną alternatywą są moje narzędzia wiersza poleceń EditV32 (x86) lub EditV64 (x64). Na przykład:
-m oznacza „zamaskowane wejście”, a -p to zachęta. Dane wejściowe użytkownika są przechowywane w zmiennej środowiskowej PWD. Możesz go zdobyć tutaj:
https://westmesatech.com/?page_id=19
źródło
Jeśli przeszkadza Ci brak kodu źródłowego, mam inną alternatywę.
Możesz go pobrać z https://westmesatech.com/?page_id=49 . Zawiera kod źródłowy.
źródło
Jeśli masz zainstalowany Python, możesz użyć:
wyjście:
źródło
Skorzystałem z powyższego rozwiązania Blorgbearda, które moim zdaniem jest naprawdę świetne. Następnie ulepszyłem to w następujący sposób:
Użyj tego w ten sposób:
Spowoduje to przełączenie konsoli na szary lub szary podczas wprowadzania hasła i przełączenie z powrotem, gdy skończysz. ESC powinien faktycznie być znakiem niedrukowalnym, który można skopiować z pobranego przykładowego pliku tekstowego (wygląda jak strzałka w lewo w Notatniku) do pliku wsadowego. Możesz użyć przykładowego pliku tekstowego, aby znaleźć kody dla wszystkich kombinacji kolorów.
Jeśli nie jesteś administratorem maszyny, prawdopodobnie będziesz w stanie zainstalować pliki w katalogu niesystemowym, a następnie musisz dołączyć katalog do PATH w swoim skrypcie przed wywołaniem programu i użyciem sekwencji ucieczki. Prawdopodobnie może to być nawet katalog bieżący, jeśli potrzebujesz pakietu dystrybucyjnego nieprzeznaczonego dla administratora, zawierającego tylko kilka plików.
źródło
utwórz plik wsadowy, który wywołuje ten wymagany dla niewidocznych znaków, a następnie utwórz skrót do wywoływanego pliku wsadowego.
kliknij prawym przyciskiem myszy
nieruchomości
zabarwienie
tekst == czarny
tło == czarny
zastosować
dobrze
nadzieja w ten sposób pomaga !!!!!!!!
źródło
AKTUALIZACJA:
Dodałem dwie nowe metody, które zamiast używać cls do ukrywania danych wejściowych, tworzą nowe wyskakujące okienko z tylko jedną linią.
Wadą jest to, że jedna metoda (metoda 2) pozostawia śmieci w rejestrze - „Jeśli działa bez odpowiednich uprawnień”, a druga (metoda trzecia) dodaje do skryptu trochę śmieci. Nie trzeba dodawać, że można go łatwo zapisać w dowolnym pliku tmp i usunąć. Właśnie próbowałem wymyślić alternatywę.
Ograniczenie: hasło może być tylko alfanumeryczne - żadnych innych znaków!
Update: Znalazłem posta sachadee do być doskonały , a ja po prostu dodał mój „pop-up” dziwactwo do niego.
źródło
Napisałem program open source o nazwie,
editenv
który zastępuje moje starszeeditv32
/editv64
narzędzia:https://github.com/Bill-Stewart/editenv
Opcja
--maskinput
(-m
) [*] pozwala ukryć (zamaskować) wpisane wejście i ma konfigurowalny znak (domyślny znak to*
); na przykład:Opcja
--prompt
(-p
) umożliwia określenie monitu o wprowadzenie danych. Powyższe wyświetliPassword:
monit i zaczeka, aż coś wprowadzisz. Wpisywane znaki pojawią się jako*
. Naciśnięcie Ctrl+ Ckończy program z kodem zakończenia 1223.Pobierz tutaj:
https://github.com/Bill-Stewart/editenv/releases
[*] Zauważ, że opcja
--maskinput
(-m
) nie jest bezpieczna - wprowadzony ciąg jest wprowadzany jako zwykły tekst w środowisku. Ta funkcja ma na celu wyłącznie wygodę.źródło
To może być starszy temat, ale jeśli korzystasz z systemu Windows Vista lub 7, mam rozwiązanie, które będzie działać bardzo dobrze. Nagrałem to tutaj: http://www.youtube.com/watch?v=mk8uAa6PIFM
Pastebin dla pliku wsadowego jest tutaj
źródło
źródło
Inną opcją, podobnie jak w przypadku Blorgbearda , jest użycie czegoś takiego:
^
Ucieka>
tak szybka, że hasło będzie wyglądać standard cmd pocieszyć szybka.źródło
Czytałem wszystkie niezgrabne rozwiązania w sieci o tym, jak maskować hasła w pliku wsadowym, te z rozwiązania hide.com, a nawet te, które sprawiają, że tekst i tło mają ten sam kolor. Rozwiązanie hide.com działa przyzwoicie, nie jest zbyt bezpieczne i nie działa w 64-bitowym systemie Windows. Tak czy inaczej, używając w 100% narzędzi firmy Microsoft, jest sposób!
Najpierw pozwól mi wyjaśnić moje zastosowanie. Mam około 20 stacji roboczych, które automatycznie logują się do systemu Windows. Mają na pulpicie jeden skrót - do aplikacji klinicznej. Maszyny są zablokowane, nie mogą kliknąć prawym przyciskiem myszy, nie mogą nic zrobić poza dostępem do jednego skrótu na pulpicie. Czasami konieczne jest, aby technik uruchomił niektóre aplikacje do debugowania, przeglądał eksplorator Windows i przeglądał pliki dziennika bez wylogowywania konta użytkownika autologu.
Oto, co zrobiłem.
Zrób to, jak chcesz, ale umieściłem moje dwa pliki wsadowe w udziale sieciowym, do którego ma dostęp zablokowany komputer.
Moje rozwiązanie wykorzystuje 1 główny składnik systemu Windows - runas. Umieść skrót na klientach do runas.bat, który zamierzasz utworzyć. Do Twojej wiadomości, na moich klientach zmieniłem nazwę skrótu, aby ułatwić przeglądanie i zmieniłem ikonę.
Będziesz musiał utworzyć dwa pliki wsadowe.
Nazwałam pliki wsadowe runas.bat i Debug Support.bat
runas.bat zawiera następujący kod:
Możesz dodać tyle, jeśli "% un%", a jeśli nie "% un%" dla wszystkich użytkowników, którym chcesz dać dostęp. @Ping to mój sposób na zrobienie sekundowego timera.
Więc to załatwia pierwszy plik wsadowy - całkiem proste, prawda?
Oto kod dla Debug Support.bat:
Nie jestem programistą i tak naprawdę dopiero rok temu zacząłem zajmować się pisaniem skryptów wsadowych, a ten sposób, w jaki odkryłem maskowanie hasła w pliku wsadowym, jest niesamowity!
Mam nadzieję, że usłyszę, że ktoś inny niż ja jest w stanie coś z tego zrobić!
źródło