如何在Bash脚本单行中向CLI命令传递stdin变量实现静默认证
问题
我有一个CLI工具,执行登录命令时需要手动输入密码完成认证,示例如下:
❯ command login xxx.com username Password:
我尝试在Bash脚本中通过管道将密码变量传递给该命令,但没有效果,仍然需要手动输入密码:
#!/bin/bash PASSWORD="12345" echo $PASSWORD | command login xxx.com username
执行脚本后输出:
❯ ./script.sh Login... Password:
解决方案
很多CLI工具为了安全,不会从标准输入(stdin)读取密码,而是直接从终端设备(/dev/tty)读取,这就是管道传递无效的原因。以下是几种可行的解决办法:
1. 使用expect自动处理交互
expect是专门用于模拟交互式命令行操作的工具,能自动响应密码提示:
- 先安装
expect(Debian/Ubuntu:sudo apt install expect;CentOS/RHEL:sudo yum install expect) - 编写
expect脚本:
#!/usr/bin/expect set password "12345" spawn command login xxx.com username expect "Password:" send "$password\r" expect eof
- 保存为
login.exp,赋予执行权限:chmod +x login.exp,然后运行即可。
2. 检查工具是否支持密码参数/环境变量
部分CLI工具会提供更直接的密码传递方式(注意明文传递有安全风险):
- 环境变量方式(如果工具支持):
PASSWORD="12345" command login xxx.com username - 命令行参数方式(如果工具支持):
command login xxx.com username --password "12345"
可以通过command login --help查看工具是否提供这类选项。
3. 尝试带换行的标准输入传递
如果工具只是需要正确的换行符,试试用printf输出完整的密码行:
PASSWORD="12345" printf "%s\n" "$PASSWORD" | command login xxx.com username
内容的提问来源于stack exchange,提问作者Zhang
相关产品推荐
相关产品推荐

