# SSH

- [SSH](#ssh)
  - [Подключение](#подключение)
    - [SSH аутентификация по ключам](#ssh-аутентификация-по-ключам)
    - [Для дополнительной безопасности можно отключить доступ по паролю](#для-дополнительной-безопасности-можно-отключить-доступ-по-паролю)
    - [Подключение через промежуточный хост](#подключение-через-промежуточный-хост)
  - [SCP](#scp)
    - [Не стандартный порт](#не-стандартный-порт)
  - [ssh\_config](#ssh_config)
    - [Общие параметры](#общие-параметры)
    - [Пример конфигурации](#пример-конфигурации)
  - [Проброс SSH ключа](#проброс-ssh-ключа)

## Подключение  

```bash  
ssh admin@192.168.5.3  
```  

если имя пользователя не указывать, соединение произойдет от имени локального пользователя  

```bash  
ssh 192.168.5.3  
```  

не стандартный порт при подключении  

```bash  
ssh pi@da2001.ru -p 227  
```  

не добавлять публичный ключ удаленного хоста в локальный файл _**known_hosts**_, при этом будет запрошено подтверждение подключения  

```bash  
ssh -o UserKnownHostsFile=/dev/null admin@192.168.1.2  
```  

не проверять публичный ключ удаленного хоста  

```bash  
ssh -o StrictHostKeyChecking=no admin@192.168.1.2  
```  

не добавлять публичный ключ и не проверять удаленный хост  

```bash  
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.1.2  
```  

выполнить команду на сервере без подключения  

```bash  
ssh user@host ls  
```  

выполнить локальный скрипт  

```bash  
ssh da2001@192.168.1.2 'python3' < test.py  
```

[вверх](#ssh)
  
### SSH аутентификация по ключам  
  
На локальном хосте linux сгенерировать пару ключей
  
```bash  
ssh-keygen  
```

парольную фразу можно оставить пустой, чтобы не вводить пароль каждый раз при обращении к ключу  
_По умолчанию ключи будут храниться в каталоге `~/.ssh` в домашнем каталоге текущего пользователя. Закрытый ключ будет называться `id_rsa`, а связанный с ним открытый ключ – `id_rsa.pub`_  
  
Теперь необходимо скопировать публичный ключ на сервер, доступ к которому настраиваем  

```bash
ssh-copy-id login@example.com
```

или

```bash  
cat ~/.ssh/id_rsa.pub | ssh login@example.com "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"  
```

[вверх](#ssh)

### Для дополнительной безопасности можно отключить доступ по паролю

```bash  
sudo nano /etc/ssh/sshd_config  
```

`PasswordAuthentication no`  

Перезагрузить сервис

```bash  
sudo systemctl restart ssh  
```

[вверх](#ssh)
  
### Подключение через промежуточный хост

если нужно подключиться по ssh на host2, при этом прямого подключения нет, но есть возможность подключиться через host1, можно такое подключение выполнить одной командой

```bash
ssh -J user1@host1:22 user2@host2  
```

но в таком случае придется вводить пароль от host1 и от host2. Чтобы этого избежать можно добавить на хосты публичный ключ клиента  
  
если добавить к подключению опции:

```bash
-o UserKnownHostsFile=/dev/null  
-o StrictHostKeyChecking=no  
```

удаленный сервер не будет проверять и не будет добавлять хеш удаленного хоста в файл _**known_hosts**_  
  
это может быть полезно на тестовых стендах, когда узлы часто меняются и хеш изменяется.  
Таким образом, полная команда может выглядеть так:

```bash
ssh -J pi@da2001.ru:227 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.5.3  
```

[вверх](#ssh)

## SCP

```bash  
scp ./wlt.py pi@da2001.ru:/home/pi  
```  

### Не стандартный порт  

```bash  
scp -P 227 ./wlt.py pi@da2001.ru:/home/pi  
```

[вверх](#ssh)

## ssh_config

Документация - `man 5 ssh_config`</br>
Перевод man - <https://www.opennet.ru/man.shtml?topic=ssh_config&category=5&russian=0>

Конфигурационный файл клиента распологается в домашнем каталоге пользователя - `~/.ssh/config`

Для изменения значений клиента по-умолчанию, можно задать свои значения. Также можно задать шаблоны для подключения к определённым хостам с указанием отличных значений для каждого подключения или группы подключений.

В общем виде подобная настройка может выглядеть подобным образом:

```bash
Host firsthost
SSH_OPTION_1 custom_value
SSH_OPTION_2 custom_value
SSH_OPTION_3 custom_value

Host secondhost
ANOTHER_OPTION custom_value

Host 192.168.13.24
ANOTHER_OPTION custom_value

Host 192.168.13.*
ANOTHER_OPTION custom_value

Host *host
ANOTHER_OPTION custom_value

Host *
CHANGE_DEFAULT custom_value
```

Стоит иметь ввиду - анализ файла осуществляется сверху вниз до соответствия параметрам. Таким образом, если вверху будет указана директива `Host *`, для всех хостов будут применены значения определённые для этой директивы и анализ файла будет остановлен, т.к. `*` подходит для любого хоста.

### Общие параметры

Параметры определяются в порядке ключ-значение, при этом нет чёткого требования для разделения между ключом и значением, одинаково будут распознаны подобные определения:

```bash
Port 4567
Port=4567
Port = 4567
```

### Пример конфигурации

```bash
Host home
  User da2001
  VisualHostKey yes
  PasswordAuthentication no
  IdentityFile ~/.ssh/personal_id_rsa

Host test*
  User testuser
  StrictHostKeyChecking no
  UserKnownHostsFile /dev/null
  LogLevel QUIET

Host srv1 srv2 srv3
  User jorn

Host *
User anotheruaser
StrictHostKeyChecking ask
UserKnownHostsFile ~/.ssh/known_hosts
LogLevel INFO
ServerAliveInterval 120
```

- отступы не обязательны, просто для удобочитаемости

[вверх](#ssh)

## Проброс SSH ключа

1. Создать `~/.ssh/config`
2. Заполните ее (адрес хоста - это адрес хоста, на который вы хотите разрешить пересылку cred'ов):

```shell
Host jumphost.local
     ForwardAgent yes
```

3. Если вы еще не запустили ssh-agent, запустите его:

```shell
ssh-agent
```

4. Возьмите выходные данные этой команды и вставьте их в терминал. Это настроит переменные среды, которые необходимо установить для работы переадресации агента. При желании вы можете заменить это и шаг 3 на:

```shell
eval "$(ssh-agent)"
```

5. Добавьте ключ, который вы хотите переслать ssh-агенту:

```shell
ssh-add [path to key if there is one]/[key_name]
```

6. Войдите на удаленный хост:

```shell
ssh -A [user]@[jumphost.local]
```

7. Отсюда, если вы войдете на другой хост, который принимает этот ключ, это просто сработает:

```shell
ssh [user]@[hostname]
```

[вверх](#ssh)
