Bash - работа с SSH
-
Содержание
-
Передача каталогов и файлов через SSH
Вот актуальный на 2025 год и максимально полный список команд для передачи файлов и папок по SSH (все работают в Linux, macOS и Windows с OpenSSH/WSL).
1. Классический scp (надёжно, но медленнее)
# С удалённого → на локальный scp -r -P 2222 user@203.0.113.10:/home/user/backup/ ./backup/ # С локального → на удалённый scp -r -P 2222 ./Documents/ user@203.0.113.10:/home/user/ # Через сжатие (ускоряет на медленных каналах) scp -r -C -P 2222 big_folder/ user@server:/tmp/2. rsync по SSH — самый быстрый и умный способ
# С удалённого → на локальный rsync -avz --progress -e "ssh -p 2222" user@203.0.113.10:/home/user/backup/ ./backup/ # С локального → на удалённый rsync -avz --progress --delete ./Music/ user@203.0.113.10:/home/user/Music/ # Только новые/изменённые файлы + сжатие + удаление лишнего rsync -avz --delete -e "ssh -p 2222" /home/user/bigdata/ user@server:/mnt/backup/Ключи:
-a— архивный режим (сохраняет права, владельца, время)-v— подробно-z— сжатие--progress— прогресс-бар--delete— удалить на приёмнике то, чего нет в источнике
3. tar + ssh — передача огромных папок одной командой (очень быстро)
# С удалённого → на локальный (без промежуточных файлов) tar -czf - /home/user/big_folder/ | ssh user@local "cat > ~/big_folder.tar.gz" # С локального → на удалённый (ещё быстрее) tar -czf - ./Videos/ | ssh -p 2222 user@203.0.113.10 "cat > /home/user/Videos.tar.gz" # Или распаковывать сразу на принимающей стороне tar -czf - ./Documents/ | ssh user@server "tar -xzf - -C /home/user/"4. Монтирование удалённой папки как локальной (sshfs) — удобно для постоянной работы
# Установка sudo apt install sshfs # Примонтировать mkdir ~/remote_folder sshfs -o reconnect,port=2222 user@203.0.113.10:/home/user/ ~/remote_folder # Отмонтировать fusermount -u ~/remote_folder5. Быстрые однострочники
# Скачать всю домашнюю папку пользователя с сервера rsync -avz user@server:/home/user/ ./user_backup_$(date +%F)/ # Залить только изменённые фото за сегодня rsync -avz --include="*.jpg" --include="*/" --exclude="*" ./Photos/2025/ user@nas:/Photos/ # Синхронизировать два сервера напрямую (без локального диска) rsync -avz -e ssh server1:/data/ server2:/data/ # Копировать с прогресс-баром и скоростью rsync -av --info=progress2 source/ user@dest:/target/6. Если нужно обойти ограничения (например, нет rsync на сервере)
# Через netcat (nc) — супер быстро на локальной сети # На принимающей машине: nc -l -p 5000 | tar -xzf - # На отправляющей: tar -czf - folder/ | nc 192.168.1.100 5000Для 99 % задач используйте rsync — он быстрее, умнее и надёжнее scp.
-
Открыть в своём браузере настройки удалённого роутера
sudo ssh -L 8080:192.168.0.1:80 user@<ip-сервера>-L - локальный адрес
8080 - порт в браузере пользователя
192.168.0.1:80 - пример адреса роутера
В своём браузере ввести адрес http://localhost:8080
-
Как поменять порт SSH с 22 на 2222 (Debian)
На Debian 13 (Trixie) можно безопасно изменить порт SSH с 22 на 2222, следуя пошаговой инструкции. Рекомендуемый современный способ — создать отдельный файл конфигурации, который не будет перезаписан при обновлении системы.
Предварительные меры предосторожности
Прежде чем вносить изменения, выполните следующие действия, чтобы не потерять доступ к серверу:
- Не закрывайте текущую SSH-сессию, пока не проверите работоспособность нового порта в другой сессии .
- Проверьте, не занят ли порт 2222 другой службой, выполнив команду:
sudo ss -tulpn | grep :2222. Отсутствие вывода означает, что порт свободен .
Пошаговая инструкция по изменению порта
1. Создайте файл пользовательской конфигурации
В Debian 13 (и современных версиях) рекомендуется добавлять изменения в отдельные файлы внутри каталога
/etc/ssh/sshd_config.d/, чтобы не редактировать основной файл конфигурации. Это облегчает обновление пакета и управление настройками .Откройте терминал и создайте новый файл конфигурации с помощью текстового редактора (например,
nano) :sudo nano /etc/ssh/sshd_config.d/port.conf2. Добавьте строку с новым портом
В открывшемся пустом файле добавьте следующую строку, которая укажет SSH-серверу слушать новый порт :
Port 2222- Совет: Выбирайте порт в диапазоне от 1024 до 65535, чтобы избежать конфликтов с системными службами .
Сохраните файл и выйдите из редактора (в
nano: нажмитеCtrl+X, затемYдля подтверждения иEnter).3. Проверьте конфигурацию SSH
Перед перезапуском службы всегда проверяйте синтаксис конфигурационных файлов, чтобы избежать ошибок, которые могут помешать запуску SSH :
sudo sshd -tЕсли команда не вывела никаких сообщений, значит, синтаксис верен.
4. Настройте firewall (Брандмауэр)
Если на вашем сервере включен брандмауэр (например,
ufw), необходимо разрешить трафик на новый порт до перезапуска SSH, иначе соединение будет разорвано .-
Если используется UFW:
sudo ufw allow 2222/tcp sudo ufw reloadДля проверки правил можно использовать
sudo ufw status. -
Если используются iptables или nftables:
Добавьте соответствующее правило. Например, для iptables:sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPTНе забудьте сохранить правила iptables, чтобы они пережили перезагрузку .
5. Перезапустите службу SSH
Примените изменения, перезапустив службу SSH. На Debian используется сервис
ssh:sudo systemctl restart ssh6. Проверьте подключение на новом порту
Самое важное: не закрывая текущую сессию, откройте новое окно терминала и попробуйте подключиться к серверу, используя новый порт :
ssh -p 2222 ваше_имя_пользователя@ip_адрес_сервераЕсли подключение прошло успешно, вы можете использовать сервер как обычно.
Возможные проблемы и их решение
-
Ошибка "Connection refused":
- Убедитесь, что вы используете правильный IP-адрес и порт 2222.
- Проверьте, что правила брандмауэра обновлены и применяются. Временно можно остановить firewall для теста:
sudo ufw disable(не забудьте потом включить обратно) . - Проверьте, слушает ли SSH новый порт:
sudo ss -tulpn | grep ssh.
-
Если доступ потерян:
Используйте альтернативный способ доступа к серверу (например, через веб-консоль у хостинг-провайдера или IPMI) и верните изменения. Удалите созданный вами файлport.confи перезапустите SSH:sudo rm /etc/ssh/sshd_config.d/port.confиsudo systemctl restart ssh.
Дополнительные рекомендации
После того как вы убедились, что новый порт работает, вы можете удалить правило для старого порта из файрвола, чтобы закрыть лишнюю точку входа :
sudo ufw delete allow 22/tcpОбратите внимание, что изменение порта — это лишь один из шагов по усилению безопасности. Рекомендуется также настроить аутентификацию по ключам и отключить вход для пользователя root .
-
Как узнать на каком порту слушает SSH
Узнать, на каком порту слушает SSH, можно несколькими способами. Вот самые надежные и наглядные методы для Debian и других Linux-систем.
Способ 1: Проверка активных слушающих портов (Самый надежный)
Этот метод показывает, какие порты в данный момент реально открыты и ожидают подключений.
Используем
ss(современная замена netstat)sudo ss -tulpn | grep sshdРазберем ключи:
-t(tcp) — показывать TCP-порты-u(udp) — показывать UDP-порты-l(listening) — только слушающие порты-p(process) — показать процесс, который слушает порт-n(numeric) — не резолвить имена (показывать цифры, работает быстрее)
Пример вывода:
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3)) tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1234,fd=4))В этом примере SSH слушает порт 22 на всех интерфейсах (IPv4 и IPv6).
Если вы меняли порт на 2222, вывод будет таким:
tcp LISTEN 0 128 0.0.0.0:2222 0.0.0.0:* users:(("sshd",pid=1234,fd=3))Альтернатива с
netstatЕсли
ssне установлен или вы привыкли кnetstat:sudo netstat -tulpn | grep sshdЕсли
netstatне найден, установите его:sudo apt install net-toolsСпособ 2: Проверка конфигурационного файла
Этот метод показывает, что написано в конфиге, но не гарантирует, что SSH реально слушает именно эти порты (например, если конфиг содержит ошибку или сервис не перезапущен).
Основной конфиг
grep -E "^Port" /etc/ssh/sshd_configВывод покажет что-то вроде:
Port 22Если строка закомментирована (
#Port 22), значит используется значение по умолчанию — порт 22.Проверка дополнительных конфигов (Debian 12+)
В современных версиях Debian настройки могут лежать в отдельных файлах внутри каталога:
grep -E "^Port" /etc/ssh/sshd_config.d/*.confЭто покажет все порты, заданные в пользовательских конфигах. Например:
/etc/ssh/sshd_config.d/port.conf:Port 2222Способ 3: Просмотр активных SSH-соединений
Если кто-то уже подключен к серверу, можно увидеть, на каком порту они подключились:
sudo ss -tunp | grep ESTAB | grep sshИли:
sudo netstat -tunp | grep ESTABLISHED | grep sshСпособ 4: Использование
lsofУтилита
lsof(list open files) тоже отлично показывает открытые порты:sudo lsof -i :22 -sTCP:LISTENЗамените
22на любой порт, который хотите проверить. Если порт слушается, вы увидите процессsshd.Или посмотреть все слушающие порты SSH:
sudo lsof -i -sTCP:LISTEN | grep sshЧто делать, если порт не совпадает с ожидаемым?
Если вы изменили порт в конфиге, перезапустили SSH, но
ssпоказывает старый порт:-
Проверьте, нет ли синтаксических ошибок в конфиге:
sudo sshd -tЕсли есть ошибки, команда укажет на них.
-
Проверьте, запущен ли SSH:
sudo systemctl status ssh -
Посмотрите логи — там часто пишут, на каких портах запустился SSH:
sudo journalctl -u ssh | grep "listening on"
Резюме: самый быстрый способ
Просто запомните эту команду — она сработает в 99% случаев:
sudo ss -tulpn | grep :22Замените
22на предполагаемый порт, если меняли его. Если порт найден, вы увидите строку сLISTENи процессомsshd.