# SSH — Secure Shell

`ssh` permet connectar-se de forma segura a màquines remotes xifrant tota la comunicació.

## 1. Sintaxi bàsica

```bash
ssh usuari@host
ssh usuari@host -p 2222          # port diferent
ssh host                         # usa l'usuari local actual
```



## 2. Opcions principals d'ssh

| Opció | Efecte |
|---|---|
| `-p PORT` | Port de connexió (per defecte: 22) |
| `-i fitxer` | Clau privada a usar |
| `-l usuari` | Usuari (alternatiu a usuari@host) |
| `-X` | Reenviament X11 (executa apps gràfiques remotes) |
| `-Y` | Reenviament X11 de confiança (menys restriccions) |
| `-A` | Reenviament de l'agent SSH (útil per saltar màquines) |
| `-N` | No executa cap ordre (útil per túnels) |
| `-f` | Va a segon pla abans de l'execució |
| `-v` | Mode verbose (diagnòstic); -vv o -vvv per més detall |
| `-q` | Mode silenciós |
| `-C` | Comprimeix les dades transmeses |
| `-T` | Desactiva la pseudo-terminal (útil per scripts) |
| `-t` | Força la pseudo-terminal (útil per sudo remot) |
| `-o opció=valor` | Passa opcions de configuració directament |



## 3. Execució d'ordres remotes

```bash
ssh usuari@host "ls /var/log"
ssh usuari@host "df -h"
ssh usuari@host "sudo systemctl restart apache2"

# Execució d'script local en màquina remota
ssh usuari@host 'bash -s' < script_local.sh

# Múltiples ordres
ssh usuari@host "git pull && systemctl restart apache2"
```



## 4. Túnels SSH

### Túnel local (accés a servei remot en port local)
```bash
# Ara http://localhost:8080 accedeix al port 80 del servidor remot
ssh -L 8080:localhost:80 usuari@host
```

### Túnel remot (exposa un port local al servidor)
```bash
# El port 9090 del servidor apunta al port 3000 de la teva màquina
ssh -R 9090:localhost:3000 usuari@host
```

### Túnel dinàmic (proxy SOCKS)
```bash
# Configura el navegador per usar SOCKS5 en localhost:1080
ssh -D 1080 -N usuari@host
```

### Salt entre màquines (ProxyJump)
```bash
# Connecta a 'destinacio' passant per la màquina 'bastio'
ssh -J usuari@bastio usuari@destinacio
```

## 5. Autenticació amb claus

```bash
# Generar parell de claus
ssh-keygen -t ed25519 -C "comentari"
ssh-keygen -t rsa -b 4096

# Copiar la clau pública al servidor
ssh-copy-id usuari@host
ssh-copy-id -i ~/.ssh/id_ed25519.pub usuari@host

# Equivalent manual
cat ~/.ssh/id_ed25519.pub | ssh usuari@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
```

## 6. Fitxer de configuració ~/.ssh/config

Evita haver d'escriure opcions llargues cada vegada:

```nano
Host servidor
    HostName 192.168.1.100
    User admin
    Port 2222
    IdentityFile ~/.ssh/clau_privada
    ForwardAgent yes

Host bastio
    HostName bastio.exemple.com
    User deploy

Host intern
    HostName 10.0.0.5
    User root
    ProxyJump bastio
```

Després n'hi ha prou amb:
```bash
ssh servidor
ssh intern     # salta automàticament per 'bastio'
```

## 7. SCP — Secure Copy

`scp` copia fitxers entre màquines usant SSH com a transport. La sintaxi és similar a `cp`.

```bash
scp [opcions] origen destinació
```

### 7.1 Exemples bàsics

```bash
# Local → Remot
scp fitxer.txt usuari@host:/ruta/destí/
scp fitxer.txt usuari@host:~

# Remot → Local
scp usuari@host:/ruta/fitxer.txt .
scp usuari@host:~/documents/informe.pdf /home/local/

# Remot → Remot
scp usuari1@host1:/fitxer usuari2@host2:/destí/
```

### 7.2 Opcions d'scp

| Opció | Efecte |
|---|---|
| `-r` | Còpia recursiva de directoris |
| `-P PORT` | Port (majúscula, diferent de ssh) |
| `-i fitxer` | Clau privada |
| `-p` | Preserva permisos i marques de temps |
| `-C` | Comprimeix durant la transferència |
| `-q` | Mode silenciós (sense barra de progrés) |
| `-v` | Mode verbose |
| `-l KBITS` | Limita l'amplada de banda (en Kbits/s) |
| `-o opció` | Passa opcions SSH |

### 7.3 Exemples avançats

```bash
# Còpia recursiva
scp -r directori/ usuari@host:/destí/

# Port alternatiu
scp -P 2222 fitxer.txt usuari@host:/tmp/

# Preservant permisos
scp -p fitxer.sh usuari@host:~/scripts/

# Usant configuració de ~/.ssh/config
scp fitxer.txt servidor:/tmp/

# Limitant amplada de banda (útil per no saturar la xarxa)
scp -l 1000 fitxer.iso usuari@host:/backup/
```

## 8. Alternativa moderna: `rsync` sobre SSH

Per transferències grans o sincronització, `rsync` és sovint millor que `scp`:

```bash
rsync -avz fitxer.txt usuari@host:/destí/
rsync -avz --progress directori/ usuari@host:/destí/

# sincronitza (esborra el que no hi és)
rsync -avz --delete origen/ usuari@host:/destí/   
rsync -avz -e "ssh -p 2222" fitxer usuari@host:/destí/
```

| Opció rsync | Efecte |
|---|---|
| `-a` | Mode arxiu (recursiu + ho preserva tot) |
| `-v` | Verbose |
| `-z` | Compressió |
| `--progress` | Mostra progrés |
| `--delete` | Esborra al destí el que no és a l'origen |
| `--exclude` | Exclou patrons |
| `-n` | Simulació (dry-run, no fa res) |

Més informació sobre [rsync i grsync](https://proferamon.com/tic/rsync.html)

#### Versions d'aquest document

+ HTML - [ssh.html](https://proferamon.com/tic/ssh.html)
+ PDF - [ssh.pdf](https://proferamon.com/tic/docs/ssh.pdf)
+ ODT - [ssh.odt](https://proferamon.com/tic/odt/ssh.odt)
+ MD - [ssh.md](https://proferamon.com/tic/md/ssh.md)

[Domini Públic (CC0)](https://creativecommons.org/publicdomain/zero/1.0/deed.ca)

