notes/ssh.md

221 lines
7.6 KiB
Markdown
Raw Normal View History

2024-04-03 09:14:24 +03:00
# SSH
- [SSH](#ssh)
- [Подключение](#подключение)
- [SSH аутентификация по ключам](#ssh-аутентификация-по-ключам)
- [Для дополнительной безопасности можно отключить доступ по паролю](#для-дополнительной-безопасности-можно-отключить-доступ-по-паролю)
- [Подключение через промежуточный хост](#подключение-через-промежуточный-хост)
- [SCP](#scp)
- [Не стандартный порт](#не-стандартный-порт)
- [ssh\_config](#ssh_config)
2024-04-03 10:01:52 +03:00
- [Общие параметры](#общие-параметры)
- [Пример конфигурации](#пример-конфигурации)
2024-04-03 09:14:24 +03:00
## Подключение
2022-05-07 22:12:11 +03:00
```bash
ssh admin@192.168.5.3
```
2024-04-03 09:14:24 +03:00
2022-05-07 22:12:11 +03:00
если имя пользователя не указывать, соединение произойдет от имени локального пользователя
2024-04-03 09:14:24 +03:00
2022-05-07 22:12:11 +03:00
```bash
ssh 192.168.5.3
```
2024-04-03 09:14:24 +03:00
2022-05-07 22:12:11 +03:00
не стандартный порт при подключении
2024-04-03 09:14:24 +03:00
2022-05-07 22:12:11 +03:00
```bash
ssh pi@da2001.ru -p 227
```
2024-04-03 09:14:24 +03:00
2022-05-07 22:12:11 +03:00
не добавлять публичный ключ удаленного хоста в локальный файл _**known_hosts**_, при этом будет запрошено подтверждение подключения
2024-04-03 09:14:24 +03:00
2022-05-07 22:12:11 +03:00
```bash
ssh -o UserKnownHostsFile=/dev/null admin@192.168.1.2
```
2024-04-03 09:14:24 +03:00
2022-05-07 22:12:11 +03:00
не проверять публичный ключ удаленного хоста
2024-04-03 09:14:24 +03:00
2022-05-07 22:12:11 +03:00
```bash
ssh -o StrictHostKeyChecking=no admin@192.168.1.2
```
2024-04-03 09:14:24 +03:00
2022-05-07 22:12:11 +03:00
не добавлять публичный ключ и не проверять удаленный хост
2024-04-03 09:14:24 +03:00
2022-05-07 22:12:11 +03:00
```bash
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.1.2
```
2024-04-03 09:14:24 +03:00
2022-05-07 22:12:11 +03:00
выполнить команду на сервере без подключения
2024-04-03 09:14:24 +03:00
2022-05-07 22:12:11 +03:00
```bash
ssh user@host ls
```
2024-04-03 09:14:24 +03:00
2022-05-07 22:12:11 +03:00
выполнить локальный скрипт
2024-04-03 09:14:24 +03:00
2022-05-07 22:12:11 +03:00
```bash
ssh da2001@192.168.1.2 'python3' < test.py
2024-04-03 09:14:24 +03:00
```
[вверх](#ssh)
2022-05-07 22:12:11 +03:00
2024-04-03 09:14:24 +03:00
### SSH аутентификация по ключам
2022-05-07 22:12:11 +03:00
2024-04-03 09:14:24 +03:00
На локальном хосте linux сгенерировать пару ключей
2022-05-07 22:12:11 +03:00
```bash
ssh-keygen
2024-04-03 09:14:24 +03:00
```
2022-05-07 22:12:11 +03:00
парольную фразу можно оставить пустой, чтобы не вводить пароль каждый раз при обращении к ключу
2024-04-03 09:14:24 +03:00
о умолчанию ключи будут храниться в каталоге `~/.ssh` в домашнем каталоге текущего пользователя. Закрытый ключ будет называться `id_rsa`, а связанный с ним открытый ключ `id_rsa.pub`_
2022-05-07 22:12:11 +03:00
Теперь необходимо скопировать публичный ключ на сервер, доступ к которому настраиваем
2024-04-03 09:14:24 +03:00
```bash
ssh-copy-id login@example.com
```
или
2022-05-07 22:12:11 +03:00
```bash
cat ~/.ssh/id_rsa.pub | ssh login@example.com "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
2024-04-03 09:14:24 +03:00
```
[вверх](#ssh)
### Для дополнительной безопасности можно отключить доступ по паролю
2022-05-07 22:12:11 +03:00
```bash
sudo nano /etc/ssh/sshd_config
2024-04-03 09:14:24 +03:00
```
2022-05-07 22:12:11 +03:00
`PasswordAuthentication no`
2024-04-03 09:14:24 +03:00
Перезагрузить сервис
2022-05-07 22:12:11 +03:00
```bash
sudo systemctl restart ssh
2024-04-03 09:14:24 +03:00
```
[вверх](#ssh)
2022-05-07 22:12:11 +03:00
2024-04-03 09:14:24 +03:00
### Подключение через промежуточный хост
если нужно подключиться по ssh на host2, при этом прямого подключения нет, но есть возможность подключиться через host1, можно такое подключение выполнить одной командой
```bash
2022-05-07 22:12:11 +03:00
ssh -J user1@host1:22 user2@host2
2024-04-03 09:14:24 +03:00
```
2022-05-07 22:12:11 +03:00
но в таком случае придется вводить пароль от host1 и от host2. Чтобы этого избежать можно добавить на хосты публичный ключ клиента
2024-04-03 09:14:24 +03:00
если добавить к подключению опции:
```bash
2022-05-07 22:12:11 +03:00
-o UserKnownHostsFile=/dev/null
-o StrictHostKeyChecking=no
2024-04-03 09:14:24 +03:00
```
2022-05-07 22:12:11 +03:00
удаленный сервер не будет проверять и не будет добавлять хеш удаленного хоста в файл _**known_hosts**_
2024-04-03 09:14:24 +03:00
это может быть полезно на тестовых стендах, когда узлы часто меняются и хеш изменяется.
Таким образом, полная команда может выглядеть так:
```bash
2022-05-07 22:12:11 +03:00
ssh -J pi@da2001.ru:227 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.5.3
2024-04-03 09:14:24 +03:00
```
[вверх](#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
2024-04-03 10:01:52 +03:00
Документация - `man 5 ssh_config`
Перевод 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
```
- отступы не обязательны, просто для удобочитаемости
2024-04-03 10:03:12 +03:00
[вверх](#ssh)