@@ -0,0 +1,66 @@
|
||||
# Agent-safe: test SSH auth against a remote (Gitea-friendly). Never prints private keys.
|
||||
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$RemoteUrl
|
||||
)
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
. (Join-Path $PSScriptRoot 'common.ps1')
|
||||
|
||||
$parsed = Parse-GitRemoteUrl -RemoteUrl $RemoteUrl
|
||||
if ([string]$parsed.Protocol -ne 'ssh') {
|
||||
Write-StatusLine -Key 'status' -Value 'skipped'
|
||||
Write-StatusLine -Key 'reason' -Value 'not_ssh_remote'
|
||||
Write-StatusLine -Key 'protocol' -Value ([string]$parsed.Protocol)
|
||||
exit 0
|
||||
}
|
||||
|
||||
$hostName = [string]$parsed.Host
|
||||
$port = $parsed.Port
|
||||
$sshArgs = @()
|
||||
if ($null -ne $port -and [int]$port -ne 22) {
|
||||
$sshArgs += @('-p', "$port")
|
||||
}
|
||||
$sshArgs += @('-o', 'BatchMode=yes', '-T', "git@$hostName")
|
||||
|
||||
$prevEap = $ErrorActionPreference
|
||||
$ErrorActionPreference = 'Continue'
|
||||
try {
|
||||
$output = & ssh @sshArgs 2>&1 | Out-String
|
||||
$code = $LASTEXITCODE
|
||||
}
|
||||
finally {
|
||||
$ErrorActionPreference = $prevEap
|
||||
}
|
||||
|
||||
$text = if ($null -eq $output) { '' } else { [string]$output }
|
||||
$ok = $false
|
||||
if ($text -match 'successfully authenticated' -or
|
||||
$text -match 'Hi there,' -or
|
||||
$text -match 'Welcome to Gitea' -or
|
||||
$text -match "You've successfully authenticated") {
|
||||
$ok = $true
|
||||
}
|
||||
|
||||
# Gitea/GitHub often exit 1 even when auth succeeded (no shell).
|
||||
if ($ok) {
|
||||
Write-StatusLine -Key 'status' -Value 'ok'
|
||||
} else {
|
||||
Write-StatusLine -Key 'status' -Value 'failed'
|
||||
Write-StatusLine -Key 'exit_code' -Value "$code"
|
||||
}
|
||||
|
||||
Write-StatusLine -Key 'host' -Value $hostName
|
||||
if ($null -ne $port) {
|
||||
Write-StatusLine -Key 'port' -Value "$port"
|
||||
} else {
|
||||
Write-StatusLine -Key 'port' -Value '22'
|
||||
}
|
||||
# Safe to show SSH server greeting; strip nothing secret-bearing beyond pubkey auth result.
|
||||
$oneLine = ($text -replace '\r?\n', ' ').Trim()
|
||||
if ($oneLine.Length -gt 240) { $oneLine = $oneLine.Substring(0, 240) }
|
||||
Write-StatusLine -Key 'message' -Value $oneLine
|
||||
|
||||
if (-not $ok) { exit 1 }
|
||||
exit 0
|
||||
Reference in New Issue
Block a user