Skip to content

Всё для WordPress, веб-разработки — и не только

🔓 Как получить root-права в WinSCP: настройка sudo для передачи файлов

🔓 Как получить root-права в WinSCP: настройка sudo для передачи файлов

Подключаетесь к серверу под обычным пользователем, заходите в /etc/nginx, и получаете «Permission denied». Файлы конфигурации, системные директории, логи, всё это закрыто от учётной записи без root-прав. А прямой вход под root по SSH на большинстве серверов отключён из соображений безопасности.

WinSCP, удобный файловый менеджер для Windows, но по умолчанию его SFTP-сессия работает с правами того пользователя, под которым вы зашли. Запросить повышение привилегий «на лету», как в терминале, протокол SFTP не умеет: он не интерактивен в момент рукопожатия и не может показать окно для ввода пароля sudo.

Ниже, четыре работающих способа заставить WinSCP работать с правами суперпользователя, от самого простого до «джедайского». Каждый проверен на Ubuntu, Debian и CentOS. Выберите тот, который лучше ложится на вашу инфраструктуру.

💡 Быстрый обзор:

  • ➡️ Проблема: WinSCP по умолчанию не даёт прав root, даже если у пользователя есть sudo.
  • Основной метод: Подмена команды запуска SFTP-сервера в настройках сайта WinSCP, быстро и точечно.
  • 🔄 Альтернатива: Переключение на протокол SCP с командой sudo su - в качестве оболочки.
  • ⚙️ Продвинутый: Правка sshd_config на сервере, глобальное решение для всех подключений.

Шаг 1: Команда запуска SFTP-сервера, основной метод

Самый распространённый и элегантный способ получить root-права в WinSCP, заставить его запускать SFTP-сервер сразу от имени суперпользователя. Это делается подменой команды запуска в настройках конкретного подключения. Сервер при этом не перенастраивается, решение работает точечно.

Окно настроек SFTP сервера в WinSCP

Пошаговая инструкция:

  • Запустите WinSCP и откройте менеджер сайтов.
  • Выберите нужное подключение и нажмите Редактировать.
  • Нажмите Продвинутые… внизу окна.
  • В левом меню перейдите в раздел Среда → SFTP.
  • В поле «Сервер SFTP» вместо значения «По умолчанию» впишите команду:
1sudo /usr/lib/openssh/sftp-server

Для старых дистрибутивов путь может быть другим. Типичные расположения sftp-server:

Дистрибутив

Путь к sftp-server

Ubuntu / Debian (актуальные)

/usr/lib/openssh/sftp-server

Ubuntu / Debian (старые)

/usr/lib/sftp-server

CentOS / RHEL / Fedora

/usr/libexec/openssh/sftp-server

Amazon Linux

/usr/libexec/openssh/sftp-server

Проверить точный путь на вашем сервере можно через терминал: cat /etc/ssh/sshd_config | grep Subsystem. Эта команда покажет, какой бинарник использует сам SSH-сервер.

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


Шаг 2: Настройка sudoers, разрешаем sudo без пароля

Поскольку SFTP-рукопожатие не интерактивно, у WinSCP нет возможности показать окно для ввода пароля sudo. Сервер просто разорвёт соединение с ошибкой, если пароль запрашивается. Решение, добавить пользователю право на выполнение нужной команды без пароля через файл /etc/sudoers.

Редактирование файла sudoers через visudo

Что делать:

  • Подключитесь к серверу по SSH (через PuTTY или встроенный терминал WinSCP).
  • Откройте редактор sudoers командой sudo visudo. Никогда не редактируйте /etc/sudoers напрямую, ошибка синтаксиса заблокирует sudo для всей системы, а visudo проверяет синтаксис перед сохранением.
  • Добавьте в конец файла строку (замените username на ваш логин):
1username ALL=(ALL) NOPASSWD: ALL

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

1username ALL=NOPASSWD: /usr/lib/openssh/sftp-server

Если на сервере несколько администраторов с разными логинами, узкая настройка снижает риск: даже при компрометации учётной записи злоумышленник не получит root на всё, а только на запуск SFTP.

Обратите внимание: опция requiretty в sudoers должна быть выключена. В современных реализациях sudo-rs она не поддерживается по умолчанию, но на старых серверах проверьте, закомментируйте строку Defaults requiretty, если она есть.


Шаг 3: Переключение на протокол SCP, быстрая альтернатива

Если возиться с путями к sftp-server не хочется, можно сменить сам протокол передачи данных. WinSCP поддерживает SCP, более старый, но надёжный протокол, который легче подхватывает настройки оболочки.

Настройка протокола SCP и оболочки в WinSCP

Как переключиться:

  • В настройках сессии WinSCP измените File protocol с SFTP на SCP.
  • Перейдите в Advanced → SCP/Shell.
  • В поле Shell впишите: sudo su -

При подключении WinSCP выполнит эту команду сразу после входа и переключит сессию в режим root.

SFTP

SCP

Права root

Через подмену бинарника сервера

Через подмену оболочки (sudo su -)

Скорость

Выше, особенно на множестве мелких файлов

Ниже

Докачка при обрыве

Есть

Нет

Надёжность на старых системах

Требует точного пути к бинарнику

Работает «из коробки»

Безопасность

Можно ограничить NOPASSWD одной командой

Нужен полный беспарольный sudo

Метод с SCP, компромиссный. Он проще в настройке, но проигрывает SFTP в скорости и возможностях восстановления при обрыве. Для разовых правок конфигов разница незаметна. Для регулярной передачи сотен файлов лучше настроить SFTP-метод.


Шаг 4: Глобальная настройка sshd_config, для опытных

Это метод для администраторов, которые хотят настроить поведение SSH-сервера централизованно. Суть: заменить строку Subsystem sftp в /etc/ssh/sshd_config на логическую конструкцию, которая сама определяет, может ли пользователь выполнить sudo без пароля, и запускает SFTP с соответствующими правами.

Что меняем:

Старая строка (обычно):

1Subsystem sftp /usr/lib/openssh/sftp-server

Новая строка:

1Subsystem sftp sudo -n true && sudo -n /usr/lib/openssh/sftp-server || /usr/lib/openssh/sftp-server

Как это работает:

  • sudo -n true, проверяет, может ли пользователь выполнить sudo без пароля (флаг -n = non-interactive).
  • Если да (&&), запускается сервер с правами root.
  • Если нет (||), сервер запускается с обычными правами пользователя.

После правки перезагрузите SSH-сервис: sudo systemctl restart sshd.

Важно: ошибка в синтаксисе этого файла полностью закроет доступ к серверу по SSH. Перед правкой убедитесь, что у вас есть второй терминал с активной сессией, если что-то пойдёт не так, вы сможете откатить изменения. И сделайте копию: cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.


Особенности облачных серверов (AWS EC2, DigitalOcean)

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

Настройки cloud-init для sudo в AWS EC2

AWS EC2 (Ubuntu):

Пользователь ubuntu на образах Ubuntu 18.04 и новее часто уже имеет нужные права. Проверьте файл /etc/sudoers.d/90-cloud-init-users, там может уже быть строка:

1ubuntu ALL=(ALL) NOPASSWD:ALL

Если она есть, шаг 2 можно пропустить. В настройках WinSCP используйте команду sudo /usr/lib/openssh/sftp-server.

AWS EC2 (Amazon Linux):

На Amazon Linux путь к sftp-server отличается, /usr/libexec/openssh/sftp-server. Ошибка в одной букве (lib вместо libexec) даст код ошибки 127 (Command not found) и мгновенный разрыв соединения.

DigitalOcean (Droplets Ubuntu):

На стандартных дроплетах DigitalOcean пользователь root по умолчанию включён, но доступ только по SSH-ключу. Если вы создали отдельного пользователя, настройка sudoers аналогична обычному Ubuntu.

Общий совет для облака: перед тем как вписывать путь в WinSCP, проверьте наличие файла на сервере: ls -la /usr/lib/openssh/sftp-server (или аналог для вашего дистрибутива).


⁉️🤔 Частые вопросы

Нужно ли включать прямой вход под root для работы WinSCP с sudo?

Нет. Весь смысл описанных методов, использовать обычную учётную запись и временно повышать права через sudo. Прямой вход под root (PermitRootLogin yes) считается плохой практикой безопасности: логи не покажут, кто именно из администраторов выполнил действие.

Почему WinSCP выдаёт ошибку «Command not found» после настройки?

Скорее всего, указан неверный путь к sftp-server. В разных дистрибутивах он лежит в /usr/lib/, /usr/lib/openssh/ или /usr/libexec/openssh/. Точный путь проверяется командой cat /etc/ssh/sshd_config | grep Subsystem на сервере.

Насколько безопасен NOPASSWD в sudoers?

Это компромисс. Полный доступ ALL=(ALL) NOPASSWD:ALL снижает защиту: если злоумышленник получит доступ к пользователю, он получит и root. Ограничение конкретной командой (/usr/lib/openssh/sftp-server) существенно безопаснее: посторонний не сможет через эту учётную запись запустить ничего, кроме SFTP-сервера.

Работает ли это с другими клиентами, FileZilla, Cyberduck?

Принцип тот же, но настройка отличается. В FileZilla нет удобного поля для команды SFTP-сервера в графическом интерфейсе, потребуется правка конфигурационного файла. Cyberduck поддерживает опцию «SFTP Server» в настройках подключения, аналогично WinSCP. WinSCP выигрывает по удобству именно в этом сценарии.

Что делать, если файлы видны, но не редактируются?

Проверьте владельца и права командой ls -la на сервере. Если вы настроили SFTP-сервер через sudo, но соединение упало обратно к обычным правам, значит, sudo запросил пароль и не получил ответа. Перепроверьте настройку NOPASSWD из шага 2.

Можно ли просто сменить владельца системных файлов на своего пользователя?

Это «грязный» обходной путь. Системные службы ожидают, что их конфигурациями владеет root. Смена владельца (chown) или прав (chmod) на системных файлах может сломать сервисы. Лучше потратить пять минут на настройку sudo, и работать правильно.

В чём разница между SCP и SFTP в контексте sudo?

SCP, это просто копирование через SSH: оно легче перехватывает оболочку, поэтому для него достаточно команды sudo su - в поле Shell. SFTP, полноценная подсистема, работающая как отдельный процесс: для неё нужен трюк с подменой бинарника. SFTP быстрее и функциональнее, SCP, проще в настройке.

Видны ли действия в логах при использовании sudo через WinSCP?

Да. В /var/log/auth.log будет запись о том, что пользователь username повысил права через sudo. Это плюс: если администраторов несколько, логи показывают, кто именно выполнил операцию. При прямом входе под root такой прозрачности нет.

Что делать, если sudo требует TTY, а WinSCP его не предоставляет?

Проверьте /etc/sudoers на наличие опции Defaults requiretty. Если она есть, закомментируйте её (добавьте # в начале строки) или отключите для конкретного пользователя: Defaults:username !requiretty. Современные реализации sudo-rs эту опцию не поддерживают, проблема актуальна только для старых серверов.

Можно ли запустить SFTP от имени другого пользователя, не root?

Да. Команда sudo -u www-data /usr/lib/openssh/sftp-server запустит сессию от имени www-data, это удобно, когда нужно править файлы сайта, не трогая системные директории. Права в sudoers для этого должны включать опцию -u: username ALL=(www-data) NOPASSWD: /usr/lib/openssh/sftp-server.


Итоговый вердикт: какой метод выбрать

Для ежедневной работы с сервером оптимален первый метод, подмена команды SFTP-сервера в сочетании с узкой настройкой NOPASSWD только на sftp-server. Он безопасен, не затрагивает глобальные настройки и работает на всех современных дистрибутивах.

  • Если у вас Ubuntu / Debian и вы готовы потратить 5 минут на настройку, берите Шаг 1 + Шаг 2 и не возвращайтесь к вопросу.
  • Если сервер старый и путь к sftp-server не находится, переключитесь на SCP (Шаг 3): он прощает неточности и работает практически везде.
  • Если администрируете десяток серверов и хотите единый стандарт, настройте sshd_config (Шаг 4) один раз через Ansible или вручную, но обязательно с бэкапом.

Начните с проверки: зайдите на сервер по SSH и выполните cat /etc/ssh/sshd_config | grep Subsystem. Через минуту вы уже будете знать точный путь, и первый метод заработает с первой попытки. А какой способ передачи файлов используете вы, делитесь в комментариях.