Add one-click deployment scripts
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[string]$ServerHost = "192.168.31.51",
|
||||
[string]$ServerUser = "jsxq",
|
||||
[int]$SshPort = 22
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
$knownHostsFile = Join-Path ([IO.Path]::GetTempPath()) "codex-company-linux-known-hosts"
|
||||
|
||||
function Require-Command([string]$Name) {
|
||||
if (-not (Get-Command $Name -ErrorAction SilentlyContinue)) {
|
||||
throw "Required command not found: $Name"
|
||||
}
|
||||
}
|
||||
|
||||
Require-Command "ssh.exe"
|
||||
Require-Command "ssh-keygen.exe"
|
||||
|
||||
if ([string]::IsNullOrWhiteSpace($env:COMPANY_LINUX_PASSWORD)) {
|
||||
throw "Set COMPANY_LINUX_PASSWORD in the current process before running first-time key setup."
|
||||
}
|
||||
|
||||
$sshDirectory = Join-Path $env:USERPROFILE ".ssh"
|
||||
$privateKey = Join-Path $sshDirectory "id_ed25519"
|
||||
$publicKey = "$privateKey.pub"
|
||||
|
||||
if (-not (Test-Path -LiteralPath $publicKey)) {
|
||||
New-Item -ItemType Directory -Path $sshDirectory -Force | Out-Null
|
||||
& ssh-keygen.exe -q -t ed25519 -f $privateKey -N "" -C "$env:USERNAME@codex-company-linux"
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw "ssh-keygen failed with exit code $LASTEXITCODE"
|
||||
}
|
||||
}
|
||||
|
||||
$keyText = (Get-Content -LiteralPath $publicKey -Raw).Trim()
|
||||
if ([string]::IsNullOrWhiteSpace($keyText)) {
|
||||
throw "Public key is empty: $publicKey"
|
||||
}
|
||||
|
||||
$keyBase64 = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($keyText))
|
||||
$askPass = Join-Path $PSScriptRoot "ssh-askpass.cmd"
|
||||
$oldAskPass = $env:SSH_ASKPASS
|
||||
$oldAskPassRequire = $env:SSH_ASKPASS_REQUIRE
|
||||
$oldDisplay = $env:DISPLAY
|
||||
|
||||
try {
|
||||
$env:SSH_ASKPASS = $askPass
|
||||
$env:SSH_ASKPASS_REQUIRE = "force"
|
||||
$env:DISPLAY = "codex"
|
||||
|
||||
$remote = "set -eu; umask 077; mkdir -p ~/.ssh; touch ~/.ssh/authorized_keys; key=`$(printf '%s' '$keyBase64' | base64 -d); grep -qxF -- `"`$key`" ~/.ssh/authorized_keys || printf '%s\n' `"`$key`" >> ~/.ssh/authorized_keys; chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys"
|
||||
& ssh.exe -T -p $SshPort -o StrictHostKeyChecking=accept-new -o "UserKnownHostsFile=$knownHostsFile" -o ConnectTimeout=10 -o NumberOfPasswordPrompts=1 "$ServerUser@$ServerHost" $remote
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw "Unable to install the SSH public key."
|
||||
}
|
||||
} finally {
|
||||
$env:SSH_ASKPASS = $oldAskPass
|
||||
$env:SSH_ASKPASS_REQUIRE = $oldAskPassRequire
|
||||
$env:DISPLAY = $oldDisplay
|
||||
}
|
||||
|
||||
& ssh.exe -T -p $SshPort -o BatchMode=yes -o StrictHostKeyChecking=accept-new -o "UserKnownHostsFile=$knownHostsFile" -o ConnectTimeout=10 "$ServerUser@$ServerHost" "echo SSH_KEY_READY"
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw "The key was installed, but key authentication verification failed."
|
||||
}
|
||||
|
||||
Write-Output "SSH key authentication is ready for $ServerUser@$ServerHost."
|
||||
Reference in New Issue
Block a user