c++ - 使用TCL命令行,有没有办法停止显示字符?

标签 c++ tcl

我正在构建一个工具,需要输入带有密码的命令。 我希望当我输入带有密码的命令时,命令行将每个字符替换为“*”或“”,因此命令和密码将无法被观察到!

是否有这样一个命令,告诉TCL解释器“从此时开始,将输入的每个字符显示为*”,然后切换回常规模式?

任何其他建议也很有值(value)。

最佳答案

就您而言,您应该“完全控制”您的终端并禁用其默认的回显行为(在 UNIX 中,终端应输入所谓的原始 模式) 然后,您可以逐一读取字符(直到达到最大密码大小或直到按下 Enter 键),并对每个按下的字符回显“*”。 您在 UNIX 和 Windows 上都获得了有效的代码示例,如何做到这一点 here 您可能还想阅读此链接 echo-free password entry TCL wiki

proc enableRaw {{channel stdin}} {
   exec /bin/stty raw -echo <@$channel
}
proc disableRaw {{channel stdin}} {
   exec /bin/stty -raw echo <@$channel
}

enableRaw
set c [read stdin 1]
puts -nonewline $c
disableRaw
package require twapi
proc enableRaw {{channel stdin}} {
   set console_handle [twapi::GetStdHandle -10]
   set oldmode [twapi::GetConsoleMode $console_handle]
   set newmode [expr {$oldmode & ~6}] ;# Turn off the echo and line-editing bits
   twapi::SetConsoleMode $console_handle $newmode
}
proc disableRaw {{channel stdin}} {
   set console_handle [twapi::GetStdHandle -10]
   set oldmode [twapi::GetConsoleMode $console_handle]
   set newmode [expr {$oldmode | 6}] ;# Turn on the echo and line-editing bits
   twapi::SetConsoleMode $console_handle $newmode
}

enableRaw
set c [read stdin 1]
puts -nonewline $c
disableRaw

关于c++ - 使用TCL命令行,有没有办法停止显示字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27291233/

相关文章:

c++ - static_assert 总是在 constexpr 中触发

c++ - Asio 如何包含基于 BSD 套接字 API 的低级套接字接口(interface)?

exec - 在 Unix 上的 Tcl 中,如何杀死已使用 exec 启动的后台进程?

linux - 打开愿望而不窃取焦点

python - 将 Python 变量传递给 `Tkinter.Tcl().eval()`

C++17 编译器不应该发现对未定义值的引用传递吗?

c++ - 对象内的字符串数组

c++ - 为什么不能通过在错误输入后设置 std::cin.clear() 来使用 std::cin?

tcl - 用于添加特定信号的 gtkwave tcl 脚本

numbers - 如何判断一个变量值是否是 TCL 中的数字?