jenkins在windows配置sshpass

我的服务器里jenkins是通过docker安装的,jenkins与项目都部署在同一台服务器上还好,但是当需要通过jenkins构建,再通过scp远程推送到别的服务器上,就出问题了,毕竟不是手动执行scp命令,可以手动输入密码,所以需要在jenkins所在服务器配置ssh免密登录

先以root身份进入jenkins容器

docker exec -it --user root jenkins bash

执行cat /etc/os-release,查看jenkins镜像里实际的操作系统内核

cat /etc/os-release

明白了,我的 Jenkins Docker 容器是 Debian 12 (Bookworm),所以用 apt 安装工具,不是  yum 。

创建脚本setup_ssh_windows.sh

先在宿主机/home/docker/jenkins里创建脚本setup_ssh_windows.sh

#!/bin/bash
set -e# -----------------------------
# 配置参数
# -----------------------------
WINDOWS_USER="Administrator"
WINDOWS_PASS="YourWindowsPassword"   # 第一次上传用
WINDOWS_HOST="192.168.0.11"
SSH_DIR="/var/jenkins_home/.ssh"
SSH_KEY="$SSH_DIR/id_ed25519"
WINDOWS_SSH_DIR="C:\\Users\\Administrator\\.ssh"
AUTHORIZED_KEYS="$WINDOWS_SSH_DIR\\authorized_keys"# -----------------------------
# 安装必要工具(Debian)
# -----------------------------
if ! command -v ssh >/dev/null 2>&1; thenecho "Installing ssh and sshpass..."apt updateapt install -y openssh-client sshpass
fi# -----------------------------
# 创建本地 SSH 目录
# -----------------------------
mkdir -p "$SSH_DIR"
chmod 700 "$SSH_DIR"# -----------------------------
# 生成 SSH 密钥(如果不存在)
# -----------------------------
if [ ! -f "$SSH_KEY" ]; thenecho "Generating SSH key..."ssh-keygen -t ed25519 -f "$SSH_KEY" -N "" -qchmod 600 "$SSH_KEY"
elseecho "SSH key already exists."
fi# -----------------------------
# 第一次上传公钥到 Windows
# -----------------------------
echo "Uploading public key to Windows host..."# 创建 Windows .ssh 目录
sshpass -p "$WINDOWS_PASS" ssh -o StrictHostKeyChecking=no $WINDOWS_USER@$WINDOWS_HOST \
"mkdir -p $WINDOWS_SSH_DIR && icacls $WINDOWS_SSH_DIR /grant $WINDOWS_USER:F"# 上传公钥
sshpass -p "$WINDOWS_PASS" scp -o StrictHostKeyChecking=no "$SSH_KEY.pub" $WINDOWS_USER@$WINDOWS_HOST:$AUTHORIZED_KEYS# 设置权限
sshpass -p "$WINDOWS_PASS" ssh -o StrictHostKeyChecking=no $WINDOWS_USER@$WINDOWS_HOST \
"icacls $WINDOWS_SSH_DIR /inheritance:r /grant $WINDOWS_USER:F && icacls $AUTHORIZED_KEYS /inheritance:r /grant $WINDOWS_USER:F"echo "✅ Public key uploaded successfully. You can now use SSH/SCP to Windows without password."

以root用户执行进入容器

docker exec -it --user root jenkins bash

赋值权限

chmod +x /var/jenkins_home/setup_ssh_windows.sh

执行一次(第一次上传公钥):

/var/jenkins_home/setup_ssh_windows.sh

测试免密登录:

一旦免密成功,后续 Jenkins job 里执行:

ssh -o StrictHostKeyChecking=no Administrator@192.168.0.11 "echo 'SSH login successful!'"

重新构建jenkins里的shell

#!/bin/bash
set -e  # 遇到错误立即退出echo "Working directory content:"
ls -alhecho "Installing dependencies..."
npm installecho "Building project..."
npm run build:prodecho "Current path:"
pwdecho "Deployment completed successfully."
echo "Uploading dist to remote Windows server..."
scp -o StrictHostKeyChecking=no -r dist/* Administrator@192.168.0.11:/d/nginx-1.22.0/upload
echo "Upload completed!"

重新构建出现问题了

 1️⃣ /var/jenkins_home/.ssh/known_hosts 权限问题 

原因:

  • Jenkins 容器里的  .  ssh  目录或者  k  nown_hosts  文件权限不对
  • Jenkins 用户没有写权限

解决办法:

# 确保 known_hosts 可以写
mkdir -p /var/jenkins_home/.ssh
chown -R jenkins:jenkins /var/jenkins_home/.ssh
chmod 700 /var/jenkins_home/.ssh
touch /var/jenkins_home/.ssh/known_hosts
chmod 600 /var/jenkins_home/.ssh/known_hosts

2️⃣ SCP 登录被拒绝(公钥/密码失败)

原因可能是:

  1. Windows 上  authorized_k  eys  文件或  .ssh  目录权限不正确
  • Windows OpenSSH 对权限很严格
  • 必须用  icacls  给 Administrator 完全控制
  1. SCP 连接用的用户和密钥不匹配
  • Jenkins 容器里默认用  jenkins  用户
  • SCP 连接 Windows 时必须使用你上传的公钥对应的私钥

解决方法:

确保 Windows  .ssh  权限正确

在 Windows PowerShell(管理员)执行:

icacls "C:\Users\Administrator\.ssh" /inheritance:r /grant Administrator:F
icacls "C:\Users\Administrator\.ssh\authorized_keys" /inheritance:r /grant Administrator:F
icacls "D:\nginx-1.22.0\upload" /grant Administrator:F

确保 Jenkins 容器使用正确私钥上传

cd  /var/jenkins_home/workspace/asm_front_pro scp -i /var/jenkins_home/.ssh/id_ed25519 -o StrictHostKeyChecking=no -r dist/* Administrator@192.168.0.11:"D:/nginx-1.22.0/upload"

-i   /var/jenkins_home/.ssh/id_ed25519  指定使用免密的私钥

 -o StrictH  ostKeyChecking=no  避免第一次连接提示

发现仍然不行,没戏还是需要密码,这个就是典型的 Windows OpenSSH 权限问题,经过排查摸索,最终知道问题所在了,因为 Windows 从 2018 年开始,默认禁止 Administrator 用户用用户目录下的 key 文件做公钥认证(出于安全考虑),必须放到  a  dministrators_authorized_keys 。

1️⃣ 确认 Windows sshd 服务开启并支持公钥认证

在 Windows PowerShell(管理员权限)运行:

Get-Service sshd

如果是 Stopped →

Start-Service sshd

然后检查  C  :\ProgramData\ssh\sshd_config  配置里有:

PubkeyAuthentication yes
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

⚠ 注意:

  • 在 Windows 上,管理员账号的公钥默认不是用  C:\Users\Adminis  trator\.ssh\authorized_keys ,而是必须放到  C:\ProgramD  ata\ssh\administrators_authorized_keys ,并且权限非常严。
  • 这是微软的安全限制(防止提权)。

2️⃣ 如果是 Administrator 用户,走系统级 authorized_keys 文件

执行(PowerShell 管理员):

notepad C:\ProgramData\ssh\administrators_authorized_keys

把    /var/jenkins_home/.ssh/id_ed25519.pub  里的内容复制进去,保存。

提示找不到C:\ProgramData\ssh\administrators_authorized_keys

那就说明你 Windows 上的 OpenSSH 还没创建这个文件,我们可以手动新建并写入 Jenkins 容器的公钥。

你按这个流程走就行:


1️⃣ 以管理员身份打开 PowerShell

New-Item -ItemType Directory -Force -Path "C:\ProgramData\ssh"
New-Item -ItemType File -Force -Path "C:\ProgramData\ssh\administrators_authorized_keys"

2️⃣ 把 Jenkins 公钥写进去

先在 Jenkins 容器里看公钥内容:

cat /var/jenkins_home/.ssh/id_ed25519.pub

复制这一整行( s  sh-ed25519 AAAA...  开头的)。

然后在 Windows PowerShell(管理员)执行:

notepad C:\ProgramData\ssh\administrators_authorized_keys

把复制的内容粘贴进去,保存并退出。


3️⃣ 设置严格权限(必做,否则直接拒绝)

icacls "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r
icacls "C:\ProgramData\ssh\administrators_authorized_keys" /grant "Administrators:F"
icacls "C:\ProgramData\ssh\administrators_authorized_keys" /grant "SYSTEM:F"

4️⃣ 重启 sshd 服务

Restart-Service sshd

5️⃣ 回到 Jenkins 容器测试免密

ssh -i /var/jenkins_home/.ssh/id_ed25519 -o StrictHostKeyChecking=no Administrator@192.168.0.11

我踩过这个坑,核心点就是:

  • Administrator 不能用  ~/.ssh/author  ized_keys 
  • 必须用  C:\ProgramDat  a\ssh\administrators_authorized_keys 
  • 必须改权限,不然直接无视你的 key

最终执行shell命令-前端

#!/bin/bash
set -e  # 遇到错误立即退出# -----------------------------
# Jenkins工作区 & SSH配置
# -----------------------------
WORKSPACE=$(pwd)
REMOTE_USER="Administrator"
REMOTE_HOST="192.168.0.11"
REMOTE_DIR="D:/nginx-1.22.0/upload/asm_front"
SSH_KEY="/var/jenkins_home/.ssh/id_ed25519"# -----------------------------
# 构建前日志
# -----------------------------
echo "[INFO] Working directory content:"
ls -alh "$WORKSPACE"# -----------------------------
# 安装依赖 & 构建项目
# -----------------------------
echo "[INFO] Installing dependencies..."
npm installecho "[INFO] Building project..."
npm run build:prodecho "[INFO] Current path: $(pwd)"
echo "[SUCCESS] Build completed successfully."# -----------------------------
# 上传整个 dist 目录到远程
# -----------------------------
echo "[INFO] Uploading entire dist directory to remote Windows server..."
scp -i "$SSH_KEY" \-o StrictHostKeyChecking=no \-o UserKnownHostsFile=/dev/null \-r "$WORKSPACE/dist" \$REMOTE_USER@$REMOTE_HOST:"$REMOTE_DIR"echo "[SUCCESS] Upload completed successfully!"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93067.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux操作系统从入门到实战(十八)在Linux里面怎么查看进程

Linux操作系统从入门到实战(十八)在Linux里面怎么查看进程前言一、如何识别一个进程?—— PID二、怎么查看进程的信息?方式1:通过/proc目录方式2:用ps命令三、父进程是什么?—— PPID四、bash是…

[TryHackMe](知识学习)---基于堆栈得到缓冲区溢出

1.了解缓冲区溢出WINDOWS程序动态调试工具immunity debuggerhttps://www.immunityinc.com/products/debugger/2.Mona脚本#!/usr/bin/env python3import socket, time, sysip "10.201.99.37"port 1337 timeout 5 prefix "OVERFLOW1 "string prefix &q…

LRU算法与LFU算法

知识点: LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法 Cache的容量有限,因此当Cache的容量用完后,而又有新的内容需要添加进来时, 就需要挑选 并舍弃原有的部分内容&#xf…

目标检测公开数据集全解析:从经典到前沿

目标检测公开数据集全解析:从经典到前沿 一、引言 目标检测(Object Detection)是计算机视觉领域的核心任务之一,旨在在图像或视频中识别并定位感兴趣的物体。与图像分类不同,目标检测不仅需要判断物体的类别&#xf…

数据备份与进程管理

一、数据备份1.Linux服务器中需要备份的数据(1)Linux系统重要数据:/root/目录,/home/目录,/etc/目录(2)安装服务的数据:Apache(配置文件,网页主目录&#xff…

docker volume卷入门教程

1. 基础概念 Docker卷是专门用于持久化容器数据的存储方案,独立于容器生命周期。其核心优势包括: 数据持久化:容器删除后数据仍保留跨容器共享:多个容器可访问同一卷备份与迁移:支持直接复制卷数据驱动支持&#xff1a…

计算机网络——协议

1. 计算机网络分层1.1 OSI 7层模型应用层表示层会话层传输层网络层数据链路层物理层1.2 TCP/IP 4 层模型应用层运输层网际层网络接口层1.3 5层体系机构应用层传输层网络层数据链路层物理层2. 应用层协议2.1 HTTP协议2.1.1 基本介绍HTTP(HyperText Transfer Protocol…

【React】hooks 中的闭包陷阱

在 React Hooks 中的 闭包陷阱(Closure Trap)在 useEffect、事件回调、定时器等场景里很常见。1. 闭包陷阱是什么 当你在函数组件里定义一个回调(比如事件处理函数),这个回调会捕获当时渲染时的变量值。如果后面状态更…

校园快递小程序(腾讯地图API、二维码识别、Echarts图形化分析)

🎈系统亮点:腾讯地图API、二维码识别、Echarts图形化分析;一.系统开发工具与环境搭建1.系统设计开发工具后端使用Java编程语言的Spring boot框架 项目架构:B/S架构 运行环境:win10/win11、jdk17小程序: 技术…

Python网络爬虫(二) - 解析静态网页

文章目录一、网页解析技术介绍二、Beautiful Soup库1. Beautiful Soup库介绍2. Beautiful Soup库几种解析器比较3. 安装Beautiful Soup库3.1 安装 Beautiful Soup 43.2 安装解析器4. Beautiful Soup使用步骤4.1 创建Beautiful Soup对象4.2 获取标签4.2.1 通过标签名获取4.2.2 通…

【Linux基础知识系列】第九十四篇 - 如何使用traceroute命令追踪路由

在网络环境中,了解数据包从源主机到目标主机的路径是非常重要的。这不仅可以帮助我们分析网络连接问题,还可以用于诊断网络延迟、丢包等问题。traceroute命令是一个强大的工具,它能够追踪数据包在网络中的路径,显示每一跳的延迟和…

达梦数据闪回查询-快速恢复表

Time:2025/08/12Author:skatexg一、环境说明DM数据库:DM8.0及以上版本二、适用场景研发在误操作或变更数据后,想马上恢复表到某个时间点,可以通过闪回查询功能快速实现(通过全量备份恢复时间长,成本高)三、…

力扣(LeetCode) ——225 用队列实现栈(C语言)

题目:用队列实现栈示例1: 输入: [“MyStack”, “push”, “push”, “top”, “pop”, “empty”] [[], [1], [2], [], [], []] 输出: [null, null, null, 2, 2, false] 解释: MyStack myStack new MyStack(); mySta…

微软推出AI恶意软件检测智能体 Project Ire

开篇 在8月5号,微软研究院发布了一篇博客文章,在该篇博客中推出了一款名为Project Ire的AI Agent。该Agent可以在无需人类协助的情况下,自主分析和分类二进制文件。它可以在无需了解二进制文件来源或用途的情况下,对文件进行完全的…

哪些对会交由SpringBoot容器管理?

在 Spring Boot 中,交由容器管理的对象通常称为“Spring Bean”,这些对象的创建、依赖注入、生命周期等由 Spring 容器统一管控。以下是常见的会被 Spring Boot 容器管理的对象类型及识别方式: 一、通过注解声明的组件(最常见) Spring Boot 通过类级别的注解自动扫描并注…

Android POS应用在android运行常见问题及解决方案

概述 本文档记录了在Android POS应用开发过程中遇到的两个关键问题及其解决方案: UnsatisfiedLinkError: couldnt find "libnative.so" 错误ActivityNotFoundException 错误商户信息一致性检查绕过 问题1:UnsatisfiedLinkError - libnative.so…

基于SpringBoot的旅游网站系统

1. 项目简介 旅游线路管理系统是一个基于Spring Boot的在线旅游服务平台,提供旅游线路展示、分类、预订、订单管理等功能。系统包含前台用户界面和后台管理模块,支持用户注册登录、线路浏览、收藏、下单支付、客服咨询等核心功能。管理员可管理线路信息、…

CVPR 2025 | 机器人操控 | RoboGround:用“掩码”中介表示,让机器人跨场景泛化更聪明

点击关注gongzhonghao【计算机sci论文精选】1.导读1.1论文基本信息论文标题:ROBOGROUND: Robotic Manipulation with Grounded Vision-Language Priors作者:Haifeng Huang, Xinyi Chen, Hao Li, Xiaoshen Han, Yilun Chen, Tai Wang, Zehan W…

构建Node.js单可执行应用(SEA)的方法

如果为了降低部署复杂度,可以考虑使用vercel/ncc。除非有特别理由,不建议使用SEA。1. 环境准备1.1. 基础要求Node.js: > 19.0.0 (推荐最新LTS版本)1.2. 安装依赖npm install postject typescript1.3. 验证环境node -v # 确认版本 > 19 ts…

Java19 Integer 位操作精解:compress与expand《Hacker‘s Delight》(第二版,7.4节)

compress(int i, int mask) 这个方法是Java 19中新增的一个强大的位操作函数。compress 方法的核心功能可以理解为 “按位过滤和压缩” 。过滤 (Filter): 它使用 mask(掩码)作为过滤器。对于输入整数 i,只有那些在 mask 中对应位为 1 的比特才…