不修改目标Perl脚本,如何避免明文密码作为命令行参数传入?
避免Perl脚本命令行明文传递密码的两种方法
方法一:无回显提示输入密码(类似mysql模式)
临时命令行方式
直接在终端执行以下两步:
read -s -p "Enter password: " PASS
输入密码后回车(屏幕不会显示任何输入内容),再执行原脚本:
perl myscript.pl -host localhost -user someone -pass "$PASS" -id 1,2,3,4
说明:命令历史中只会记录这两行命令,不会存储明文密码——$PASS是内存中的临时变量,不会被持久化记录。
封装成Shell脚本(方便复用)
创建一个名为myscript_wrapper.sh的脚本:
#!/bin/bash # 提示输入密码,-s参数关闭回显 read -s -p "Enter password: " USER_PASS # 换行避免提示符挤在一起 echo # 调用原Perl脚本,传递密码变量 perl myscript.pl -host localhost -user someone -pass "$USER_PASS" -id 1,2,3,4
给脚本添加执行权限:
chmod +x myscript_wrapper.sh
之后直接执行脚本即可:
./myscript_wrapper.sh
方法二:输入密码时显示星号
这种方式需要用到expect工具(多数Linux发行版默认预装,未安装可通过包管理器安装),创建一个名为myscript_pass_prompt.exp的脚本:
#!/usr/bin/expect set password "" # 显示密码输入提示 send_user "Enter password: " # 关闭默认输入回显 stty -echo # 逐字符捕获输入并替换为星号显示 while {1} { expect { # 捕获回车,结束输入流程 "\n" { break } # 捕获每个输入字符 default { set input_char [string range $expect_out(buffer) end end] append password $input_char # 输出星号替代真实输入 send_user "*" } } } # 恢复终端回显功能 stty echo # 换行整理输出格式 send_user "\n" # 调用原Perl脚本,传递捕获到的密码 exec perl myscript.pl -host localhost -user someone -pass "$password" -id 1,2,3,4
给脚本添加执行权限:
chmod +x myscript_pass_prompt.exp
执行脚本即可看到星号式的密码输入效果:
./myscript_pass_prompt.exp
以上两种方法均无需修改原Perl脚本,且密码不会出现在屏幕输出或命令历史中,完全满足你的安全需求。
内容的提问来源于stack exchange,提问作者Student
相关产品推荐
相关产品推荐

