Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在lua中隐藏带星号的密码_Lua - Fatal编程技术网

在lua中隐藏带星号的密码

在lua中隐藏带星号的密码,lua,Lua,有没有办法在lua中询问密码,但用星号隐藏 我在询问有关Unix控制台应用程序的问题:使用os.execute(“stty-echo raw”)关闭回显并进入raw模式(逐字符输入)和os.execute(“stty echo cooked”)打开并在完成后退出raw模式。在原始模式下,您可以使用io.stdin:read(1)获取输入的每个字符,并在运行时回显星号(使用io.flush确保字符立即显示)。您需要自己处理删除和行尾 对于Windows来说,情况有点棘手。请看一些方法,其中最好的方

有没有办法在lua中询问密码,但用星号隐藏


我在询问有关Unix控制台应用程序的问题:使用
os.execute(“stty-echo raw”)
关闭回显并进入raw模式(逐字符输入)和
os.execute(“stty echo cooked”)
打开并在完成后退出raw模式。在原始模式下,您可以使用
io.stdin:read(1)
获取输入的每个字符,并在运行时回显星号(使用
io.flush
确保字符立即显示)。您需要自己处理删除和行尾

对于Windows来说,情况有点棘手。请看一些方法,其中最好的方法似乎是VB脚本

后记
感谢lhf指出,除了输入上的
-echo
和每个输出星号后的flush之外,您还需要原始模式才能获得所需的结果:除非您同时拥有这两个星号,否则星号在行尾之前不会被回显。

此代码使用特定于平台的功能,并且在Linux和32位Windows上都能工作。
与Lua 5.1和Lua 5.2兼容

local console

local function enter_password(prompt_message, asterisk_char, max_length)
   -- returns password string
   -- "Enter" key finishes the password
   -- "Backspace" key undoes last entered character
   if not console then
      if (os.getenv'os' or ''):lower():find'windows' then
         ------------------ Windows ------------------
         local shift = 10
         -- Create executable file which returns (getch()+shift) as exit code
         local getch_filespec = 'getch.com'
         -- mov AH,8
         -- int 21h
         -- add AL,shift
         -- mov AH,4Ch
         -- int 21h
         local file = assert(io.open(getch_filespec, 'wb'))
         file:write(string.char(0xB4,8,0xCD,0x21,4,shift,0xB4,0x4C,0xCD,0x21))
         file:close()
         console = {
            wait_key = function()
               local code_Lua51, _, code_Lua52 = os.execute(getch_filespec)
               local code = (code_Lua52 or code_Lua51) - shift
               assert(code >= 0, getch_filespec..' execution failed')
               return string.char(code)
            end,
            on_start = function() end,
            on_finish = function() end,
            backspace_key = '\b'
         }
         -------------------------------------------
      else
         ------------------ Linux ------------------
         console = {
            wait_key = function()
               return io.read(1)
            end,
            on_start = function()
               os.execute'stty -echo raw'
            end,
            on_finish = function()
               os.execute'stty sane'
            end,
            backspace_key = '\127'
         }
         -------------------------------------------
      end
   end
   io.write(prompt_message or '')
   io.flush()
   local pwd = ''
   console.on_start()
   repeat
      local c = console.wait_key()
      if c == console.backspace_key then
         if #pwd > 0 then
            io.write'\b \b'
            pwd = pwd:sub(1, -2)
         end
      elseif c ~= '\r' and #pwd < (max_length or 32) then
         io.write(asterisk_char or '*')
         pwd = pwd..c
      end
      io.flush()
   until c == '\r'
   console.on_finish()
   io.write'\n'
   io.flush()
   return pwd
end

-- Usage example
local pwd = enter_password'Enter password: '
print('You entered: '..pwd:gsub('%c','?'))
print(pwd:byte(1,-1))
本地控制台
本地函数输入密码(提示消息、星号字符、最大长度)
--返回密码字符串
--“回车”键完成密码输入
--“退格”键撤消上次输入的字符
如果不是控制台,那么
如果(os.getenv'os'或“”):lower():查找'windows',则
------------------窗户------------------
本地班次=10
--创建返回(getch()+shift)作为退出代码的可执行文件
本地getch_filespec='getch.com'
--mov啊,8
--int 21h
--加AL,班次
--mov啊,4Ch
--int 21h
本地文件=断言(io.open(getch_filespec,'wb'))
文件:写入(string.char(0xB4,8,0xCD,0x21,4,shift,0xB4,0x4C,0xCD,0x21))
文件:close()
控制台={
wait_key=函数()
本地代码\u Lua51,\u,代码\u Lua52=os.execute(getch\u filespec)
本地代码=(代码Lua52或代码Lua51)-移位
断言(代码>=0,getch_filespec.“执行失败”)
返回string.char(代码)
完,,
在_start=function()结束时,
on_finish=function()结束时,
退格键='\b'
}
-------------------------------------------
其他的
------------------Linux------------------
控制台={
wait_key=函数()
返回io.read(1)
完,,
on_start=函数()
执行'stty-echo raw'
完,,
on_finish=函数()
执行“神智正常”
完,,
退格键='\127'
}
-------------------------------------------
结束
结束
io.write(提示消息或“”)
io.flush()
局部pwd=“”
console.on_start()
重复
本地c=控制台。等待\u键()
如果c==console.backspace\u键,则
如果pwd>0,则
io.write'\b\b'
pwd=pwd:sub(1,-2)
结束
如果c~='\r'和#pwd<(最大长度或32),则
io.write(星号字符或“*”)
pwd=pwd..c
结束
io.flush()
直到c=='\r'
console.on_finish()
io。写入“\n”
io.flush()
返回pwd
结束
--用法示例
本地pwd=输入密码“输入密码:”
打印('您输入:'..pwd:gsub('%c','?'))
打印(pwd:字节(1,-1))

lua似乎没有低级字符读取功能。也许可以使用os.execute()调用脚本?尽管在生产unix主机上执行此操作时会有安全实现。或者添加一个c函数来调用getchar(如果您处于该级别)。read(1)返回一个字符,但回显该字符-如果您在unix上,您可以摆弄stty modeLua,因为ANSI C没有低级字符读取函数。您需要使用
os.execute(“stty-echo raw”)
,以便
io.read(1)
按预期工作,并且
io.flush()
在用io打印星号后。写(“*”)。我还没有测试它是否100%确定,但是创建COM文件以在Windows中读取原始字符的真正聪明的技巧只适用于32位版本。COM文件是传统的DOS 16位程序,64位版本的Windows不支持16位DOS仿真系统。否则,总体而言,这是一个聪明的解决方案。@RBerteig-您有64位窗口可供使用吗?我现在没有这样的。您可以测试我的代码吗?在64位Windows 7 Pro上,尝试运行
getch.com
时会显示错误消息“由于与64位版本的Windows不兼容,程序或功能…无法启动或运行。请与软件供应商联系,询问是否有64位Windows兼容版本。”对
os.execute“getch.com”
的实际调用返回1作为Lua5.1中的第一个结果,并且同样出现在弹出窗口中的同一错误消息的版本也出现在stderr上。你可以通过打断任何控制字符来改进你的循环,而不仅仅是CR。。。。如果getch失败,那会更友好。@RBerteig-非常感谢您的测试。有意允许使用控制字符。密码不要求仅由可打印字符组成。几乎任何键(向上箭头、Alt-F12、PageDn、Ctrl-Enter等)都可以包含在密码中。