Datei hochladen mit WinSCP

Neulich musste ich mal wieder eine Datei auf einen SFTP Server hochladen. Und wie es immer so ist, ich konnte mich nur noch teilweise daran errinern wie es geht 🙂

Ich wusse noch das ich WINSCP für den Upload benutzt hatte und wie hübsch einfach die Powershell API ist. WINSCP ist so nett und liefert gleich eine .Net Library mit, die man einfach in jedem Powershell über Add-Type einlinken kann.

Zur Vorbereitung, um die Library nutzen zu können, braucht man natürlich erstmal den Host Name vom Server sowie User und Passwort. Zusätzlich braucht man aber auch den Fingerprint des jeweiligen Server Schlüssels. Hierfür empfehle ich einfach mit der Oberfläche von WinSCP mal eine Verbindung zu dem Server aufzubauen und unter dem Menüpunkt Sessions/Info den Finterprint nachzusehen, der Fingerprint sieht dann ungefähr so aus: 69:32:29:58:c0:21:7d:b3:6d:0f:8a:0d:48:ce:e5:f2

Nun aber zum Script, wie immer bei einem Upload sollte man damit beginnen den Ziel Ordner zu überprüfen, ob man die Daten überhaupt dort hinkopieren kann. Sprich welche Dateien liegen den im Zielordner so herum:

#add the library
Add-Type -Path $p_path_to_winscp
 
#preset the options for the session
$session_opt = New-Object WinSCP.SessionOptions
$session_opt.Protocol = [WinSCP.Protocol]::Sftp
$session_opt.HostName = "Server.irgendwo.de"
$session_opt.UserName = "Username"
$session_opt.Password = "Password"
$session_opt.SshHostKeyFingerprint = "ssh-rsa 2048 " + "69:32:29:58:c0:21:7d:b3:6d:0f:8a:0d:48:ce:e5:f2"
 
#create the session object
$session = New-Object WinSCP.Session	
 
# Connect with the set parameters
$session.Open($session_opt)
 
#query for target directory
$directory = $session.ListDirectory("Mein Zielordner auf dem Server")
 
foreach ($fileInfo in $directory.Files){
 
	#debugging
	Write-Host ("{0} with size {1}, permissions {2} and last modification at {3}" -f $fileInfo.Name, $fileInfo.Length, $fileInfo.FilePermissions, $fileInfo.LastWriteTime)
}

Soweit so gut, und jetzt wollen wir ja noch eine Datei hochladen und das sieht dann in etwa so aus:

 
# Set the transfer options, Binary is always a good choice
$transferOptions = New-Object WinSCP.TransferOptions
$transferOptions.TransferMode = [WinSCP.TransferMode]::Binary
 
$transferResult = $session.PutFiles("Path to local file", $False, $transferOptions)		
 
# Throw on any error
$transferResult.Check()		
 
# Disconnect, clean up
$session.Dispose()

Und fertig ist der Upload 🙂

http://www.agile-coding.net/datei-hochladen-mit-winscp/