У меня есть сервер Ubuntu, к которому я подключаюсь по SSH.
Мне нужно загрузить файлы со своего компьютера /var/www/
на сервер, файлы /var/www/
принадлежат root
.
Используя PuTTY, после того, как я войду в систему, я должен sudo su
сначала ввести свой пароль, чтобы иметь возможность изменять файлы в /var/www/
.
Но когда я копирую файлы с помощью WinSCP, я не могу создать / изменить файлы /var/www/
, потому что у пользователя, к которому я подключаюсь, нет прав доступа к файлам, /var/www/
и я не могу сказать, sudo su
как в случае сеанса ssh ,
Вы знаете, как я мог справиться с этим?
Если бы я работал на своей локальной машине, я бы позвонил, gksudo nautilus
но в этом случае у меня есть только терминальный доступ к машине.
Ответы:
Ты прав, нет
sudo
при работе сscp
. Обходной путь - использоватьscp
для загрузки файлов в каталог, где у вашего пользователя есть разрешения на создание файлов, затем войти в систему через ssh и использоватьsudo
для перемещения / копирования файлов в их конечное место назначения.Другим решением будет изменение прав доступа / владельцев каталогов, в которые вы загружаете файлы, чтобы ваш непривилегированный пользователь мог писать в эти каталоги.
Как правило, работа с
root
учетной записью должна быть исключением, а не правилом - то, как вы формулируете свой вопрос, заставляет меня задуматься, может быть, вы немного злоупотребляете им, что, в свою очередь, приводит к проблемам с разрешениями - в нормальных условиях вам это не нужно привилегии супер-администратора для доступа к вашим собственным файлам.Технически вы можете настроить Ubuntu так, чтобы разрешить удаленный вход напрямую
root
, но эта функция по какой-то причине отключена, поэтому я настоятельно рекомендую вам не делать этого.источник
scp -R mysite dimitris@myserver.com:/home/dimitris/
2.ssh dimitris@myserver.com
3.sudo mv ~/mysite /var/www
- это двухэтапный процесс, сначала выscp
отправляете файлы в домашнюю директорию, затем вы входите через ssh и копируете / перемещаете файлы туда, где они должны бытьДругой способ - скопировать, используя tar + ssh вместо scp:
источник
sudo: sorry, you must have a tty to run sudo
. Если я добавлю «-t» для выделения TTY, я получуPseudo-terminal will not be allocated because stdin is not a terminal.
. Я не вижу, чтобы это работало без sudo без пароля.ssh -t dimitris@myserver.com "sudo tar -x --no-same-owner -C /var/www"
sudo tar
, заархивировать его, изменить разрешения с помощьюchmod
иchown
, а затем скопировать в локальный. Особенно, если это каталог.Быстрый способ
С сервера на локальную машину:
С локального компьютера на сервер:
источник
Вы также можете использовать
ansible
для этого.Скопируйте на удаленный хост, используя модуль ansible
copy
:Получить с удаленного хоста, используя модуль ansible
fetch
:НОТА:
-i HOST,
синтаксисе не является опечаткой. Это способ использовать ansible без необходимости в инвентаре.-b
заставляет действия на сервере выполняться как root.-b
расширяется до--become
, и по умолчанию--become-user
используется root, по умолчанию используется--become-method
sudo.flat=yes
копирует только файл, не копирует весь удаленный путь, ведущий к файлуcopy
модулем, но не с помощьюfetch
модуля.Конкретный вызов для этого вопроса
Вот пример, который является конкретным и полностью определенным, если предположить, что каталог на вашем локальном хосте, содержащий файлы для распространения
sourcedir
, и что имя хоста удаленной целиhostname
:С кратким призывом быть:
PS Я понимаю, что высказывание «просто установите этот невероятный инструмент» является своего рода глухим ответом. Но я обнаружил, что ansible очень полезен для администрирования удаленных серверов, поэтому его установка, несомненно, принесет вам другие преимущества, помимо развертывания файлов.
источник
ansible -i "hostname," all -u user --become -m copy -a ...
-i 'host,'
действительный синтаксис? Я думаю, что при чтении команды легко потерять пунктуацию. (Для читателя я имею в виду, если не оболочку.)-i 'host,'
же, как-i host,
и-i "host,"
. В целом, я предпочитаю, чтобы эти вызовы были как можно более короткими, чтобы они не были пугающими, но вы должны не стесняться делать их настолько подробными и четкими, насколько вы считаете, что это необходимо для ясности.При запуске
sudo su
любые файлы, которые вы создаете, будут принадлежать пользователю root, но по умолчанию невозможно напрямую войти в систему как root с помощью ssh или scp. Также невозможно использовать sudo с scp, поэтому файлы нельзя использовать. Исправьте это, заявив право собственности на ваши файлы:Предполагая, что ваше имя пользователя было dimitri, вы можете использовать эту команду.
С этого момента, как уже упоминалось в других ответах, «Ubuntu» использует sudo, а не root-логины. Это полезная парадигма с большими преимуществами безопасности.
источник
sudo chow ...
для каждого отдельного каталога: S-R
inchown
сообщает ему об изменении владельца этого каталога, а также всех дочерних файлов и каталогов рекурсивно ... так что вы можете делать все что угодно.Может быть, лучшим способом является использование
rsync
( Cygwin / cwRsync в Windows) поверх SSH?Например, чтобы загрузить файлы с владельцем
www-data
:В вашем случае, если вам нужны привилегии root, команда будет выглядеть так:
Смотрите: scp на удаленный сервер с sudo .
источник
Если вы используете инструменты OpenSSH вместо PuTTY, вы можете сделать это, инициировав
scp
передачу файлов на сервер с помощьюsudo
. Убедитесь, чтоsshd
на вашем локальном компьютере запущен демон. Сssh -R
его помощью вы можете дать серверу способ связаться с вашей машиной.На вашей машине:
В дополнение к входу в систему на сервере, он будет перенаправлять каждое соединение, выполненное на порту 11111 сервера, на порт 22 вашей машины: порт, который вы
sshd
прослушиваете.На сервере начните передачу файла следующим образом:
источник
Вы можете использовать сценарий, который я написал, вдохновленный этой темой:
но это требует некоторых сумасшедших вещей (что, кстати, автоматически делается по сценарию)
Вот сценарий:
источник
Вы можете комбинировать ssh, sudo и, например, tar для передачи файлов между серверами, не имея возможности войти в систему как root и не имея разрешения на доступ к файлам с вашим пользователем. Это немного неудобно, поэтому я написал сценарий, чтобы помочь этому. Вы можете найти скрипт здесь: https://github.com/sigmunau/sudoscp
или здесь:
источник
Вот модифицированная версия ответа Вилли Уилера, которая передает файл (ы) через tar, но также поддерживает передачу пароля к sudo на удаленном хосте.
Немного дополнительной магии здесь - опция -S для sudo. Со страницы руководства sudo:
Теперь мы на самом деле хотим, чтобы вывод tar передавался в ssh, и это перенаправляет стандартный вывод ssh на стандартный вывод tar, удаляя любой способ передачи пароля в sudo с интерактивного терминала. (Мы могли бы использовать функцию sudo ASKPASS на удаленном конце, но это уже другая история.) Мы можем получить пароль в sudo, хотя, захватывая его заранее и добавляя его к выводу tar, выполняя эти операции в подоболочке и передавая выходные данные подоболочка в ssh. Это также имеет дополнительное преимущество - не оставлять переменную окружения, содержащую наш пароль, в нашей интерактивной оболочке.
Вы заметите, что я не выполнил 'read' с опцией -p, чтобы напечатать приглашение. Это потому, что запрос пароля от sudo удобно передается обратно в stderr нашей интерактивной оболочки через ssh. Вы можете задаться вопросом "как выполняется sudo, если он работает внутри ssh справа от нашего канала?" Когда мы выполняем несколько команд и перенаправляем вывод одной команды в другую, родительская оболочка (в данном случае интерактивная оболочка) выполняет каждую команду в последовательности сразу после выполнения предыдущей. При выполнении каждой команды за каналом родительская оболочка прикрепляет (перенаправляет) стандартный вывод левой стороны к стандартному выводу правой стороны. Выход становится входным по мере прохождения через процессы.
Наша интерактивная оболочка - PID 7168, наша подоболочка - PID 7969, а наш процесс ssh - PID 7970.
Единственным недостатком является то, что read примет ввод, прежде чем sudo успеет отослать ответ. На быстром соединении и быстром удаленном хосте вы не заметите этого, но можете сделать это медленно. Любая задержка не повлияет на возможность ввода приглашения; это может появиться только после того, как вы начали печатать.
Примечание. Я просто добавил запись файла хоста для "remote_Host" на мою локальную машину для демонстрации.
источник