# SSH ve Rsync Kullanımı: .ssh/config Dosyası, Anahtar Oluşturma ve Dosya Aktarı

## 📁 `.ssh/config` dosyası ne işe yarar

```python
Host my.host
    HostName 123.123.32.231
    User username
		IdentityFile ".ssh/rsa.pem"
		ForwardAgent yes

# Tüm sunucular için ortak ayarlar
Host *
  ForwardAgent yes
  AddKeysToAgent yes
```

* `.ssh/config` dosyasına sunuculara bağlanmak için gerekli bilgileri kaydederiz
* `HostName` sunucunun IP adresi
* `User` sunucudaki kullanıcı adı
* `IdentityFile` sunucuya bağlanmak için kullanılacak anahtar dosya
* `AddKeysToAgent` tekrardan bağlantılar için anahtarı saklar
* `ForwardAgent` lokal **agent** bilgilerini uzan sunucuya aktarır

  * **Git SSH auth** varsa eğer lokalde, karşı sunucuya da bu aktarılır

  [What is SSH Agent Forwarding and How Do You Use It?](https://www.howtogeek.com/devops/what-is-ssh-agent-forwarding-and-how-do-you-use-it/)

> `ssh my.host` komutu ile aslında `ssh -A username@123.123.32.231 -i .ssh/rsa.pem` kodunu yazmış oluruz

## 🔑 SSH key oluşturup sunucuya yüklemek

```bash
#!/usr/bin/env zsh

ADDRESS="yia@raspberrypi.local"
KEY_ID="raspi"

# SSH key oluşturma
KEY_PATH="$HOME/.ssh/${KEY_ID}_ecdsa"  # veya _rsa
ssh-keygen -t ecdsa -b 521 -f ${KEY_PATH}

# SSH keyi sunucuya kopyalama ve yetkilendirme
ssh-copy-id -i $KEY_PATH.pub $ADDRESS
# cat $KEY_PATH.pub | $ADDRESS "mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys"

# SSH keyi yerel anahtarlara ekleme (eğer şifre istenirse anahtar eklenmeli)
ssh-add $KEY_PATH

# SSH ile adrese bağlanma
ssh $ADDRESS -A

# Apple keychain üzerine ekleme
# chmod 400 $KEY_PATH
ssh-add --apple-use-keychain $KEY_PATH  # Sadece passphrase için çalışır
```

[How can I permanently add my SSH private key to Keychain so it is automatically available to ssh?](https://apple.stackexchange.com/a/250572)

## ⬇️ Sunucu üzerinden hızlıca dosya indirme

```bash
REMOTE="username@ip.adress"
SOURCE="path"
DESTINATION="path"

scp -r $REMOTE:$SOURCE $DESTINATION
rsync -avzrt --progress "$REMOTE:$SOURCE" "$DESTINATION" 
```

## 🔄 `rsync` kullanarak dosya aktarımı

## ❌ Bazı Dosyaları Hariç Tutma

* **`rsync`** kullanarak hariç tutulacak dosya desenlerini belirtmek için aşağıdaki örnekleri kullanabilirsiniz:
  * **`.log`**: .log uzantılı tüm dosyaları hariç tutar.
  * **`.png`**: .png uzantılı tüm dosyaları hariç tutar.
  * **`/dirname/`**: dirname dizinini hariç tutar.
  * **`/dirname/*`**: dirname dizinindeki tüm dosyaları hariç tutar.
  * **`/dirname/file.txt`**: dirname dizinindeki file.txt dosyasını hariç tutar.
* **`rsync`** için birden fazla desen belirtebilirsiniz **`--exclude`** seçeneği ile, örneğin:

  * Bu `.pyc` ve `.log` uzantılı tüm dosyaları, ayrıca /tmp/ dizinini hariç tutacaktır.

  ```bash
  rsync -av --exclude=*.pyc --exclude=*.log --exclude=/tmp/ . /path/to/destination
  ```
* Ayrıca, **`--exclude-from`** seçeneğiyle hariç tutulacak dosyaları içeren bir dosya belirtebilirsiniz

  * `exclude-list.txt` dosyasında listelenen desenlerle eşleşen tüm dosyaları hariç tutacaktır.
  * Dosya, her satıra bir `pattern` içermelidir

  ```bash
  rsync -av --exclude-from=exclude-list.txt . /path/to/destination
  ```

## 💡 Örnek Kullanım

* Bu komut `exclude-list.txt` dosyasında listelenen dosyaları ve dizinleri hariç tutacaktır
* **`a`** seçeneği arşivleme modunu etkinleştirir, yani dosya meta verilerini (öznitelikleri, izinleri, vb.) korur.
* **`v`** seçeneği etkinleştirilirse, rsync'in ne yaptığını gösterir.
* **`z`** seçeneği etkinleştirilirse, dosyaları sıkıştırır ve yükleme sırasında çıkarır.
* **`e ssh`** seçeneği rsync'in SSH ile nasıl bağlantı kuracağını belirtir.
* `E`, ile dosya içerisindeki `Icon` gibi bilgiler de aktarılır
* `r`, ile alt dizinlerde de ilerler
* `t`, dosyanın son değişiklik bilgisini korur

```bash
rsync -avz --exclude-from=exclude-list.txt -e ssh /local/path/ user@remote-server:/path/to/destination
```

```bash
*.log
/tmp/
```

## 📚 References

* [ChatGPT 💁‍♂️](https://chat.openai.com/chat)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.yemreak.com/arsiv/yazilarim/ssh-ve-rsync-kullanimi-.ssh-config-dosyasi-anahtar-olusturma-ve-dosya-aktarimi.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
