Bir süredir yazmaya fırsatım olmuyordu. Geçtiğimiz günlerde WinSCP.NET wrapper C# içinde kullandım. Kullanımı oldukça basit ve iş gören bir komponent. .NET’de bütün sftp, ftp, scp gibi protokollerde dosya transferi, senkronizasyonu, ve en sevdiğim özellik olan uzak makinede komut çalıştırabilen bir dll’den bahsediyoruz.

Visual Studio.NET 2010 kullanıyorum. Uygulamayı da bunun üzerinden göstereceğim.

Önce winscp’nin sitesinden uygun dll ve uygulamayı indiriyoruz.

Ana Download Sayfası: http://winscp.net/eng/download.php

5.0.7 Beta WinSCP Kurulum Paketi: http://winscp.net/download/winscp507setup.exe

5.0.7 Beta WinSCP için dll ve .net wrapper: http://winscp.net/download/winscp507automation.zip

Yeni bir proje açıyorum;

Projeyi açar açmaz, referans olarak WinSCP.dll dosyasını ekliyorum.

(Referans eklemek için sağ taraftaki solution penceresinde “references”a ters tıklayıp “add reference” diyoruz)

Koda geçmeden önce mantığından bahsetsek daha iyi olur diye düşünüyorum.

WinSCP dll’ini projeye dahil ettik ama koddan da çağırmam gerekiyor;

1. using WinSCP;

WinSCP’de bilindiği üzere uzak bir makineye dosya transferi yada başka bir işlem yapmak için uzaktan bağlanıyoruz. Dolayısıyla bir oturum açıyoruz (session). Yani, bir “Session” nesnesine ihtiyacımız var. Bu sebeple önce “Session” türünde bir nesne oluşturuyorum.

2. Session session;

Oturum açmak için gerekli ilk nesnemi oluşturdum. Peki oturumu hangi parametrelerle açacağımızı belirtmedik. O yüzden bir de SessionOptions türünde bir nesne oluşturmam gerekiyor.

3. SessionOptions sessionOptions;

Geriye sadece Session’ı açmak kaldı. Hemen Session_Ac() diye bir fonksiyon imdadımıza yetişiyor.

Şimdi yukarıdaki koddan bahsedelim biraz. Önce SessionOptions türündeki nesnemizi özellikleriyle birlikte initialize ettik. Protokol için direk WinSCP içinde bir enümaratör kullanıyoruz. Hostname (ip adresi yada makine ismi), kullanıcı adı, şifre ve hostkey’i bu nesnenin özellikleri olarak belirttik.

Hostkey güvenlik gereği bir prosedür. Her sunucunun unique bir hostkey adresi bulunur ve bu adresin client tarafından doğrulandıktan sonra sunucuya bağlanması gerekir. Client bu bağlantının güvenli olup olmadığını hostkey ile doğrular.

.NET wrapper da başımın belası olan hostkey doğrulayıp sisteme bir türlü bağlanamama olayının iki çözümü var. Ya hostkey’i bir kereliğine alıp uygulamaya static olarak belirtiyorsunuz. Bu şekilde hardcoded yada bir konfigürasyon dosyasına yazılabilir. Yada sürekli farklı sunucularda çalışacak çözümler için benim farkettiğim demek saçma olur, ama en azından google’da önüme çıkmadı; kodun catch bloğu altında hata kodu içinden verify hostkey kısmını substring edip, bağlanmayı tekrar denemek.

Catch bloğundaki 4 satırlık kod bunun için. ilk önce hata kodunun tümünü txt string’ine alıyorum. Ardından da hata kodunu çok profesyonel sayılmayan bir yöntemle parse ediyorum. İçinden hata kodu içindeki sadece hostkey’i barındıran kısmı alıp bağlantı fonksiyonunu tekrar çağırıyorum.

Kodu daha stabil hale getirmek için ilk önce hata kodunun “ssh-rsa ” stringini içerip içermediğini kontrol etseymişim daha iyi olurmuş. Çünkü kod bu haliyle ne yüzden hata alırsa alsın sonsuza kadar tekrar bağlanmayı deneyecek.. Çok korkutucu.

Şöyle yapsaymışım iyiymiş..

Böyle daha iyi.. Catch bloğunda yaptığım işin genel adı hostkey switching diye geçiyor.  Aslında yazımın tek amacı şu hostkey switching’i anlatmaktı. Çünkü diğer kod blogları googledan zaten kolaylıkla bulunabilir.

WinSCP scripting sadece .NET wrapper kullanılarak yapılabilir birşey değil. Normal windows batch dosyalarını kullanarak da gayet güzel scriptler hazırlayabilir, bunları windows’ta schedule tasks altından çalıştırıp bir çok işi scriptlere yaptırabilirsiniz. iki sunucu arasında dosya senkronizasyonu sağlamak, yada yedekleme yapmak gibi ihtiyaçları kolaylıkla basit scriptlerle de karşılayabilirsiniz.

Google Anahtar Kelimeler: winscp scripting, winscp .net wrapper

Daha fazla araştırmak için winscp dökümantasyonlarına ve son derece başarılı bulduğum tutorial’larını da inceleyebilirsiniz.

.NET Wrapper dökümantasyon: http://winscp.net/eng/docs/library

Scripting dökümantasyon: http://winscp.net/eng/docs/scripting