You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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是专门用于模拟交互式命令行操作的工具,能自动响应密码提示:

  1. 先安装expect(Debian/Ubuntu:sudo apt install expect;CentOS/RHEL:sudo yum install expect)
  2. 编写expect脚本:
#!/usr/bin/expect

set password "12345"
spawn command login xxx.com username
expect "Password:"
send "$password\r"
expect eof
  1. 保存为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:45:54