Разве что ленивый не писал про ssh и несмотря на это, данный протокол и его возможности не перестают меня восхищать. Здесь я хочу поделиться исключительно своим опытом использования сего замечательного инструмента в своих задачах (При этом активно применяю его даже при разработке на Windows).

Поскольку я программист, то инструментарий ssh часто нужен мне в разработке и для личных нужд. Самые частые задачи, которые я выполняю с его помощью (по частоте использования):

  • Удалённый доступ — логично, ведь для этого он и предназначался.
  • Монтирование папок по сети — очень удобно для работы с кодом на удалённой машине.
  • Удалённое выполнение команд — нечастая, но используемая мной операция. Удобно получать выхлоп команды в канал другой команды на текущей машине.
  • Запуск графических приложений на удалённой машине.
  • Проксирование трафика — способ перенаправления трафика. Этакий быстрый и простой аналог VPN.
  • Обратный ssh — использую для проброса портов к системам, находящимися за NAT, когда лень настраивать firewall.

Далее вкратце разберу каждый пункт, и особенно пути эффективного и простого использования под Windows.

Конфигурирование рабочей машины


Забавно, что в различных примерах использования ssh, этот важнейший момент обходят стороной, хотя, как по мне — он ключевой. Приведу вполне живой пример, того, как я делаю первичную настройку сервера под себя.

После того как я выбрал и заказал себе сервер VPS, у меня в панели создания сервера появляется логин и пароль, и как это не удивительно — логин root.


Результат создания сервера

Первое, что нужно сделать прямо сразу после создания сервера: отключить логин по руту, настроить фаервол и проковырять в нём дырочку для корректной работы ssh. В идеале отключить логин по паролю и оставить только логин по ключу.

Когда-то я уже делал хороший гайд в наш Справочник о первичной настройке Ubuntu 18.04. Вся информация актуальна и применима к Ubuntu 20.04. Подробно расписывать, что я делаю — не буду, но дам небольшие пояснения.

ssh remotehost #заранее прописал ip сервера в /etc/hosts
adduser dlinyj #добавляем нового пользователя
usermod -aG sudo dlinyj #добавляем пользователя в группу sudo

Обращаю внимание, что я создаю пользователя такого же, как и на локальной машине, и поэтому — далее по тексту его не указываю. Если у вас пользователь отличается от того, что на сервере, то логиниться нужно через user@remotehost.

Далее необходимо отключить логин пользователя root. Это очень важно, потому что, в конце концов, методом перебора сервер рано или поздно будет взломан.

nano /etc/ssh/sshd_config

Находим строчку, содержащую PermitRootLogin, и меняем её на состояние no.

PermitRootLogin no

После этого перезапускаем ssh-сервис.

service sshd reload

Обязательно рекомендую проверить, что вы больше не можете зайти под рутом с тем же паролем, и эти изменения успешно применились.

После чего проверяю успешность подключения от своего аккаунта dlinyj, и затем копирую ключи. Логин по ключам имеет две цели: не вводить пароль каждый раз вручную, и просто отключить логин по паролю. Ключи перебрать значительно сложнее, чем пароль по словарям. Главное — не забыть сгенерировать пару ключей командой ssh-keygen. Можно сделать сложные ключи, а можно более простые. Тут уж дело вкуса, а я особо не заморачиваюсь и просто запускаю данную команду.

ssh-keygen

После успешной генерации пары ключей: публичного и приватного, копируем публичный ключ с помощью следующей команды:

ssh-copy-id remotehost

Проверяем логин. Введя ssh remotehost — мы должны сразу зайти на удалённый сервер с текущим логином.

После чего можно и вовсе отключить логин по паролю. Если вы единолично используете сервер, то это лучший вариант. Меня пугает ситуация, что если я потеряю приватный ключ, то попасть на сервер будет проблематично, но не сказать об этом нельзя.

Снова редактируем файл:

sudo nano /etc/ssh/sshd_config

Находим строку PasswordAuthentication, раскомментируем её и ставим no. Всё, перезапускаем ssh сервис командой sudo service sshd reload и наслаждаемся жизнью. Также настоятельно рекомендую настроить фаервол, согласно мануалу.

В заключении главы хочу порекомендовать внимательно посмотреть на все возможные настройки sshd, которые кроются в конфигурационном файле. Можно ограничить время сессии, количество подключений и многое другое.

Мои основные применения ssh


Итак, пробегусь по основным применениям ssh, кроме банального удалённого доступа.

▍ Удалённое выполнение команд


Простейший пример — это выполнить и записать команду сразу после адреса удалённого хоста.

Например:

ssh remotehost cat /etc/passwd | grep dlinyj

Вернётся следующая строка:

dlinyj:x:1000:1000:,,,:/home/dlinyj:/bin/bash

Обратите внимание, что grep выполнился уже на стороне машины, с которой мы делали запрос. Это можно увидеть, если добавить вывод, например, ip-адреса:

ssh remotehost cat /etc/passwd | grep dlinyj;ip a
dlinyj:x:1000:1000:,,,:/home/dlinyj:/bin/bash
...
2: enp6s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:**:**:**:**:** brd ff:ff:ff:ff:ff:ff
    inet 192.168.**.**/24 brd 192.168.**.** scope global dynamic noprefixroute enp6s0
       valid_lft 378sec preferred_lft 378sec
...

Если мы хотим, чтобы цепочка команд была выполнена на стороне хоста, то следует брать команды в кавычки.

ssh remotehost "cat /etc/passwd | grep dlinyj;ip a"
dlinyj:x:1000:1000:,,,:/home/dlinyj:/bin/bash
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:**:**:**:**:** brd ff:ff:ff:ff:ff:ff
    inet ***.***.***.***/** scope global eth0
       valid_lft forever preferred_lft forever

При этом бывает удобно использовать как первый, так и второй вариант. При первом варианте удобно получать выхлоп в свои скрипты, а при втором — делать что-то большое на удалённом сервере.

▍ Копирование файлов «на» и «с» удалённого хоста


В линуксе достаточно банальная операция копирования по протоколу scp, которая осуществляется с помощью команды scp. Данная программа используется точно так же, как и команда cp, с той особенностью, что надо указывать адрес удалённого сервера. Пример использования:

$ touch testfile
$ scp testfile remotehost:~/
testfile                      100%    0     0.0KB/s   00:00    
$ ssh remotehost ls testfile
testfile

Здесь я создал файл, затем скопировал его на удалённый хост (в домашнюю папку), и после, проверил его существование. Аналогично можно копировать и в обратном направлении.

▍ Монтирование удалённых папок


Для меня это является чуть ли не самой часто используемой функцией. Даже научился через тернии использовать её в Windows. Монтирование папок с удалённого хоста чаще всего использую для разработки на удалённом сервере, особенно если он какой-то отличный от x86 архитектуры. Да, Visual Studio Code умеет работать по ssh, но мне этот функционал не понравился. Плюс, не на каждый удалённый хост можно поставить дополнительные пакеты, чтобы работало всё гладко и там был поиск по файлам внутри студии. Когда программа большая (например, исходники Android) — поиск по файлам бывает очень нужен.

Очень удобно работать с удалённой папкой локально, будто бы она находится здесь и сейчас. Единственное, чего мне не хватает в этом функционале — это корректная работа inotify для отслеживания изменений файлов на удалённой машине. С такими примонтированными папками можно творить потрясающие штуки. Например, я организовывал взаимодействие двух сервисов, данные которых обменивались через примонтированные по ssh каталоги. Единственное, что не удалось — отслеживать изменения файлов, выполненные удалённой машиной. Тут пришлось изобретать другие схемы синхронизации.

Для того чтобы монтировать удалённые папки, нужно установить приложение sshfs.

sudo apt install sshfs

Теперь можно сделать монтирование удалённой папки. Для этого нужно указать локальную точку монтирования и путь к удалённой папке. Например, смонтируем папку home удалённого сервера — в папку ~/home локальной машины:

mkdir ~/home
sshfs remotehost:/home/dlinyj/ ~/home

В том, что монтирование прошло успешно, можно убедиться командой mount:

mount
....
remotehost:/home/dlinyj/ on /home/dlinyj/home type fuse.sshfs (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)

Убедимся, что папка не пуста:

ls -la ~/home/
итого 40
drwxr-xr-x  1 dlinyj dlinyj 4096 июл 11 23:49 .
drwxr-xr-x 28 dlinyj dlinyj 4096 июл 12 00:01 ..
-rw-------  1 dlinyj dlinyj  983 июл 11 23:46 .bash_history
-rw-r--r--  1 dlinyj dlinyj  220 июл 10 21:40 .bash_logout
-rw-r--r--  1 dlinyj dlinyj 3771 июл 10 21:40 .bashrc
drwx------  1 dlinyj dlinyj 4096 июл 10 21:44 .cache
drwxrwxr-x  1 dlinyj dlinyj 4096 июл 10 22:39 .local
-rw-r--r--  1 dlinyj dlinyj  807 июл 10 21:40 .profile
drwx------  1 dlinyj dlinyj 4096 июл 10 23:25 .ssh
-rw-r--r--  1 dlinyj dlinyj    0 июл 10 21:41 .sudo_as_admin_successful
-rw-------  1 dlinyj dlinyj   57 июл 11 23:49 .Xauthority

Это самый крутой инструмент ssh, который приводит меня в полнейший восторг. Если бы можно было монтировать под Windows удалённые папки из Linux-машин, то было бы просто великолепно. Хотя и это тоже возможно сделать без особых проблем.

▍ Запуск удалённых графических приложений


Это называется X11 Forwarding, и для того чтобы продемонстрировать данный функционал, необходимо настроить ssh-демон. Снова на удалённом сервере редактируем файл sshd_config:

nano /etc/ssh/sshd_config

Находим там строку X11Forwarding, раскомментируем её и ставим значение yes:

X11Forwarding yes

И после — не забываем перезапустить сервис sshd.

service sshd reload

Чтобы показать работу «проброски окошек» — нужно на чистый сервер без «иксов», установить хоть какие-нибудь X-приложения. Для этого я выполнил:

sudo apt install x11-apps

Это легковесный пример графических приложений, который для своей установки не требует много места. Отключаемся от удалённого сервера комбинацией клавиш ctrl-d (deattach) и подключаемся уже с опцией -X:


Глазки удалённого сервера следят за вашей мышкой

Как видно, графические приложения удалённого сервера прекрасно взаимодействуют с мышью.
Но к сожалению — не всё так радужно. Конечно, можно весь оконный менеджер так запустить, и оно будет работать, но будет дико тормозить. Обычно подобный запуск я использую исключительно для того, чтобы посмотреть какие-то графики, картинки, или глянуть последнюю вкладку в браузере на удалённом сервере. Последний раз, когда пробовал пробрасывать окошко логического анализатора — пользоваться этим было практически невозможно. Для полноценной работы всё же лучше использовать RDP.

▍ Проксирование трафика


Не могу сказать, что часто использую данный функционал, но несколько раз он меня выручал. Он особенно полезен, если нужно пропустить трафик через удалённый сервер, а морочиться с настройкой нормального VPN нет времени или желания. Этакий туннель для бедных.

Если посмотреть все мануалы про то, как проксировать трафик, то там приводится просто команда ssh, но совершенно не рассказывается о том, как настроить демона. При этом команда выполнится, но фокуса не произойдёт. Поэтому начну с главного — как разрешить проксирование. Для этого снова редактируем наш многострадальный файл конфигурирования демона ssh.

Находим там следующую строку, раскомментируем её и приводим к виду:

AllowTcpForwarding yes



Сохраняем файл и перезапускаем демон. После этого можно создать канал прокси к нашему серверу следующей командой:

ssh -D 8888 remoteserver

Где 8888 — локальный порт для прокси. Всё, теперь с данным прокси можно настроить и браузер. Пример настройки для firefox:



С хромом — ещё проще. Достаточно запустить его из командной строки:

google-chrome --proxy-server="socks5://localhost:8888

Если теперь перейти на сайт myip.ru, то там будет отображаться адрес вашего сервера:


Тут адрес вашего сервера

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

▍ Обратный ssh


Эта опция прям редко-редко мной использовалась, но были случаи, когда реально выручала. Суть такова — ваш домашний компьютер, либо какое другое устройство под управлением *nix находится за NAT и у вас нет выделенного IP. Есть множество решений этой проблемы, но, как по мне, идеальным решением будет обратный ssh. Со мной многие не согласятся и будут даже правы, но для меня это простой и понятный путь. Не агитирую.

Создаётся ssh соединение, по которому с удалённого сервера можно будет подключиться к вашему домашнему ПК. Итак, с домашнего ПК необходимо выполнить следующую инструкцию:

ssh -R 5544:localhost:22 remotehost

Опция R говорит перенаправлять порт удалённого хоста на указанный порт локального компьютера. Выполняем её и у нас будет поднято ssh-соединение до удалённого сервера. Если теперь подключиться к удалённому серверу, например, с работы, то можно получить доступ к домашней машине следующей командой:

ssh localhost -p 5544

Вжух, и вы на своей домашней машине, вне зависимости от того, где она находится.

Особенность в том, что на домашнем компе надо держать активную сессию и плюс — данные не сжимаются. Поэтому немного модифицируем инструкцию, чтобы всё работало быстрее.

ssh -fCNR 5544:localhost:22 remotehost

  • -f выполняет команду ssh в фоновом режиме, однако, если закрыть окно терминала — сессия прервётся (используйте nohup),
  • -C сжатие данных,
  • -N не выполнять удалённые инструкции.

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

ssh -fCNL *: 1234: localhost: 8888 localhost 

  • -f Фон.
  • -C Сжатие.
  • -N Не выполнять инструкции.
  • -L Перенаправляет порт на локальной машине (клиенте) на указанный порт, указанной удалённой машины.

Всё. Проковыриваете дырку в фаерволе для порта 1234 и из внешнего мира можно подключиться к вашему домашнему компьютеру, просто подключившись к remotehost по порту 1234.

Из недостатков способа можно отметить то, что сессия рвётся по таймауту, и если вдруг произошло отключение (плохой интернет), то связи больше не будет. Но специально для нас придумали autossh. Параметры такие же, как и у ssh, только он восстанавливает соединение после разрыва. Подробнее можно прочитать тут.

А как же Windows?


Ох, ОС Windows — это моя личная боль, при использовании ssh. Всем хороша операционная система, но плохо совместима с linux. На одной работе локальные компьютеры были под Windows, а разработка велась на удалённом сервере под Linux. При этом установить linux локально запрещала политика компании, как и ставить какой-либо иной софт, кроме разрешённого скромного списка. И эта личная боль (и опыт), решение которой я хочу изложить в этой части статьи.

Из широко распространённых инструментов можно отметить консольный клиент putty, который я использую для удалённого администрирования и WinSCP — для копирования файлов. С программой копирования по протоколу SCP всё более-менее понятно — это обычный командер. Единственное, что мне в ней не нравится, что если сессия рвётся по таймауту, то приходится заново создавать подключение, а это долго и раздражает. Да и в целом — я не нахожу её особо удобной, поэтому следует рассказать об альтернативных путях.


Копирование прошивки на малину.

Вот putty не так прост, как кажется на первый взгляд. Для меня эта программа — эталон удобства, и порой даже думаю поставить её под linux, хотя это и оверкилл. Программа позволяет делать практически все операции, описанные выше, кроме монтирования папок и копирования файлов: проксирование, проброс иксов, обратный ssh. Расскажу то, чем пользуюсь я (кроме банального удалённого доступа) — это проброс X11 на локальную машину.

▍ Проброс X11 в Windows


Поскольку Windows не имеет собственного Windows X-сервера, его следует предварительно установить. Есть несколько программ для этого. В своих решениях я использую VcXsrv Windows X Server. После установки запускаем и не забываем установить номер дисплея равный нулю:



Далее всё по умолчанию, разве что стоит отключить opengl:



Щёлкаем далее и готово.

В putty необходимо разрешить перенаправление иксов. В сессии, которую вы создали и сохранили для вашего удалённого сервера необходимо пойти в настройки, и найти вкладку X11, и там включить X11-перенаправление. В моём случае это выглядит так:



Всё, теперь можно посмотреть на глазки, следящие за курсором, но уже в Windows.


Глазки следят за курсором в Windows.

▍ Когда хочется POSIX в Windows


Конечно, всё это хорошо, но когда привыкаешь к магии и простоте консольных команд копирования, удалённого выполнения и прочего, то в Windows всего этого не хватает. Поэтому я долго искал какие-то более-менее вменяемые альтернативы. Главное — отказаться от WinSCP. Простейшей, и вполне удобной альтернативой оказался Cygwin. По сути, это коллекция инструментов GNU, которые обеспечивают функциональность, аналогично дистрибутиву Linux для Windows. Пока нормально не допилили wsl (Windows Subsystem for Linux) — долгое время я пользовался им. В сути, всё то же самое, что я выше описал для Linux, разве что это обычные exe-файлы, и работают под Windows: ssh, scp, ssh-keygen, ssh-copy-id. Работает всё, кроме удалённого монтирования папок, как я не пытался разрешить эту проблему и как не искал пакеты — так и не понял, как это можно сделать.

Как по мне, это самое простое и быстрое решение, потому что разворачивать wsl немного сложнее, чем просто скачать и запустить инсталлятор Cygwin.

▍ Путь настоящего джедая — Windows Subsystem for Linux


Если исключить установку linux на виртуальную машину, и шаринг папок по сети, то один из немногих известных мне (вменяемых) способов монтирования папок по ssh — использование подсистемы линукс для виндоус. Можно посмотреть следующий мануал и ужаснуться того, как же сложно это делается.

Но на самом деле, на Windows 11 wsl уже совсем хорошо и просто работает, без особых танцев с бубном и перенаправлением видео на программу X Server. На Windows 10 я ставил Ubuntu из магазина приложений, потом запускал какую-то команду в PowerShell, чтобы активировать wsl и получал готовый linux.

Это решение хорошо тем, что оно мгновенно запускается. Консоль linux запускается также быстро, как PowerShell или cmd. Также оно имеет доступ ко всем данным на жёстких дисках из коробки. Единственный нюанс — нельзя по сети монтировать папки в папки, принадлежащие ОС Windows.

Поэтому я монтирую папки в wsl, и там уже запускаю Visual Studio Code, скармливаю ей локальную папку и работаю в ней. Студия ругается на то, что я запускаю её под wsl. Для работы X11 в Windows 10 (в Windows 11 починили), точно также как для удалённого сервера надо устанавливать программу VcXsrv. Для того чтобы окна корректно открывались, нужно в машине wsl прописать адрес удалённого сервера X Windows (можно её сразу добавить в .bashrc):

export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0

Понимаю, что это может показаться очень сложным, но я так привык к удобству удалённых папок, что один раз в этом разобраться — точно стоит того. На данный момент при работе не возникает никаких проблем, когда понимаешь: что, почему и зачем нужно.

Вот, для примера точно так же монтирую удалённую папку home в wsl, и затем открываю её в Visual Studio Code:


Монтирование удалённой папки и перенаправление дисплея

После чего можно успешно всё открыть в VS Code.


Успешно открытая Visual Studio Code с удалённой папкой

Заключение


Ssh — это основной инструмент системного разработчика, администратора и даже продвинутого пользователя. Очень классный, простой, а главное — эффективный инструмент, который может решать массу задач.

Для меня самой большой болью было подружить Windows и ssh. Дружба эта — плохая, как воды и масла, но всё же, мне удаётся достаточно комфортно работать по ssh и под операционной системой Windows.

Ссылки


  1. Прекрасная статья использования ssh в примерах. И её русский перевод на хабре. Единственное на что хочу обратить внимание, что там опущено то, как конфигурировать демона, и без корректной настройки на стороне сервера это работать не будет.
  2. Пример создания обратного ssh-тунеля, в картинках, как почему, зачем.
  3. Достаточно объёмный, и в той же мере бесполезный мануал по разворачиванию wsl. Но есть несколько полезных моментов, которые оттуда для себя почерпнул.

Комментарии (104)


  1. GenkaOk
    14.07.2022 12:16
    +6

    Для меня магия SSH была, когда я научился копировать файлы между серверами напрямую, с помощью scp

    scp -3 user@from-server:/home/user/backup.sql.gz user@to-server:/home/user/backup.sql.gz

    Конечно при этом не работает прогресс-бар, но он и не нужен, достаточно посматривать на конечном сервере размеры и количество файлов.

    А самое главное, что scp поддерживает конфиг из .ssh/config и не нужно дублировать параметры подключения к серверу


    1. 13werwolf13
      14.07.2022 13:00
      +2

      помнится я делал прогресбар для scp прогоняя пайп через pv.. если мне не приснилось то можете попробовать


      1. deseven
        14.07.2022 15:10

        С scp у меня не получилось, потому что оно не умеет читать stdin, но связка pv | ssh "cat" сработала. Для желающих попробовать можно взять код отсюда (строки 99-112).


        1. 13werwolf13
          14.07.2022 15:55

          Читать stdin не может, а вот писать в stdout вроде бы да.. Если честно не помню как реализовывал, может и через ssh cat..


    1. ALiEN175
      14.07.2022 21:05
      +4

      rsync жеж. Но он на двух сторонах должен быть установлен
      image
      Замылено, соответственно user@serverIP_or_name:Target


  1. alexesDev
    14.07.2022 12:49
    +6

    ssh -L удобно использовать для всяких webui из внутренней инфры. Конечно их можно вывести наружу, но это лишние риски. ssh -L 9090:localhost:9090 prometheushost и можно открыть prometheus из внутреней сетки без паролей, только по ключам.

    ssh -J должен быть знаком всем плюс минус серьезным админам. В окружение лучше прыгать через bastion ноды, которые редко где отсвечивают, а не напрямую. Понятно, что может быть VPN, но так вроде проще, чем постоянно прыгать по разным приватным сетям.


  1. 13werwolf13
    14.07.2022 12:59
    +2

    Запуск графических приложений на удалённой машине.

    но в теле статьи не НА а С..


  1. serial83
    14.07.2022 12:59
    +2

    Putty может копировать файлы - в составе есть отдельный консольный клиент pscp.exe


    1. dlinyj Автор
      14.07.2022 13:06
      +1

      Не знал, спасибо! Возьму на заметку.


      1. 13werwolf13
        14.07.2022 15:56
        +2

        Вот только в десятке из коробки есть родной scp и ssh


        1. AVX
          14.07.2022 20:42
          +2

          Но из коробки нет ssh-copy-id :(


          1. 13werwolf13
            14.07.2022 20:59
            +1

            Не велика потеря, или в виндовой консольке нет пайпов?

            Гораздо хуже как по мне то что виндовый ssh клиент не умеет в контролпасы из-за того что винда не умеет в юникс сокеты..


            1. andreymal
              15.07.2022 00:23
              +1

              винда не умеет в юникс сокеты..

              Умеет с 2017 года https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/


              1. 13werwolf13
                15.07.2022 05:16

                В адекватно радиусе от меня нет винды, так что проверять я не буду. Но насколько я помню в ssh контролпасы не работают там. Я думал что это из-за отсутствия юникс сокетов, но видимо причина другая.


  1. 13werwolf13
    14.07.2022 13:03
    +1

    Как видно, графические приложения удалённого сервера прекрасно взаимодействуют с мышью.
    Но к сожалению — не всё так радужно. Конечно, можно весь оконный менеджер так запустить, и оно будет работать, но будет дико тормозить.

    ну не дико, вполне приемлемо если в пределах одной локалки, ну а в пределах тырнетов тут много факторов одно время у меня так главбух из дома в 1С заходила пока vpn починяли, печально, но работать можно.
    а чтобы работало шустрее и поддерживало аппаратное ускорение есть vglconnect/vglrun, правда сам я не пробовал


    1. edo1h
      15.07.2022 01:02

      а чтобы работало шустрее и поддерживало аппаратное ускорение

      там дело не в ускорении, а в сетевых задержках. ну и в том, как современные тулкиты работают с иксами


      1. 13werwolf13
        15.07.2022 05:14
        -1

        КО


  1. 13werwolf13
    14.07.2022 13:06

     VcXsrv как-то очень сильно похож на XMING который я когда-то юзал для тех же целей
    а вот вместо Putty рекомендую попробовать Bitvise


    1. x2v0
      14.07.2022 13:28

      Пользую https://wiki.x2go.org/doku.php
      которая надстройка над VcXsrv


    1. utoplenick
      14.07.2022 14:25
      +4

      А еще есть MobaXterm, она со встроенным X сервером.


      1. DistortNeo
        14.07.2022 22:04
        +1

        Это какой-то адски перегруженный комбайн.


    1. dlinyj Автор
      14.07.2022 17:45

      VcXsrv is a open source project under GPLv3 license about building reliable X Server using Visual Studio in potentially optimal manner. It's common knowledge Microsoft Compilers are very good for Windows platform, since there are free variants it's tempting option. It was my first choice for X Server when I tried Windows Subsystem for Linux for the first time in Windows 10.

      Xming is a weird project which under term Donation hides a price for the installable binaries. I always though donations are voluntary, but it seems the author has different perception. This project was the only option to have X Server on Windows natively for very long time, but since we have VcXsrv, there is choice.

      I personally have very good experience with VcXsrc, it's easy to install and works very fast. I'm surprised it's not more popular. As far as I know their code is more clean version of original X server and doesn't relate to Cygwin.


      Отсюда.


      1. ppnn
        15.07.2022 16:38
        +1

        по личному опыту, xming имел странные глюки при синхронизации clipboard-а и с клавиатурными раскладками. Перенос клипборда просто переставал работать в рандомные моменты. Переход на VcXsrv это существенно облегчил.
        Хотя я это наблюдал во время Windows 7 и xming 6.x, возможно, сейчас в xming 7 это починили.


  1. Habetdin
    14.07.2022 13:07
    +7

    Немного странный порядок действий в статье — сначала отключить root-доступ с перезапуском ssh-демона, и только потом проверить "успешность подключения от своего аккаунта" — может быть стоит делать наоборот, ну или хотя бы отключать доступ руту, войдя для этого со своего аккаунта?

    Следует также упомянуть о том, что в некоторых случаях вместо PermitRootLogin no вполне безопасно можно использовать PermitRootLogin prohibit-password.


    1. dlinyj Автор
      14.07.2022 13:19
      +1

      Правда ваша. Как вы говорите делать, без сомнения, более правильно. В данном случае хотел сделать акцент, что надо проверять каждую настройку.


    1. deseven
      14.07.2022 15:05
      +5

      Кстати да, я последнее время не понимаю этой мантры "закройте рута по ssh", ведь вся проблема исходит только от паролей и возможности их перебора, отключите парольную авторизацию (ну и еще можно fail2ban сверху воткнуть) и проблема чаще всего решена.

      Другое дело, что это провоцирует работу от рута, но это уже совсем другая тема для обсуждения.


      1. dlinyj Автор
        14.07.2022 17:38

        В данном случае вообще считаю, что возможность логина по руту не нужна.

        Догадаться какой пользователь на сервере сильно сложнее, чем пытаться сбрутить рута. Хотя без сомнения и это тоже брутится.


        1. cepera_ang
          14.07.2022 22:02
          +1

          В 98% случаев это пользователь ubuntu :)


        1. edo1h
          15.07.2022 01:12
          +2

          ну догадались, и что дальше? пытаться сбрутить ключ, серьёзно?


          1. iig
            15.07.2022 11:19

            Ключ root брутить сильно проще?


          1. dlinyj Автор
            15.07.2022 11:41
            +1

            Если вы внимательно читали статью, то у пользователя я оставил обычный текстовый пароль. Хотя рекомендовал его отключить. И да, текстовый пароль можно сбрутить.


            1. edo1h
              15.07.2022 12:31
              +1

              Если вы внимательно читали эту ветку комментариев, то вам рекомендовали вместо отключения входа рута по ssh отключить парольную аутентификацию для рута:


              Следует также упомянуть о том, что в некоторых случаях вместо PermitRootLogin no вполне безопасно можно использовать PermitRootLogin prohibit-password.

              Впрочем, я обычно полностью отключаю парольную аутентификацию на ssh.


              1. dlinyj Автор
                15.07.2022 13:25

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


            1. iig
              15.07.2022 12:57
              +1

              текстовый пароль можно сбрутить

              geVUsge9cdj2cRG - то что генерирует парольный менеджер. Удачи ;)


              1. dlinyj Автор
                15.07.2022 13:28
                -1

                Брут идёт не мамкиными хацкерами, а просто в автоматическом режиме скриптами. Можно даже по логам вновь созданного сервера это увидеть.

                И в таком случае, даже при длинном текстовом пароле шанс брута далеко не нулевой.


                1. mayorovp
                  15.07.2022 15:27

                  Там 6615 ≈ 2 · 1027 вариантов, из которых надо перебрать до успеха в среднем половину, то есть 1027. Если делать 1000 попыток в секунду (чего никто не делает) — это займёт 6 · 1016 лет. Да блин, вселенная ещё столько не просуществовала!


                  И это в предположении что атакующий знает длину пароля. Удачи.


                  1. dlinyj Автор
                    15.07.2022 15:58
                    -1

                    В ваших расчётах ошибка.

                    1. Не учитывается что пароль может быть в словарях.
                    2. Не учитывается то, что пароль может быть скомпрометирован.
                    3. Не учитывается глупость создателя сервера.
                    4. Не учитывается в банальной математике, что пароль может быть перебран за меньшее количество итераций.

                    Поэтому, лучший вариант — это ключи, которые тоже могут быть скомпрометированы. Однако, если сюда добавить поиск пользователя, а не только рута, то время увеличивается на порядки.

                    И, то что вы не заметили, что ваш сервер взломан, ещё не говорит, о том что там никто не побывал ;).
                    И, спасибо, за удачу!


                    1. iig
                      15.07.2022 16:11
                      +2

                      пароль может быть в словарях.

                      Рандомый пароль очень вряд ли

                      пароль может быть скомпрометирован

                      Как и ключ

                      ЗЫ: ключи, конечно же, удобнее. management ключей проще и надежнееё


                      1. dlinyj Автор
                        15.07.2022 17:07
                        -2

                        Как и ключ :).

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


                      1. iig
                        16.07.2022 13:34
                        +2

                        ключ не всегда удобно с собой таскать

                        Точно так же, как и пароль вида geVUsge9cdj2cRG. Вы же его не запоминаете, правда? Наверное в файлик записываете, или в программу какую то?


                      1. dartraiden
                        16.07.2022 15:09

                        ключ не всегда удобно с собой таскать
                        Ключ кладётся в KeePass и ставится плагин KeeAgent.


                      1. Iv38
                        17.07.2022 03:17

                        Не знал, что так можно. Правда, переносимые ключи вроде как противоречат идеологии ключей, они в таком случае превращаются в очень длинный пароль просто. И на сервере уже нельзя отключить вход для конкретного клиента.


      1. edo1h
        15.07.2022 01:16
        +6

        Другое дело, что это провоцирует работу от рута, но это уже совсем другая тема для обсуждения.

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


        а вот на домашнем/рабочем компьютере я обычно сижу под обычным пользователем. хотя и тут рутовая консоль обычно открыта )


        1. dlinyj Автор
          15.07.2022 11:43

          Если это сборочный сервер (что чаще всего в моей практике), то рут не нужен от слова совсем. И ряд программистов его никогда в глаза не видело, если нужны какие-то изменения, пишется заявка в IT-отдел, и какой-нибудь костариканец его настроит.


          1. iig
            15.07.2022 12:58
            +2

            Администратору root как правило нужен. Программисту, как правило, нет.


        1. dartraiden
          16.07.2022 15:14

          не понимаю, как набор sudo перед каждой командой улучшит безопасность
          Когда на одной машине нужно набирать, а на другой нет, это не очень удобно, постоянно путаешься.


          1. edo1h
            16.07.2022 16:40
            +1

            sudo -i не поможет? )


  1. Iv38
    14.07.2022 13:55
    +4

    По поводу винды. В Windows 10 ведь уже есть встроенный ssh-клиент. Вместе с scp, и генератором ключей. И не надо устанавливать для этого никакой cygwin. Я почти перестал пользоваться putty из-за него.


    1. dlinyj Автор
      14.07.2022 13:56

      Как называется? Не знал просто.


      1. ZeroBot-Dot
        14.07.2022 14:09
        +5

        Вроде как OpenSSH client по умолчанию устанавливается. В Pro`шке точно.


        1. kterik
          15.07.2022 09:39

          Я лишь недавно попробовал добавить OpenSSH на машину с Windows 7 ради серверной функции и столкнулся с тем, что свежая версия OpenSSH перестала поддерживать SCP. Теперь вместо него работает протокол SFTP.

          Это не очень удобно мне, учитывая, что ряд администрируемых сетевых устройств, напротив, работают только с SCP вместо SFTP.


          1. dartraiden
            16.07.2022 15:15

            Usage of the SCP protocol can be restored using the newly added -O option.


            1. kterik
              16.07.2022 15:36
              +1

              Это я видел. Осталось понять, куда прописать эту опцию на коммутаторе, на который я желаю посредством SCP передать файл, находящийся на хосте с OpenSSH сервером.


              1. dartraiden
                16.07.2022 15:51

                Если разработчики задумали прописывать её на клиенте, то это не очень мудрое решение, т.к. для этого нужно иметь возможность как минимум поменять параметры на клиенте…

                In case of incompatibility, the scp(1) client may be instructed to use
                the legacy scp/rcp using the -O flag.

                Хотя, похоже, именно так они и поступили.


      1. Iv38
        14.07.2022 14:33
        +4

        Да, OpenSSH client. Если не установлен из коробки, то ставится через компоненты. Соответственно в виндовой консоли это просто ssh, scp и так далее.


        1. dlinyj Автор
          14.07.2022 17:39

          Век живи!


      1. farcaller
        14.07.2022 18:54
        +1


        Таки да, работает как обычно и клиет и сервер. Относительно легко прикручивается всякое вроде ключей из gpg / hw токенов даже.


    1. mayorovp
      14.07.2022 23:58
      +2

      putty удобен тем, что это оконное приложение, со всеми фичами вроде своего значка в панели задач, быстрого доступа к последним сохранённым сессиям через этот же значок; также немаловажно что plink не открывает пустого консольного окна (почему в OpenSSH sshw.exe не сделают?)


      1. Iv38
        15.07.2022 02:22
        +4

        Мне, честно говоря, очень не нравится интерфейс putty. Он какой-то програмистский в плохом смысле этого слова. Контринтуитивный, я часто ошибаюсь при работе с ним. Например, там параметры сессии собираешь по всему дереву слева, а потом надо не забыть вернуться в начало и сохранить сессию. Я тут часто прокалываюсь. Тот факт, что putty это не одна утилита, а целый набор, тоже не радует. Когда мне хочется работать с терминалом по-виндовому, я использую MobaXTerm. Вот это прям в стиле винды. Комбайн. С вкладками, файловым менеджером и ещё горой каких-то фич. Даже скринсейвер есть. Иногда мне удобнее с ним, иногда в голой консоли через OpenSSH, а putty осталась не у дел. (Хотя MobaXTerm сам использует putty).


        1. q2digger
          15.07.2022 09:24

          Я одно время сидел на майкрософтовском Terminal-е, табы, настройки богатые, вот это все подкупало сильно. А последнее время открыл для себя Tabby , вот это реально помогает, очень удобная штука. До любимого маковского iterm2 конечно все равно как до луны...


          1. Iv38
            15.07.2022 13:43
            +1

            Tabby выглядит прикольно, надо попробовать. Мне нравится фича, когда окно можно нарезать на отдельные терминальчики, как в линуксовом terminator.


  1. BubaVV
    14.07.2022 15:00
    +4

    1. Опция -А позволяет пробрасывать свой ключ по цепочке, если заходить в несколько вложенных сессий. Иногда бывает нужно

    2. Тулза sshuttle позволяет автоматически настраивать роутинг в подсеть через ноду, к которой есть доступ по ссш. Тоже нужна редко, но метко


    1. AlexGluck
      14.07.2022 23:27

      Вместо шатла я сделал шел скрипт .


  1. Akon32
    14.07.2022 15:21
    +2

    WinSCP на самом деле хорош. В него и из него можно перетаскивать мышью файлы из обычного проводника windows. Старый двухпанельный режим можно отключить, и тогда WinSCP выглядит похоже на стандартный проводник.


  1. ComodoHacker
    14.07.2022 15:29

    А почему вы запускаете VS Code из WSL, а не из Windows, хотя Microsoft рекомендует наоборот?


    1. dlinyj Автор
      14.07.2022 17:40

      А каким образом вы получите доступ к примонтированным папкам по sshfs?

      Правда ваша, есть возможность поставить приложение к VSC. Но как обычно, всё это больше тормозит, чем работает на целевой платформе.


      1. ComodoHacker
        14.07.2022 20:31

        А следующее в списке расширение не дает доступ к примонтированной папке?


        1. dlinyj Автор
          14.07.2022 20:41

          Даёт, поэтому и показал скрин. Тем не менее, без wsl никуда. Но иксы можно не пробрасывать.

          Спасибо за наводку.


  1. dmlogv
    14.07.2022 16:20
    +1

    И как теперь в закладках отличать от той самой «Магии SSH»?


  1. lmxrm
    14.07.2022 16:34

    Очень не хватает возможности пробрасывать последовательные порты ttySx, ttyUSBx, ttyACMx и т.д.


    1. dlinyj Автор
      14.07.2022 17:42
      +1

      А в чём сложности? Вы простите, я не издеваюсь, это точно такие же консоли, значит их можно пробросить.


      1. lmxrm
        15.07.2022 09:30
        +1

        эээ, а как?

        запустить удаленно screen, это пожалуйста

        а как сделать так чтобы на локальном компе открывался порты, доступ к которому пробрасывался к удаленному последовательному порту?


        1. dlinyj Автор
          15.07.2022 11:45
          +1

          Простейшим образом через pipe, но в целом надо помароковать. Но это реально.


          1. lmxrm
            15.07.2022 12:02
            +1

            1. dlinyj Автор
              15.07.2022 12:10
              +1

              Как вариант


        1. edo1h
          15.07.2022 12:34
          +1

    1. lmxrm
      15.07.2022 12:20
      +1

      1. dlinyj Автор
        15.07.2022 12:24

        Судя по всему, решение.


  1. ku4in
    14.07.2022 16:57
    +2

    Если хочется, чтобы можно было подключиться извне, то нужно на удалённом хосте тоже сделать перенаправление портов.

    Можно на сервере в настройках /etc/ssh/sshd_config указать GatewayPorts clientspecified. И тогда не сервере уже не надо будет ничего перенаправлять, а можно сразу делать ssh -fCNR 0.0.0.0:5544:localhost:22 remotehost. И ssh будет слушать на всех интерфейсах сервера.


    1. dlinyj Автор
      14.07.2022 17:43
      +1

      Ну вот, я же говорил, что RTFM всегда полезен. И я рад, что из комментариев узнаю много нового.


  1. El_corona
    14.07.2022 17:02
    +1

    пробросить порты можно через уже открытую сессию SSH с помощью так называемых control sequences. Чтобы попасть в меню надо нажать Enter, потом ~C - появится контекстная менюшка с выбором режима и настроек форварда


    1. Iv38
      14.07.2022 17:41

      Прикольно. А какие команды там можно использовать? Я не смог нагуглить, не знаю какие ключевые слова использовать.


      1. sukhe
        14.07.2022 21:45

        самая первая команда — help
        и Enter нажимать не обязательно — достаточно ~C


      1. El_corona
        15.07.2022 12:00
        +1

        По ssh konami code можно нагуглить, сам уже толком не помню какие были


  1. AVX
    14.07.2022 20:46
    +1

    Почему-то не упомянули про возможность подключиться с помощью Filezilla, указав соответствующую настройку. И можно просто и удобно перекидывать файлы туда-сюда. Конечно, ftp мало кто пользуется, и его объявили типа устаревшим, но это просто и удобно.


    1. Akon32
      14.07.2022 23:06
      +1

      WinSCP делает то же самое.

      ftp ещё и крайне медленный по сравнению, например, с rsync.


      1. dartraiden
        16.07.2022 15:21

        И подвержен MitM-атакам, если это FTP, а не FTPS. Собственно поэтому он и устаревший — в 2022 году уже каждая собака норовит влезть в нешифрованый трафик.


  1. mapnik
    14.07.2022 21:52
    +2

    ssh -X лучше запускать в виде ssh -C -X — вроде помогает.


    1. rkfg
      15.07.2022 10:25
      +2

      Это правда, и тут надо пояснить, что -C включает gzip-сжатие всего трафика (до шифрования). Опции можно и объединить для краткости в -CX.


  1. DistortNeo
    14.07.2022 22:10
    +2

    Для меня эта программа — эталон удобства, и порой даже думаю поставить её под linux, хотя это и оверкилл.

    У неё есть фатальный недостаток — нет ProxyJump.


    1. mayorovp
      15.07.2022 00:08

      Ну, ProxyJump — лишь сокращение для ProxyCommand, а ProxyCommand putty поддерживает (называется "Local proxy").


      1. AlexGluck
        15.07.2022 00:39

        Пробовали 5 Джампов прописать? Однажды требовалось, обычно 2-3 хватало. Консоль с ссш конфигом и дополнением через табуляции гораздо продуктивней, некоторым ncurses из zsh нравится ещё.


      1. DistortNeo
        15.07.2022 10:58

        Ага. До тех пор, пока вам порты пробросить не требуется.


  1. Igorgro
    15.07.2022 01:52
    +3

    А еще у ssh есть волшебная опция -w которая позволяет соединить локальный и удаленный tun-интерфейсы через ssh туннель и таким образом организовать полноценное vpn соединение.


  1. siroBS
    15.07.2022 09:47
    +1

    Использую 'SFTP Drive V3' для монтирования папки Linux как диска Windows. Прямо из VSCode работаю с исходниками (собираю, конечно, на Linux машине). Для абсолютно всех рабочих манипуляций с серверами юзаю либо WSL, либо Git Bash. Получается обходиться без Windows терминалов.


  1. Fstep87
    15.07.2022 09:48

    “Здесь я создал файл, затем скопировал его на удалённый хост (в домашнюю папку), и после, проверил его существование. Аналогично можно копировать и в обратном направлении.”

    Подскажите, как красиво скопировать файл с удаленной на свою машину, если я уже нахожусь в ssh сессии, без выхода из сессии. У моей машины нет белого IP.

    Поясню, иногда нужно скопировать конфиги, которые доступны только руту.Root доступа по ssh нет. Захожу под юзером, там делаю sudo а вот как файл себе утащить красиво не нашел решения.

    Пока коряво копирую во временную папку , cставлю более широкие праваи утаскиваю себе.


    1. rkfg
      15.07.2022 10:31
      +2

      Думаю, иначе никак, передача файлов и шелл (а также проброс портов и VPN) — это всё разные сессии внутри одного соединения, поэтому эскалация прав в шелле неприменима к передаче файлов. Разве что может сработать с кастомным клиентом и Esc-последовательностями, но это надо велосипедить. Например, в шелле выводим специальный код, распознаваемый клиентом (с указанием длины файла в нём), после чего прямо в шелл дампим содержимое файла. Клиент это всё в терминал не выводит, а показывает диалог выбора файла для сохранения, после чего вычитывает N байт, где N мы передали вместе с эскейп-кодом, сохраняет их в файл и возвращается в обычный режим работы с шеллом.


      1. mayorovp
        15.07.2022 10:58

        Интересно, а тут можно как-нибудь xclip использовать, совместно с ssh -X?


        1. rkfg
          15.07.2022 10:59

          Можно, я так делал. Не уверен, что это правильно сработает с sudo, возможно, надо будет использовать -E для сохранения переменных окружения.


  1. kolossradosskiy
    15.07.2022 10:19

    Если бы можно было монтировать под Windows удалённые папки из Linux-машин, то было бы просто великолепно. Хотя и это тоже возможно сделать без особых проблем.

    Логика сломалась.



  1. MShevchenko
    16.07.2022 01:55
    +1

    Под win 10 у меня хорошо работает https://github.com/evsar3/sshfs-win-manager инструкция там же.


  1. vvzvlad
    16.07.2022 17:07
    +1

    Далее необходимо отключить логин пользователя root. Это очень важно, потому что, в конце концов, методом перебора сервер рано или поздно будет взломан.

    Да чего же вы так все боитесь рута? Не понимаю, аргументы странные. Да, сидеть под рутом на боевом сервере, полным всякого софта и сервисов нехорошо, можно случайно что-нибудь сломать, но если это машина, на которой один раз в начале развертывается докер, и дальше все работа происходит с ним и машина создается исключительно для него — какой смысл в создании новых пользователей?
    А сложность взлома от логина не зависит, разве что рута пытаются перебрать чаще, чем ваше-уникальное-имя-пользователя. Но в чем проблема просто отключить пароли и перейти на авторизацию ключами тогда?


    1. edo1h
      16.07.2022 17:40
      +1

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

      то есть если на этом же хосте набрать sudo somebadcommand, будет лучше? )
      при активном использовании sudo глаз ровно так же замыливается, даже тут на хабре я видел статьи с «просто перед каждой командой пишем sudo» в духе
      sudo curl http://xxx | sudo bash


      Но в чем проблема просто отключить пароли и перейти на авторизацию ключами тогда?

      на самом деле и парольная авторизация достаточно надёжная, но только пока у вас контролируется сложность паролей.
      единственное преимущество ключей — защита от дурака, почти невозможно создать ключ с надёжностью как у пароля 123 (хотя и тут случались проблемы, но это была уже не оплошность админа)