SSH und SFTP mit der PowerShell

Wer gerne die Windows PowerShell nutzt und damit auch Linux Systeme administrieren möchte, der kann seit dem Windows Management Framework 5.0 direkt in der PowerShell mit SSH und SFTP arbeiten. Es muss nur das PowerShell Modul Posh-SSH installiert werden und dann kann es auch schon losgehen. In diesem Beitrag gibt es jeweils ein kleines Beispiel wie die Befehle für SSH und SFTP mit der PowerShell genutzt werden können.SSH und SFTP mit der PowerShell - Posh-SSH Modul

Installation Posh-SSH Modul

Mit Windows 10 und Windows Server 2016 kann direkt mit der Installation gestartet werden, denn hier ist das Windows Management Framework 5.0 (Download Link) bereits vorhanden. Mit dem folgenden Befehl kann das Posh-SSH Modul dann installiert werden. Auf älteren Windows Betriebssystemen (siehe “Supported Operating System” im Download Link) muss vorab noch das Windows Management Framework aktualisiert werden.

Install-Module Posh-SSH

Für die Installation wird einmalig eine Internetverbindung benötigt. Die erste Meldung, ob NuGet installiert werden darf, kann mit Enter bestätigt werden. Da das benötigte NuGet aus einem nicht bekannten Repository geladen wird, muss die zweite Warnung mit Y bestätigt werden.SSH und SFTP mit der PowerShell - Install-Module Posh-SSH

Befehle

Wer sich einen Überblick über die Posh-SSH Funktionen und Cmdlets machen möchte, kann sich alle über den folgenden Befehl ausgegeben lassen.
Get-Command -Module Posh-SSH

Die Liste der Funktionen und Cmdlets ist sehr umfangreich.

CommandType     Name                                 Version    Source
-----------     ----                                 -------    ------
Function        Get-PoshSSHModVersion                1.7.6      Posh-SSH
Function        Get-SFTPChildItem                    1.7.6      Posh-SSH
Function        Get-SFTPContent                      1.7.6      Posh-SSH
Function        Get-SFTPCurrentDirectory             1.7.6      Posh-SSH
Function        Get-SFTPDirectoryList                1.7.6      Posh-SSH
Function        Get-SFTPLocation                     1.7.6      Posh-SSH
Function        Get-SFTPPathAttribute                1.7.6      Posh-SSH
Function        Get-SFTPSession                      1.7.6      Posh-SSH
Function        Get-SSHSession                       1.7.6      Posh-SSH
Function        Get-SSHTrustedHost                   1.7.6      Posh-SSH
Function        Invoke-SSHCommand                    1.7.6      Posh-SSH
Function        Invoke-SSHCommandStream              1.7.6      Posh-SSH
Function        Invoke-SSHStreamExpectAction         1.7.6      Posh-SSH
Function        Invoke-SSHStreamExpectSecureAction   1.7.6      Posh-SSH
Function        New-SFTPDirectory                    1.7.6      Posh-SSH
Function        New-SFTPFileStream                   1.7.6      Posh-SSH
Function        New-SFTPItem                         1.7.6      Posh-SSH
Function        New-SFTPSymlink                      1.7.6      Posh-SSH
Function        New-SSHShellStream                   1.7.6      Posh-SSH
Function        New-SSHTrustedHost                   1.7.6      Posh-SSH
Function        Remove-SFTPDirectory                 1.7.6      Posh-SSH
Function        Remove-SFTPFile                      1.7.6      Posh-SSH
Function        Remove-SFTPItem                      1.7.6      Posh-SSH
Function        Remove-SFTPSession                   1.7.6      Posh-SSH
Function        Remove-SSHSession                    1.7.6      Posh-SSH
Function        Remove-SSHTrustedHost                1.7.6      Posh-SSH
Function        Rename-SFTPFile                      1.7.6      Posh-SSH
Function        Set-SFTPContent                      1.7.6      Posh-SSH
Function        Set-SFTPCurrentDirectory             1.7.6      Posh-SSH
Function        Set-SFTPLocation                     1.7.6      Posh-SSH
Function        Set-SFTPPathAttribute                1.7.6      Posh-SSH
Function        Test-SFTPPath                        1.7.6      Posh-SSH
Cmdlet          Get-SCPFile                          1.7.6      Posh-SSH
Cmdlet          Get-SCPFolder                        1.7.6      Posh-SSH
Cmdlet          Get-SFTPFile                         1.7.6      Posh-SSH
Cmdlet          New-SFTPSession                      1.7.6      Posh-SSH
Cmdlet          New-SSHSession                       1.7.6      Posh-SSH
Cmdlet          Set-SCPFile                          1.7.6      Posh-SSH
Cmdlet          Set-SCPFolder                        1.7.6      Posh-SSH
Cmdlet          Set-SFTPFile                         1.7.6      Posh-SSH

Functions Skript

Im folgendem Skript (Functions-SSH.ps1) sind die Funktionen für das SSH und SFTP Skript gespeichert.

Die erste Funktion (CreatePasswordFile) speichert das Passwort (verschlüsselt über DPAPI) in einer Datei ab. Pro ComputerName Variable wird geprüft, ob bereits ein “Password File” vorhanden ist. Wenn noch keins vorhanden ist, wird das Passwort abgefragt und im “PasswordFile” abgelegt. Wurde das Kennwort geändert oder bei der Erstellung falsch eingegeben, muss das “Password File” per Hand gelöscht werden.

In der zweiten Funktion (CreateCredentialObject) wird das “Password File” ausgelesen und das darin enthaltene Passwort entschlüsselt. Aus dem Passwort und der Username Variable wird dann ein Credential Object erstellt, welches für den Verbindungsaufbau im SSH oder SFTP Skript verwendet wird.

############################################################
#
# Functions Script
#
# Author: Stefan Nikolaus
# Source: www.nikolaus-lueneburg.de
#
############################################################

function CreatePasswordFile ($FilePath)
{
    if (Test-Path $FilePath)
    {
        Write-Host "Password file allready exist" -ForegroundColor Green
    }
    else
    {
        Try
        {
            # Dialog to enter credentials
            Read-Host -assecurestring | ConvertFrom-SecureString | Out-File $FilePath
        }
        Catch
        {
          Write-Host $_.Exception.Message -ForegroundColor Red
          break
        }
        Write-Host "Writing password file to" $FilePath -ForegroundColor Green
    }
}

function CreateCredentialObject ($FilePath, $Username)
{
    if (Test-Path $FilePath)
    {
        # Load password file
        $Password = cat $FilePath | ConvertTo-SecureString

        # Create credential object
        Write-Host "Creating credential object" -ForegroundColor Green
        $Cred = New-Object -typename System.Management.Automation.PSCredential -ArgumentList $Username, $Password
        Return $Cred
    }
    else
    {
        Write-Host "Password file missing" -ForegroundColor Red
    }
}

SSH Skript

Das SSH Skript liest die Belegung der Festplatte aus und würde, wenn man das # Zeichen vor Invoke-SSHCommand entfernt, einen Neustart des Systems durchführen.

############################################################
#
# SSH EXAMPLE SCRIPT
#
# Author: Stefan Nikolaus
# Source: www.nikolaus-lueneburg.de
#
############################################################

$ComputerName = "192.168.1.123"
$Username = "root"

# Password File
$PasswordFolder = "C:\temp"
$Extension = ".sec"

# Function
$FunctionsFile = "Functions-SSH.ps1"

# General Settings
$Timeout = 30

############################################################

$PasswordFilename = $ComputerName + $Extension
$PasswordFilePath = Join-Path $PasswordFolder $PasswordFilename

# Load Functions Script
$FunctionsScript = Join-Path $PSScriptRoot $FunctionsFile
. $FunctionsScript

# Create Password File if needed
CreatePasswordFile -FilePath $PasswordFilePath

# Create Credential Object
$Credentials = CreateCredentialObject -FilePath $PasswordFilePath -Username $Username

# Create SSH Session
Write-Host "Create SSH Session" -ForegroundColor Green
Try
{
    $Session = New-SSHSession -ComputerName $ComputerName -Credential $Credentials -ConnectionTimeout $Timeout -AcceptKey:$true -ErrorAction Stop # -Verbose
}
Catch
{
  Write-Host $_.Exception.Message -ForegroundColor Red
  break
}

# Show Disk Usage
Write-Host "Show Disk Usage" -ForegroundColor Green
Write-Host "######"
Invoke-SSHCommandStream -SSHSession $Session -Command "df -h"
Write-Host "######"

# Reboot Server
Write-Host "Reboot Server" -ForegroundColor Green
#Invoke-SSHCommand -SSHSession $Session -Command "reboot"

# Disconnect SSH Session
Write-Host "Disconnect SSH Session" -ForegroundColor Green
Remove-SSHSession $Session | Out-Null

SFTP Skript

Das Skript gibt den Inhalt vom Apache Error Log aus, kopiert das Messages Log nach C:\temp, kopiert die Datei text.txt (Datei muss existieren) aus c:\temp ins /usr/src Verzeichnis und gibt dann den Inhalt von /usr/src aus.

############################################################
#
# SFTP EXAMPLE SCRIPT
#
# Author: Stefan Nikolaus
# Source: www.nikolaus-lueneburg.de
#
############################################################

$ComputerName = "192.168.1.123"
$Username = "root"

# Password File
$PasswordFolder = "C:\temp"
$Extension = ".sec"

# Function
$FunctionsFile = "Functions-SSH.ps1"

# General Settings
$Timeout = 30

############################################################

$PasswordFilename = $ComputerName + $Extension
$PasswordFilePath = Join-Path $PasswordFolder $PasswordFilename

# Load Functions Script
$FunctionsScript = Join-Path $PSScriptRoot $FunctionsFile
. $FunctionsScript

# Create Password File if needed
CreatePasswordFile -FilePath $PasswordFilePath

# Create Credential Object
$Credentials = CreateCredentialObject -FilePath $PasswordFilePath -Username $Username

# Create SFTP Session
Write-Host "Create SFTP session" -ForegroundColor Green
Try
{
    $Session = New-SFTPSession -ComputerName $ComputerName -Credential $Credentials -ConnectionTimeout $Timeout -AcceptKey:$true -ErrorAction Stop # -Verbose
}
Catch
{
  Write-Host $_.Exception.Message -ForegroundColor Red
  break
}

# Get content from file
Write-Host "Get content from file" -ForegroundColor Green
Write-Host "######"
Get-SFTPContent -SFTPSession $Session -Path /var/log/apache2/error.log
Write-Host "######"

# Get file from SFTP server
Write-Host "Get file from SFTP server" -ForegroundColor Green
Get-SFTPFile -SFTPSession $Session -LocalPath c:\temp -RemoteFile /var/log/messages -Overwrite:$true

# Copy file to SFTP server
Write-Host "Copy file to SFTP server" -ForegroundColor Green
Set-SFTPFile -SFTPSession $Session -LocalFile c:\temp\test.txt -RemotePath /usr/src -Overwrite:$true

# Get folder items from SFTP server
Write-Host "Get folder items" -ForegroundColor Green
$Folder = "/usr/src"
$SrcFolder = Get-SFTPChildItem -SFTPSession $Session -Path $Folder
$FilesInSrcFolder = $SrcFolder | Where-Object {$_.IsDirectory -eq $false}

# Show File Details
Write-Host "######"
$FilesInSrcFolder | FT Name, Length, LastWriteTime
Write-Host "######"

# Disconnect SFTP Session
Write-Host "Disconnect SFTP session" -ForegroundColor Green
Remove-SFTPSession $Session | Out-Null

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert