SFTP (SSH FTP) (Secure Shell File Transfer Protocol) C#

Bir süredir geliştireceğim windows servisinde kullanmak için SFTP üzerine araştırmalar yapıyordum. Olay şu ki; aldığımız bir servis, ürettiği gün sonu raporlarını kendi üzerlerindeki bir SFTP alanına atıyor ve benim bu raporlar üzerine bazı  işlemler yapmam gerekiyor. Dolayısıyla C# yazılımımdan SFTP bağlantı kurup oluşturulmuş raporları almam gerekiyordu.

Sonradan anladım ki SFTP aslında çok da kullanılan bir yöndem değilmiş ve durum böyle olunca çok fazla kaynağa ulaşamıyorsunuz. Yani .Net ile geliştirilmiş ve .Net içerisinde kullanabileceğiniz çok fazla kaynak yok. PHP ile birlikte default gelen birşey aslında bu. Buradan bir kez daha PHP’ye övgüler göndermek istiyorum. Piyasada 2 tane hazır geliştirilmiş ücretli olarak satılan kütüphane mevcut. Birkaç tane de ücretsiz olarak ve açık kaynak kodlu olarak geliştirilmiş kütüphane var.

Tabii ki ben ücretsiz olanlardan birini kullanarak işimi hallettim. 🙂 Ücretsiz kütüphaneler içerisinde düzgün çalışan tek kodu geliştirmiş olan Tamir Gal isimli geliştiriciye buradan teşekkür etmek istiyorum.

Ücretsiz kütüphaneye ise aşağıdaki linkten ulaşabilirsiniz.

http://sourceforge.net/projects/sharpssh/files/

Kütüphaneyi projenize ekledikten sonra aşağıda vereceğim örnek ile karşı taraftaki dosyaları bilgisayarınza kolayca indirebilirsiniz.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;
using Tamir.SharpSsh;

namespace sftpConsole
{
class Program
{
static void Main()
{

const string sftp_host = "ftp.hostdonain.com";
const string sftp_user = "kullanıcıadı";
const string sftp_pass = "şifre";
const int sftp_port = 22;

var sftp = new Sftp(sftp_host, sftp_user, sftp_pass);

sftp.Connect(sftp_port);

Console.WriteLine(sftp.ServerVersion);

const string dir = "/";

var liste = sftp.GetFileList(dir);

foreach (var dosya in liste)
{
sftp.Get(dir + dosya, @"c:\" + dosya);
Console.WriteLine(dosya);
}

sftp.Close();

Console.WriteLine("\n\nTamam.");
}
}
}

İyi günler efem…

“SFTP (SSH FTP) (Secure Shell File Transfer Protocol) C#” üzerine 14 düşünce

  1. Merhaba Bahadir bey,

    Bu işlemi şu mantık için nasıl yapabilirim sizce?

    Bir web sunucuda SFTP ile erişilen klasörüm var ve özel geliştireceğim yazılım ile bu sunucudaki bu klasörü kendi bilgisayarımda bir HDD olarak gösterip bu şekilde kullanacağım.

    Nasıl yapabilirim?

  2. Bilgisayarda bir HDD olarak göstermek istemenizdeki amacınız yanlızca yedek alma ve bu yedekten geri dönmek ise bunun için illa bir HDD olarak göstermeye gerek yok.

    Ancak HDD olarak gösterme işini, bilgisayarınızdaki bir programın veri dosyalarını tutmak, bu programın bu sürücüdeki dosyalara, veri yada veritabanı dosyalarına erişip, bu dosyaları açık tutması gibi bir yapıya zaten SFTP yada herhangi bir FTP, SFTP, SSHFTP xxTP yapısı uygun değildir… Transfer Protokollerinin amaçları verinin düz bir şekilde upload/download işlemini sağlamaktır. Transfer Protokolüyle herhangi bir dosyayın belli bir bölümüne erişip yanlızca o bölümü değiştirip kaydetme imkanı yoktur. Yani Random Access olayına kapalıdır.

  3. Selam
    bağlandım sftp’ye dosyalrı görebiliyorum. Ben dosya göndermek istiyorum bunu nasıl yapabilirim yardımcı olabilirmisiniz ?

  4. Evet bu da güzel bir çözüm olmuş. Sadece şöyle iki handikapı olacaktır. Birincisi herkes sistemine yeni bir .exe file koymak istemeyebilir. İkincisi de web sunucusu kendinin olmayan yada standart hosting üzerinde geliştirme yapacak kişiler sunucuya bu uygulamayı yükletemeyebilirler. Örneğin; Godaddy’deki bir Shared Hosting’e bunu yaptırmanız imkansız.

  5. Merhabalar Yazıyı Paylaştığınız İçin Teşekkür Ederim Beni C# ile Ssh Bağlantısında Bir Adım Daha Yaklaştırdı. Yalnız Benim Bir Sorum Var.
    Benim Şu Şekilde Bir Program Yazmam Gerekiyor Ssh Bağlanacak Ve “cd /usr/” gibi komut verebilmem gerekiyor acaba bunu nasıl yapabilirim yardımcı olursanız çok memnun olurum iyi Bloglar.

  6. Merhabalar, Aynı kütüphane içerisinde “SshExec” isimli bir class bulunmakta. Bu class’ı kullanarak istediğinizi yapabiliyorsunuz.

    var sftp = new SshExec(sftp_host, sftp_user, sftp_pass);
    sftp.Connect(sftp_port);
    Console.WriteLine(sftp.RunCommand(“CWD images”));
    sftp.Close();

  7. s.a hocam ben texbox lar ile ssh ve ftp baglantısı yapmasını istiyorum ama fazla bir bilgim yok bu konuda tamir gal ile baktım ama yapamadım. yardımcı olursanız sevinirim.

  8. Uzak bir sunucuya connect olmaya çalışınca şu hatayı alıyorum,sebebini bulamadım,fikriniz var mı?

    {Tamir.SharpSsh.jsch.JSchException: Session.connect: System.Security.Cryptography.CryptographicException: Hatalı Veri.

    konum: System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr)
    konum: System.Security.Cryptography.Utils._ImportKey(SafeProvHandle hCSP, Int32 keyNumber, CspProviderFlags flags, Object cspObject, SafeKeyHandle& hKey)
    konum: System.Security.Cryptography.DSACryptoServiceProvider.ImportParameters(DSAParameters parameters)
    konum: Tamir.SharpSsh.jsch.jce.SignatureDSA.verify(Byte[] sig)
    konum: Tamir.SharpSsh.jsch.DHG1.next(Buffer _buf)
    konum: Tamir.SharpSsh.jsch.Session.connect(Int32 connectTimeout)
    konum: Tamir.SharpSsh.jsch.Session.connect(Int32 connectTimeout)
    konum: Tamir.SharpSsh.jsch.Session.connect()
    konum: Tamir.SharpSsh.SshBase.ConnectSession(Int32 tcpPort)
    konum: Tamir.SharpSsh.SshBase.Connect(Int32 tcpPort)

  9. öncelikle teşekkürler.şöyle bir hata karşıma çıkmakta:
    System.Net.Sockets.SocketException (0x80004005): Hedef makine etkin olarak reddettiğinden bağlantı kurulamadı 192.168.1.3:22

    konum: System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)

    nedeni ne olabilir.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir