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
英文地址,請注明出處:http://en.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 的比特才…