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

Azure DevOps Pipeline远程执行脚本报错:字典中无对应键

解决Azure DevOps Pipeline执行仓库内Shell脚本到Linux服务器的问题

错误原因分析

  1. 你在SSH@0任务中已经通过sshEndpoint指定了服务连接,却又在commands里重复执行ssh命令,导致连接逻辑冲突。
  2. $(Build.SourcesDirectory)是Pipeline代理机器上的本地路径,目标Linux服务器无法访问这个路径,原脚本里的重定向<是让目标服务器读取自身的对应路径,必然找不到文件。
  3. “给定的键不在字典中”大概率是SSH@0任务的输入参数配置有误,比如参数名拼写错误,或sshEndpoint对应的服务连接配置不匹配。

解决方案(无需拷贝脚本到服务器)

方案一:使用SSH任务的script模式(推荐)

SSH@0原生支持直接执行代理机器上的脚本,它会自动将脚本内容通过标准输入传递给目标服务器的bash执行,无需手动处理文件传输。

修正后的YAML:

- stage: scripttest
  jobs:
  - job: scripttest
    steps:
     - task: Checkout@1
       displayName: "Checkout repository"
     - task: SSH@0
       displayName: "Run Script on Server"
       inputs:
         sshEndpoint: $(ServiceConnection)
         runOptions: 'script' # 切换为script模式
         scriptPath: '$(Build.SourcesDirectory)/file/test1/script.sh' # 指定代理机器上的脚本路径
         # 若脚本需要传入参数,可添加以下字段
         # arguments: 'param1 param2'

方案二:使用commands模式传递脚本内容

如果必须保留commands模式,需要在代理机器上读取脚本内容,再通过管道传递给目标服务器的bash,避免直接引用目标服务器不存在的路径。

YAML示例:

- stage: scripttest
  jobs:
  - job: scripttest
    steps:
     - task: Checkout@1
       displayName: "Checkout repository"
     - task: SSH@0
       displayName: "Run Script on Server"
       inputs:
         sshEndpoint: $(ServiceConnection)
         runOptions: 'commands'
         commands: |
           echo "Running script on target server"
           # 读取代理机器上的脚本内容,通过管道传递给目标服务器的bash
           cat $(Build.SourcesDirectory)/file/test1/script.sh | bash -s

额外注意事项

  • 确认$(ServiceConnection)对应的服务连接已正确配置,包含目标服务器的SSH认证信息(密钥或密码),且名称完全匹配。
  • 确保代理机器能正常访问目标服务器的SSH端口,且目标服务器的bash路径正确(部分服务器可能需要指定/bin/bash而非bash)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:15:57