J'écris un fichier batch pour exécuter d'autres programmes. Dans ce cas, je dois demander un mot de passe. Ai-je un moyen de masquer le texte d'entrée? Je n'ai pas besoin d'imprimer des caractères ******* au lieu des caractères d'entrée. Le comportement d'invite de mot de passe de Linux (ne rien imprimer pendant la saisie) est suffisant.
@echo off
SET /P variable=Password :
echo %variable%
Pause
Cela lira l'entrée mais je ne peux pas masquer le texte en utilisant cette approche.
batch-file
cmd
command-prompt
Chathuranga Chandrasekara
la source
la source
Réponses:
Jusqu'à XP et Server 2003, vous pouvez utiliser un autre outil inclus (VBScript) - les deux scripts suivants font le travail que vous souhaitez.
Premièrement
getpwd.cmd
,:Ensuite
getpwd.vbs
,:Le
getpwd.vbs
utilise simplement l'objet mot de passe pour saisir le mot de passe de l'utilisateur, puis l'imprimer sur la sortie standard (le paragraphe suivant expliquera pourquoi cela n'apparaît pas dans le terminal).Le
getpwd.cmd
script de commande est un peu plus délicat mais il fonctionne essentiellement comme suit.L'effet de la
"<nul: set /p passwd=Password: "
commande est de sortir l'invite sans caractère de fin de ligne - c'est un moyen sournois d'émuler la"echo -n"
commande à partir dubash
shell. Il définitpasswd
une chaîne vide comme un effet secondaire non pertinent et n'attend pas d'entrée car il prend son entrée dunul:
périphérique.La
"for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"
déclaration est la partie la plus délicate. Il exécute le VBScript sans "publicité" Microsoft, de sorte que la seule sortie de ligne est le mot de passe (du VBscript"Wscript.StdOut.WriteLine strPassword"
.La définition des délimiteurs sur rien est nécessaire pour capturer une ligne d'entrée entière avec des espaces, sinon vous obtenez juste le premier mot. Le
"for ... do set ..."
bit est définipasswd
comme étant la sortie de mot de passe réelle du VBScript.Ensuite, nous renvoyons une ligne vide (pour terminer la
"Password: "
ligne) et le mot de passe sera dans lapasswd
variable d'environnement une fois le code exécuté.Maintenant, comme mentionné,
scriptpw.dll
n'est disponible que jusqu'à XP / 2003. Pour corriger cela, vous pouvez simplement copier lescriptpw.dll
fichier duWindows\System32
dossier d'un système XP / 2003 vers le dossierWinnt\System32
ouWindows\System32
de votre propre système. Une fois la DLL copiée, vous devrez l'enregistrer en exécutant:Pour enregistrer correctement la DLL sur Vista et versions ultérieures, vous aurez besoin de privilèges d'administrateur. Je n'ai pas examiné la légalité d'un tel mouvement, donc lecteur de caverne.
Si vous n'êtes pas trop désireux d'essayer de retrouver et d'enregistrer des fichiers DLL plus anciens (pour des raisons pratiques ou légales), il existe un autre moyen. Les versions ultérieures de Windows (celles qui n'ont pas la DLL requise) devraient avoir Powershell à votre disposition.
Et, en fait, vous devriez vraiment envisager de mettre à niveau vos scripts pour les utiliser pleinement, car il s'agit d'un langage de script beaucoup plus performant que
cmd.exe
. Cependant, si vous souhaitez conserver la majeure partie de votre code sous forme decmd.exe
scripts (par exemple, si vous avez beaucoup de code que vous ne souhaitez pas convertir), vous pouvez utiliser la même astuce.Tout d'abord, modifiez le
cmd
script pour qu'il appelle Powershell plutôt que CScript:Le script Powershell est tout aussi simple:
bien qu'avec un peu de rassemblement pour obtenir le texte du mot de passe réel.
N'oubliez pas que, pour exécuter des scripts Powershell locaux non signés sur votre machine, vous devrez peut-être modifier la politique d'exécution par défaut (draconienne, bien que très sûre), avec quelque chose comme:
de l'intérieur de Powershell lui-même.
la source
scriptpw.dll
.Oui, j'ai 4 ans de retard.
Mais j'ai trouvé un moyen de le faire en une seule ligne sans avoir à créer un script externe; en appelant des commandes PowerShell à partir d'un fichier de commandes.
Merci à TessellatingHeckler - sans sortie dans un fichier texte (j'ai défini la commande powershell dans une variable, car c'est assez désordonné dans une longue ligne dans une boucle for).
À l'origine, je l'ai écrit pour le sortir dans un fichier texte, puis je l'ai lu à partir de ce fichier texte. Mais la méthode ci-dessus est meilleure. Dans une ligne extrêmement longue, presque incompréhensible:
Je vais le décomposer - vous pouvez le diviser en quelques lignes en utilisant le curseur
^
, ce qui est beaucoup plus agréable ...Cet article explique ce que font les commandes PowerShell; essentiellement, il obtient l'entrée en utilisant
Read-Host -AsSecureString
- les deux lignes suivantes convertissent cette chaîne sécurisée en texte brut, la sortie (mot de passe en clair) est ensuite envoyée dans un fichier texte en utilisant>.tmp.txt
. Ce fichier est ensuite lu dans une variable et supprimé.la source
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
et ensuiteecho %password%
. NB. Je ne peux pas obtenir ce commentaire pour échapper correctement aux backticks - avant "powershell", et avant la fin ")" il y a deux backticks, mais devrait être un backtick.Solution par lots pure qui (ab) utilise la
XCOPY
commande et ses/P /L
commutateurs trouvés ici (quelques améliorations à ce sujet peuvent être trouvées ici ):1.2 Une autre méthode basée sur la commande replace
2. émetteur de mot de passe qui utilise une fenêtre contextuelle HTA . Il s'agit d'un fichier hybrit .bat / jscript / mshta et doit être enregistré en tant que .bat :
3. Un hybride .net auto-compilé .Again doit être sauvegardé sous
.bat
.A la différence des autres solutions, il créera / compilera un petit fichier .exe qui sera appelé (si vous le souhaitez, vous pouvez le supprimer). Nécessite également un framework .net installé, mais ce n'est pas un problème:la source
Je ferais probablement juste:
Ainsi, vous obtenez une invite, puis l'écran s'efface une fois entré.
Notez que le mot de passe saisi sera stocké dans l'historique CMD si le fichier batch est exécuté à partir d'une invite de commande (Merci @Mark K Cowan ).
Si cela ne suffisait pas, je passerais soit à python, soit j'écrirais un exécutable au lieu d'un script.
Je sais qu'aucune de ces solutions n'est parfaite, mais peut-être qu'une est assez bonne pour vous :)
la source
doskey /reinstall
pour effacer le tampon de commande précédent immédiatement aprèscls
, si l'historique des commandes dans la console n'est pas important pour vous.C:\>start "console" cmd /c ireadconsole.bat
Vous pouvez utiliser le sous-programme ReadFormattedLine pour tout type d'entrée formatée. Par exemple, la commande ci-dessous lit un mot de passe de 8 caractères, affiche des astérisques à l'écran et continue automatiquement sans avoir besoin d'appuyer sur Entrée:
Ce sous-programme est écrit en pur Batch donc il ne nécessite aucun programme supplémentaire, et il permet plusieurs opérations d'entrée formatées, comme lire uniquement des nombres, convertir des lettres en majuscules, etc. Vous pouvez télécharger le sous-programme ReadFormattedLine à partir de Lire une ligne avec un format spécifique .
EDIT 2018-08-18 : Nouvelle méthode pour saisir un mot de passe "invisible"
La commande FINDSTR a un bogue étrange qui se produit lorsque cette commande est utilisée pour afficher des caractères en couleur ET que la sortie d'une telle commande est redirigée vers le périphérique CON. Pour plus d'informations sur l'utilisation de la commande FINDSTR pour afficher le texte en couleur, consultez cette rubrique .
Lorsque la sortie de cette forme de commande FINDSTR est redirigée vers CON, quelque chose d'étrange se produit après que le texte est sorti dans la couleur souhaitée: tout le texte après qu'il est sorti en tant que caractères "invisibles", bien qu'une description plus précise soit que le texte est sortie sous forme de texte noir sur fond noir. Le texte d'origine apparaîtra si vous utilisez la commande COULEUR pour réinitialiser les couleurs de premier plan et d'arrière-plan de tout l'écran. Cependant, lorsque le texte est "invisible", nous pouvons exécuter une commande SET / P, de sorte que tous les caractères saisis n'apparaissent pas à l'écran.
la source
une autre alternative est mes outils de ligne de commande EditV32 (x86) ou EditV64 (x64). Par exemple:
-m signifie "entrée masquée" et -p est l'invite. L'entrée de l'utilisateur est stockée dans la variable d'environnement PWD. Vous pouvez l'obtenir ici:
https://westmesatech.com/?page_id=19
la source
Si le manque de code source vous dérange, j'ai une autre alternative.
Vous pouvez l'obtenir sur https://westmesatech.com/?page_id=49 . Le code source est inclus.
la source
Si vous avez installé Python, vous pouvez utiliser:
le résultat:
la source
J'ai utilisé la solution ci-dessus de Blorgbeard, ce qui est en fait génial à mon avis. Ensuite, je l'ai amélioré comme suit:
Utilisez-le comme ceci:
Cela fait passer la console en gris sur gris pour la saisie de votre mot de passe et revient en arrière lorsque vous avez terminé. L'ESC doit en fait être un caractère non imprimable, que vous pouvez copier à partir du fichier texte d'exemple téléchargé (apparaît comme une flèche gauche dans le Bloc-notes) dans votre fichier de commandes. Vous pouvez utiliser le fichier texte d'exemple pour rechercher les codes de toutes les combinaisons de couleurs.
Si vous n'êtes pas administrateur de la machine, vous pourrez probablement installer les fichiers dans un répertoire non-système, alors vous devrez ajouter le répertoire au PATH dans votre script avant d'appeler le programme et d'utiliser les séquences d'échappement. Cela pourrait même être probablement le répertoire actuel, si vous avez besoin d'un package distribuable non-administrateur contenant seulement quelques fichiers.
la source
créer un fichier batch qui appelle celui nécessaire pour les caractères invisibles puis créer un raccourci pour le fichier batch appelé.
clic-droit
Propriétés
couleurs
texte == noir
fond == noir
appliquer
D'accord
l'espoir vous aide donc !!!!!!!!
la source
MISE À JOUR:
J'ai ajouté deux nouvelles méthodes qui, au lieu d'utiliser cls pour masquer l'entrée, créent une nouvelle fenêtre contextuelle avec une seule ligne.
Les inconvénients sont qu'une méthode (méthode 2) laisse des fichiers indésirables dans le registre - "Si elle est exécutée sans les droits appropriés", et l'autre (méthode trois) ajoute des fichiers indésirables au script. Inutile de dire qu'il peut facilement être écrit dans n'importe quel fichier tmp et supprimé. J'ai juste essayé de trouver une alternative.
Limitation: Le mot de passe ne peut être que alphanumérique - pas d'autres caractères!
Mise à jour: J'ai trouvé le post de sachadee parfait et je viens d'y ajouter ma bizarrerie "pop-up".
la source
J'ai écrit un programme open source appelé
editenv
qui remplace mes ancienseditv32
/editv64
utilitaires:https://github.com/Bill-Stewart/editenv
L' option
--maskinput
(-m
) [*] vous permet de masquer (masquer) l'entrée tapée et a un caractère configurable (le caractère par défaut est*
); par exemple:L' option
--prompt
(-p
) vous permet de spécifier une invite d'entrée. Ce qui précède affichera unePassword:
invite et attendra que vous entriez quelque chose. Les caractères tapés apparaîtront comme*
. Appuyez sur Ctrl+ Cpour terminer le programme avec un code de sortie de 1223.Le téléchargement est ici:
https://github.com/Bill-Stewart/editenv/releases
[*] Notez que l' option
--maskinput
(-m
) n'est pas sécurisée - la chaîne saisie est saisie en texte brut dans l'environnement. Cette fonction est fournie à titre indicatif uniquement.la source
C'est peut-être un sujet plus ancien, mais si vous utilisez Windows Vista ou 7, j'ai une solution qui fonctionnera très bien. J'en ai fait une vidéo ici: http://www.youtube.com/watch?v=mk8uAa6PIFM
Pastebin pour le fichier batch est ici
la source
la source
Une autre option, dans le même esprit que Blorgbeard is out , est d'utiliser quelque chose comme:
L'
^
échappe le>
afin que l'invite de mot de passe ressemble à une invite de console cmd standard.la source
J'ai lu toutes les solutions maladroites sur le net sur la façon de masquer les mots de passe dans un fichier batch, celles qui utilisent une solution hide.com et même celles qui donnent la même couleur au texte et à l'arrière-plan. La solution hide.com fonctionne correctement, n'est pas très sécurisée et ne fonctionne pas sous Windows 64 bits. Donc de toute façon, en utilisant des utilitaires 100% Microsoft, il y a un moyen!
Tout d'abord, laissez-moi vous expliquer mon utilisation. J'ai environ 20 postes de travail qui se connectent automatiquement à Windows. Ils ont un raccourci sur leur bureau - vers une application clinique. Les machines sont verrouillées, elles ne peuvent pas cliquer avec le bouton droit de la souris, elles ne peuvent rien faire d'autre que d'accéder au seul raccourci sur leur bureau. Parfois, il est nécessaire pour un technicien de lancer certaines applications de débogage, de parcourir l'explorateur Windows et de consulter les fichiers journaux sans déconnecter le compte utilisateur d'autolog.
Voici donc ce que j'ai fait.
Faites-le comme vous le souhaitez, mais je place mes deux fichiers batch sur un partage réseau auquel l'ordinateur verrouillé a accès.
Ma solution utilise 1 composant principal de Windows - runas. Mettez un raccourci sur les clients vers le runas.bat que vous êtes sur le point de créer. Pour votre information, sur mes clients, j'ai renommé le raccourci pour une meilleure visualisation et changé l'icône.
Vous devrez créer deux fichiers batch.
J'ai nommé les fichiers batch runas.bat et Debug Support.bat
runas.bat contient le code suivant:
Vous pouvez en ajouter autant si "% un%" et sinon "% un%" pour tous les utilisateurs auxquels vous souhaitez donner accès. Le @ping est ma façon coonass de créer une minuterie de secondes.
Donc ça s'occupe du premier fichier batch - assez simple hein?
Voici le code pour Debug Support.bat:
Je ne suis pas un codeur et j'ai vraiment commencé à me lancer dans la création de scripts par lots il y a environ un an, et cette manière que j'ai découverte de masquer un mot de passe dans un fichier de commandes est plutôt géniale!
J'espère entendre que quelqu'un d'autre que moi peut en tirer profit!
la source