141 lines
4.1 KiB
PowerShell
141 lines
4.1 KiB
PowerShell
$script:DetMirConfigPath = if ($env:DETMIR_WINDOWS_CONFIG_PATH) {
|
|
$env:DETMIR_WINDOWS_CONFIG_PATH
|
|
}
|
|
else {
|
|
Join-Path $HOME '.config/powershell/detmir-windows.psd1'
|
|
}
|
|
|
|
$script:DetMirConfig = @{}
|
|
|
|
if (Test-Path -LiteralPath $script:DetMirConfigPath) {
|
|
try {
|
|
$script:DetMirConfig = Import-PowerShellDataFile -Path $script:DetMirConfigPath
|
|
}
|
|
catch {
|
|
$script:DetMirConfig = @{}
|
|
}
|
|
}
|
|
|
|
function Get-DetMirWindowsSetting {
|
|
[CmdletBinding()]
|
|
param(
|
|
[Parameter(Mandatory)]
|
|
[string]$EnvName,
|
|
|
|
[Parameter(Mandatory)]
|
|
[string]$ConfigKey,
|
|
|
|
[string]$Default = ''
|
|
)
|
|
|
|
$envValue = [Environment]::GetEnvironmentVariable($EnvName)
|
|
if (-not [string]::IsNullOrWhiteSpace($envValue)) {
|
|
return $envValue
|
|
}
|
|
|
|
if ($script:DetMirConfig.ContainsKey($ConfigKey) -and -not [string]::IsNullOrWhiteSpace([string]$script:DetMirConfig[$ConfigKey])) {
|
|
return [string]$script:DetMirConfig[$ConfigKey]
|
|
}
|
|
|
|
return $Default
|
|
}
|
|
|
|
$Global:DetMirWindowsHost = Get-DetMirWindowsSetting -EnvName 'DETMIR_WINDOWS_SSH_HOST' -ConfigKey 'Host' -Default '192.168.100.18'
|
|
$Global:DetMirWindowsUser = Get-DetMirWindowsSetting -EnvName 'DETMIR_WINDOWS_SSH_USER' -ConfigKey 'User' -Default 'Администратор'
|
|
$Global:DetMirWindowsPassword = Get-DetMirWindowsSetting -EnvName 'DETMIR_WINDOWS_SSH_PASSWORD' -ConfigKey 'Password'
|
|
$Global:DetMirWindowsPort = [int](Get-DetMirWindowsSetting -EnvName 'DETMIR_WINDOWS_SSH_PORT' -ConfigKey 'Port' -Default '22')
|
|
$Global:DetMirWindowsPowerShellPath = Get-DetMirWindowsSetting -EnvName 'DETMIR_WINDOWS_POWERSHELL_PATH' -ConfigKey 'PowerShellPath' -Default 'powershell.exe'
|
|
|
|
function Get-DetMirWindowsSshTarget {
|
|
[CmdletBinding()]
|
|
param()
|
|
|
|
if ([string]::IsNullOrWhiteSpace($Global:DetMirWindowsUser)) {
|
|
return $Global:DetMirWindowsHost
|
|
}
|
|
|
|
return "$($Global:DetMirWindowsUser)@$($Global:DetMirWindowsHost)"
|
|
}
|
|
|
|
function Get-DetMirWindowsSshArguments {
|
|
[CmdletBinding()]
|
|
param()
|
|
|
|
return @(
|
|
'-o', 'ServerAliveInterval=15',
|
|
'-o', 'ServerAliveCountMax=3',
|
|
'-o', 'StrictHostKeyChecking=accept-new',
|
|
'-o', 'LogLevel=ERROR',
|
|
'-o', 'PreferredAuthentications=password,keyboard-interactive,publickey',
|
|
'-p', [string]$Global:DetMirWindowsPort,
|
|
(Get-DetMirWindowsSshTarget)
|
|
)
|
|
}
|
|
|
|
function Invoke-DetMirWindowsSsh {
|
|
[CmdletBinding()]
|
|
param(
|
|
[Parameter(Mandatory)]
|
|
[string]$Command
|
|
)
|
|
|
|
$sshArgs = Get-DetMirWindowsSshArguments
|
|
$sshArgs += $Command
|
|
|
|
if ([string]::IsNullOrWhiteSpace($Global:DetMirWindowsPassword)) {
|
|
& ssh @sshArgs
|
|
return
|
|
}
|
|
|
|
& sshpass '-p' $Global:DetMirWindowsPassword ssh @sshArgs
|
|
}
|
|
|
|
function Enter-DetMirWindowsSsh {
|
|
[CmdletBinding()]
|
|
param()
|
|
|
|
$sshArgs = Get-DetMirWindowsSshArguments
|
|
|
|
if ([string]::IsNullOrWhiteSpace($Global:DetMirWindowsPassword)) {
|
|
& ssh @sshArgs
|
|
return
|
|
}
|
|
|
|
& sshpass '-p' $Global:DetMirWindowsPassword ssh @sshArgs
|
|
}
|
|
|
|
function Invoke-DetMirWindowsPowerShell {
|
|
[CmdletBinding()]
|
|
param(
|
|
[Parameter(Mandatory)]
|
|
[string]$Script
|
|
)
|
|
|
|
$bootstrap = @"
|
|
[Console]::InputEncoding = [System.Text.Encoding]::UTF8
|
|
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
|
`$OutputEncoding = [System.Text.Encoding]::UTF8
|
|
$Script
|
|
"@
|
|
|
|
$encoded = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($bootstrap))
|
|
Invoke-DetMirWindowsSsh "$($Global:DetMirWindowsPowerShellPath) -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Bypass -EncodedCommand $encoded"
|
|
}
|
|
|
|
function Test-DetMirWindowsPowerShell {
|
|
[CmdletBinding()]
|
|
param()
|
|
|
|
Invoke-DetMirWindowsPowerShell @'
|
|
$PSVersionTable.PSVersion.ToString()
|
|
[Environment]::OSVersion.VersionString
|
|
(Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').ProductName
|
|
'@
|
|
}
|
|
|
|
Set-Alias detmir-win-target Get-DetMirWindowsSshTarget
|
|
Set-Alias detmir-win-ssh Invoke-DetMirWindowsSsh
|
|
Set-Alias detmir-win-shell Enter-DetMirWindowsSsh
|
|
Set-Alias detmir-win-ps Invoke-DetMirWindowsPowerShell
|
|
Set-Alias detmir-win-test Test-DetMirWindowsPowerShell
|