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

Airflow中如何为远程交互式脚本运行时传递密码

解决Airflow中远程脚本交互式密码输入的问题

针对你遇到的远程脚本需要两次输入密码的场景,有以下几种可行的解决方式:

1. 通过管道批量传入密码

如果脚本两次提示的密码是固定值(相同或不同均可),可以用printf将密码按提示顺序输出,通过管道传递给脚本:

printf "密码1\n密码2\n" | sh RegisterKerbTicketAndOAuth.sh userID@azureprd.onmicrosoft.com

在Airflow的SSHOperator中,直接将上述整段命令作为command参数即可。注意密码不要明文写在代码里,建议用Airflow的Variable存储,示例代码如下:

from airflow.models import Variable

password1 = Variable.get("kerb_ticket_pass1")
password2 = Variable.get("kerb_ticket_pass2")

ssh_task = SSHOperator(
    task_id="run_kerb_script",
    ssh_conn_id="remote_cluster_conn",
    command=f'printf "{password1}\n{password2}\n" | sh RegisterKerbTicketAndOAuth.sh userID@azureprd.onmicrosoft.com'
)

2. 修改脚本支持非交互式参数

如果有权限修改远程的RegisterKerbTicketAndOAuth.sh脚本,最佳实践是让它接受命令行参数或环境变量,彻底避免交互式输入:

  • 命令行参数方式
    替换脚本中读取密码的交互式逻辑,直接从命令行参数获取:

    # 原脚本中的read交互式语句替换为
    pass1=$1
    pass2=$2
    

    之后在Airflow中执行命令:

    sh RegisterKerbTicketAndOAuth.sh userID@azureprd.onmicrosoft.com "$password1" "$password2"
    
  • 环境变量方式
    脚本中从环境变量读取密码:

    pass1=$PASSWORD1
    pass2=$PASSWORD2
    

    在Airflow的SSHOperator中通过env参数传递环境变量:

    ssh_task = SSHOperator(
        task_id="run_kerb_script",
        ssh_conn_id="remote_cluster_conn",
        command='sh RegisterKerbTicketAndOAuth.sh userID@azureprd.onmicrosoft.com',
        env={
            "PASSWORD1": Variable.get("kerb_ticket_pass1"),
            "PASSWORD2": Variable.get("kerb_ticket_pass2")
        }
    )
    

3. 使用Expect工具自动响应交互式提示

如果无法修改原脚本,可以用expect工具编写自动输入密码的脚本(需确保远程集群已安装expect):

  1. 在远程集群创建auto_input_pass.exp脚本:
#!/usr/bin/expect
set username [lindex $argv 0]
set pass1 [lindex $argv 1]
set pass2 [lindex $argv 2]

spawn sh RegisterKerbTicketAndOAuth.sh $username
# 根据脚本实际的提示文本调整匹配规则
expect "Enter password:"
send "$pass1\r"
expect "Enter second password:"
send "$pass2\r"
expect eof
  1. 给脚本添加执行权限:chmod +x auto_input_pass.exp
  2. 在Airflow中执行该expect脚本:
ssh_task = SSHOperator(
    task_id="run_kerb_script",
    ssh_conn_id="remote_cluster_conn",
    command=f'./auto_input_pass.exp userID@azureprd.onmicrosoft.com {password1} {password2}'
)

安全注意事项

  • 所有密码务必通过Airflow的Variable或Connections存储,不要硬编码在DAG文件中
  • 如果使用Connections,可以创建自定义连接类型,将密码存在password字段或额外的extra参数中

内容的提问来源于stack exchange,提问作者L2607

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:56:41