Azure DevOps Pipeline远程执行脚本报错:字典中无对应键
解决Azure DevOps Pipeline执行仓库内Shell脚本到Linux服务器的问题
错误原因分析
- 你在
SSH@0任务中已经通过sshEndpoint指定了服务连接,却又在commands里重复执行ssh命令,导致连接逻辑冲突。 $(Build.SourcesDirectory)是Pipeline代理机器上的本地路径,目标Linux服务器无法访问这个路径,原脚本里的重定向<是让目标服务器读取自身的对应路径,必然找不到文件。- “给定的键不在字典中”大概率是
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
相关产品推荐
相关产品推荐

