Как мне скопировать файлы, которым нужен root-доступ, с помощью scp?

Вам нужно будет добавить репозиторий, а затем выполнить обновление дистрибутива.

[+113] Репо; http://ppa.launchpad.net/libreoffice/ppa/ubuntu

Самый простой способ - запускать эти команды в терминале (CLI) одну за другой;

sudo add-apt-repository ppa:libreoffice/ppa

sudo apt-get update

sudo apt-get dist-upgrade

При появлении новой версии менеджер обновлений скажет, что некоторые пакеты задержаны. Ключ заключается в обновлении дистрибутива через CLI.

168
задан 09.02.2020, 22:30

10 ответов

Вы правы, при работе с scp нет sudo. Обходной путь - использовать scp для загрузки файлов в каталог, где у вашего пользователя есть права на создание файлов, затем войти в систему через ssh и использовать sudo для перемещения / копирования файлов в их конечное место назначения.

scp -r folder/ user@server.tld:/some/folder/you/dont/need/sudo
ssh user@server.tld
 $ sudo mv /some/folder /some/folder/requiring/perms 
# YOU MAY NEED TO CHANGE THE OWNER like:
# sudo chown -R user:user folder

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

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

Технически, вы можете настроить Ubuntu для разрешения удаленного входа непосредственно как root, но эта функция по какой-то причине отключена, поэтому я настоятельно рекомендую вам не делать этого.

126
ответ дан 09.02.2020, 22:35
  • 1
    Ре. первое решение. 1. scp -R mysite dimitris@myserver.com:/home/dimitris/ 2. ssh dimitris@myserver.com 3. sudo mv ~/mysite /var/www - it' s процесс с 2 шагами, сначала Вы scp файлы к Вашему домашнему dir, тогда Вы регистрируетесь на пути ssh и копируете/перемещаете файлы туда, где они должны быть – Lucio Paiva 09.02.2020, 22:35
  • 2
    я didn' t получают первое решение, Вы могли быть немного более конкретными? – Dominic Farolino 09.02.2020, 22:36
  • 3
    Whe я говорю свои собственные файлы, я имею в виду/var/www, я использую свой vps в качестве веб-сервера.... на моей собственной папке, у меня есть полный доступ – Bob 09.02.2020, 22:36

Вот модифицированная версия ответа Вилли Уилера, которая передает файл (ы) через tar, но также поддерживает передачу пароля к sudo на удаленном хосте.

(stty -echo; read passwd; stty echo; echo $passwd; tar -cz foo.*) \
  | ssh remote_host "sudo -S bash -c \"tar -C /var/www/ -xz; echo\""

Немного лишней магии здесь - опция -S для sudo. Со страницы руководства sudo:

-S, --stdin Запишите подсказку к стандартной ошибке и прочитайте пароль из стандартного ввода вместо использования терминального устройства. За паролем должен следовать символ новой строки.

Теперь мы на самом деле хотим, чтобы вывод tar передавался в ssh, и он перенаправляет stdin из ssh в stdout из tar, удаляя любой способ передачи пароля в sudo с интерактивного терминала. (Мы могли бы использовать функцию sudo ASKPASS на удаленном конце, но это уже другая история.) Мы можем получить пароль в sudo, хотя, захватывая его заранее и добавляя его к выводу tar, выполняя эти операции в подоболочке и передавая выходные данные подоболочка в ssh. Это также имеет дополнительное преимущество - не оставлять переменную окружения, содержащую наш пароль, в нашей интерактивной оболочке.

Вы заметите, что я не выполнил 'read' с опцией -p, чтобы напечатать приглашение. Это потому, что запрос пароля от sudo удобно передается обратно в stderr нашей интерактивной оболочки через ssh. Вы можете задаться вопросом "как выполняется sudo, если он работает внутри ssh справа от нашего канала?" Когда мы выполняем несколько команд и перенаправляем вывод одной команды в другую, родительская оболочка (в данном случае интерактивная оболочка) выполняет каждую команду в последовательности сразу после выполнения предыдущей. При выполнении каждой команды за каналом родительская оболочка прикрепляет (перенаправляет) стандартный вывод левой стороны к стандартному выводу правой стороны. Выход становится входным по мере прохождения через процессы. Мы можем увидеть это в действии, выполнив всю команду и установив фоновую группу процессов (Ctrl-z), прежде чем ввести наш пароль, а затем просмотреть дерево процессов.

$ (stty -echo; read passwd; stty echo; echo $passwd; tar -cz foo.*) | ssh 
remote_host "sudo -S bash -c \"tar -C /var/www/ -xz; echo\""
[sudo] password for bruce: 
[1]+  Stopped                 ( stty -echo; read passwd; stty echo; echo 
$passwd; tar -cz foo.* ) | ssh remote_host "sudo -S bash -c \"tar -C 
/var/www/ -xz; echo\""

$ pstree -lap $
bash,7168
  ├─bash,7969
  ├─pstree,7972 -lap 7168
  └─ssh,7970 remote_host sudo -S bash -c "tar -C /var/www/ -xz; echo"`

Наша интерактивная оболочка - это PID 7168, наша подчиненная оболочка - PID 7969, а наш процесс ssh - PID 7970.

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

Примечание. Я просто добавил запись хост-файла для "remote_Host" на мою локальную машину для демонстрации.

0
ответ дан 09.02.2020, 22:30

Когда вы запускаете sudo su, все созданные вами файлы будут принадлежать пользователю root, но по умолчанию невозможно напрямую войти в систему как root с помощью ssh или scp. Также невозможно использовать sudo с scp, поэтому файлы нельзя использовать. Исправьте это, заявив право собственности на ваши файлы:

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

sudo chown -R dimitri:dimitri /home/dimitri

С этого момента, как уже упоминалось в других ответах, «Ubuntu» использует sudo, а не root-логины. Это полезная парадигма с большими преимуществами безопасности.

12
ответ дан 09.02.2020, 22:31
  • 1
    хм.... это кажется хорошо работающим, спасибо! извините я can' t upvote (система не позволяет мне делать...), – Max Koretskyi aka Wizard 09.02.2020, 22:31
  • 2
    я использую это решение любой путь, но что, если я мог бы получить полный доступ к своей собственной файловой системе, я don' t хотят к типу sudo chow ... для каждого каталога: S – user1338062 09.02.2020, 22:32
  • 3
    Изменению владения всех системных файлов пользователю для передающего удобства высоко препятствуют. Это позволяет любую ошибку пространства пользователя, с которой Вы могли бы встретиться, чтобы сильно поставить под угрозу безопасность Вашей системы. Намного лучше изменить владение файлов, которые необходимо изменить или обновить SCP, но оставить все остальное принадлежавшим корню (как он, как предполагается). Однако -R в chown говорит ему изменять владение того каталога, и все дочерние файлы и каталоги рекурсивно..., таким образом, можно сделать что-либо, которое Вам нравится. – Stefan Rein 09.02.2020, 22:32

Вы можете использовать сценарий, который я написал, вдохновленный этой темой:

touch /tmp/justtest && scpassudo /tmp/justtest remoteuser@ssh.superserver.com:/tmp/

, но это требует некоторых сумасшедших вещей (что, кстати, автоматически выполняется сценарием)

    [112 ] сервер, на который отправляется файл, больше не будет запрашивать пароль при установлении соединения ssh с исходным компьютером
  1. из-за необходимости отсутствия приглашения sudo на сервере, sudo больше не будет запрашивать пароль на удаленной машине, для пользователя

Здесь идет сценарий:

interface=wlan0
if [[ $# -ge 3 ]]; then interface=$3; fi
thisIP=$(ifconfig | grep $interface -b1 | tail -n1 | egrep -o '[0-9.]{4,}' -m1 | head -n 1)
thisUser=$(whoami)
localFilePath=/tmp/justfortest
destIP=192.168.0.2
destUser=silesia
#dest 
#destFolderOnRemoteMachine=/opt/glassfish/glassfish/
#destFolderOnRemoteMachine=/tmp/

if [[ $# -eq 0 ]]; then 
echo -e "Send file to remote server to locatoin where root permision is needed.\n\tusage: [111] local_filename [username@](ip|host):(remote_folder/|remote_filename) [optionalInterface=wlan0]"
echo -e "Example: \n\ttouch /tmp/justtest &&\n\t [111] /tmp/justtest remoteuser@ssh.superserver.com:/tmp/ "
exit 1
fi

localFilePath=$1

test -e $localFilePath 

destString=$2
usernameAndHost=$(echo $destString | cut -f1 -d':')

if [[ "$usernameAndHost" == *"@"* ]]; then
destUser=$(echo $usernameAndHost | cut -f1 -d'@')
destIP=$(echo $usernameAndHost | cut -f2 -d'@')
else
destIP=$usernameAndHost
destUser=$thisUser
fi

destFolderOnRemoteMachine=$(echo $destString | cut -f2 -d':')

set -e #stop script if there is even single error

echo 'First step: we need to be able to execute scp without any user interaction'
echo 'generating public key on machine, which will receive file'
ssh $destUser@$destIP 'test -e ~/.ssh/id_rsa.pub -a -e ~/.ssh/id_rsa || ssh-keygen -t rsa'
echo 'Done'

echo 'Second step: download public key from remote machine to this machine so this machine allows remote machine (this one receiveing file) to login without asking for password'

key=$(ssh $destUser@$destIP 'cat ~/.ssh/id_rsa.pub')
if ! grep "$key" ~/.ssh/authorized_keys; then
echo $key >> ~/.ssh/authorized_keys
echo 'Added key to authorized hosts'
else
echo "Key already exists in authorized keys"
fi

echo "We will want to execute sudo command remotely, which means turning off asking for password"
echo 'This can be done by this tutorial http://stackoverflow.com/a/10310407/781312'
echo 'This you have to do manually: '
echo -e "execute in new terminal: \n\tssh $destUser:$destIP\nPress enter when ready"
read 
echo 'run there sudo visudo'
read
echo 'change '
echo '    %sudo   ALL=(ALL:ALL) ALL'
echo 'to'
echo '    %sudo   ALL=(ALL:ALL) NOPASSWD: ALL'
echo "After this step you will be done."
read

listOfFiles=$(ssh $destUser@$destIP "sudo ls -a")

if [[ "$listOfFiles" != "" ]]; then 
echo "Sending by executing command, in fact, receiving, file on remote machine"
echo 'Note that this command (due to " instead of '', see man bash | less -p''quotes'') is filled with values from local machine'
echo -e "Executing \n\t""identy=~/.ssh/id_rsa; sudo scp -i \$identy $(whoami)@$thisIP:$(readlink -f $localFilePath) $destFolderOnRemoteMachine"" \non remote machine"
ssh $destUser@$destIP "identy=~/.ssh/id_rsa; sudo scp -i \$identy $(whoami)@$thisIP:$(readlink -f $localFilePath) $destFolderOnRemoteMachine"
ssh $destUser@$destIP "ls ${destFolderOnRemoteMachine%\\\\n}/$(basename $localFilePath)"
if [[ ! "$?" -eq 0 ]]; then echo "errror in validating"; else echo -e "SUCCESS! Successfully sent\n\t$localFilePath \nto \n\t$destString\nFind more at http://arzoxadi.tk"; fi
else
echo "something went wrong with executing sudo on remote host, failure"

fi
ENDOFSCRIPT
) | sudo tee /usr/bin/scpassudo && chmod +x /usr/bin/scpassudo
1
ответ дан 09.02.2020, 22:32

Может быть, лучший способ - использовать rsync ( Cygwin / cwRsync в Windows) через SSH?

Например, для загрузки файлов с владельцем www-data:

rsync -a --rsync-path="sudo -u www-data rsync" path_to_local_data/ login@srv01.example.com:/var/www

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

rsync -a --rsync-path="sudo rsync" path_to_local_data/ login@srv01.example.com:/var/www

См .: scp на удаленный сервер с sudo [ 114].

11
ответ дан 09.02.2020, 22:32

Если вы используете инструменты OpenSSH вместо PuTTY, вы можете сделать это, запустив передачу файла scp на сервер с помощью sudo. Убедитесь, что на вашем локальном компьютере запущен демон sshd. С помощью ssh -R вы можете указать серверу способ связи с вашим компьютером.

На вашем компьютере:

ssh -R 11111:localhost:22 REMOTE_USERNAME@SERVERNAME

В дополнение к входу в систему на сервере, он будет перенаправлять каждое соединение, сделанное на порту 11111 сервера, на порт 22 вашего компьютера: порт, на котором установлен sshd слушая.

На сервере начните передачу файла следующим образом:

cd /var/www/
sudo scp -P 11111 -r LOCAL_USERNAME@localhost:FOLDERNAME .
5
ответ дан 09.02.2020, 22:33

Вы также можете использовать ansible для этого.

Скопируйте на удаленный хост, используя модуль copy ansible :

ansible -i HOST, -b -m copy -a "src=SRC_FILEPATH dest=DEST_FILEPATH" all

Извлеките с удаленного хоста, используя fetch модуль [116] ansible :

[ 111]

ПРИМЕЧАНИЕ:

  • Запятая в синтаксисе -i HOST, не является опечаткой. Это способ использовать ansible без необходимости в инвентаре.
  • -b заставляет действия на сервере выполняться от имени пользователя root. -b расширяется до --become, и по умолчанию --become-user является root, по умолчанию --become-method является sudo.
  • flat=yes копирует просто файл, не копирует весь удаленный путь, ведущий к файлу
  • Использование подстановочных знаков в путях к файлам не поддерживается этими модулями. [ 1130]
  • Копирование каталога поддерживается модулем copy, но не модулем fetch.

Конкретный вызов для этого вопроса

Вот пример, который является конкретным и полностью определенным, если предположить, что каталог на локальном хосте, содержащий файлы для распространения, sourcedir, и что удаленная цель имя хоста hostname:

cd sourcedir && \
ansible \
   --inventory-file hostname, \ 
   --become \
   --become-method sudo \
   --become-user root \
   --module-name copy \
   --args "src=. dest=/var/www/" \
   all

С кратким вызовом:

cd sourcedir && \
ansible -i hostname, -b -m copy -a "src=. dest=/var/www/" all

PS, я понимаю, что высказывание «просто установите этот невероятный инструмент» является своего рода глухим ответ. Но я обнаружил, что ansible является super полезным для администрирования удаленных серверов, поэтому его установка, несомненно, принесет вам другие преимущества, помимо развертывания файлов.

26

Вы можете комбинировать ssh, sudo и, например, tar для передачи файлов между серверами, не имея возможности войти в систему как root и не имея разрешения на доступ к файлам с вашим пользователем. Это немного неудобно, поэтому я написал сценарий, чтобы помочь этому. Вы можете найти сценарий здесь: https://github.com/sigmunau/sudoscp

или здесь:

#! /bin/bash
res=0
from=$1
to=$2
shift
shift
files="$@"
if test -z "$from" -o -z "$to" -o -z "$files"
then
    echo "Usage: [110]    (file)*"
    echo "example: [110] server1 server2 /usr/bin/myapp"
    exit 1
fi

read -s -p "Enter Password: " sudopassword
echo ""
temp1=$(mktemp)
temp2=$(mktemp)
(echo "$sudopassword";echo "$sudopassword"|ssh $from sudo -S tar c -P -C / $files 2>$temp1)|ssh $to sudo -S tar x -v -P -C / 2>$temp2
sourceres=${PIPESTATUS[0]}
if [ $? -ne 0 -o $sourceres -ne 0 ]
then
    echo "Failure!" >&2
    echo "$from output:" >&2
    cat $temp1 >&2
    echo "" >&2
    echo "$to output:" >&2
    cat $temp2 >&2
    res=1
fi

rm $temp1 $temp2
exit $res
1
ответ дан 09.02.2020, 22:34

Быстрый способ

С сервера на локальный компьютер:

ssh user@server "sudo cat /etc/dir/file" > /home/user/file

С локального компьютера на сервер:

cat /home/user/file | ssh user@server "sudo tee -a /etc/dir/file"
28
ответ дан 09.02.2020, 22:34
  • 1
    Красиво сделанный. Это точно, что я искал обоих вверх и вниз.Спасибо – Preston 09.02.2020, 22:35
  • 2
    Этот ответ недооценен. It' s простой, чистый, чтения или пишут корневой файл с единственной атомарной операцией, и ничего не требуют that' s не уже гарантированный быть там, если you' ре с помощью scp. Основной недостаток состоит в том, что это не копирует полномочия. Если Вы хотите это, решение для tar лучше. Это - мощная техника, особенно, если объединено с xargs/bash волшебством пересечь пути.. – ray 09.02.2020, 22:35
  • 3
    Я думаю, что вопрос был о загрузке файла от локального до удаленного и не наоборот – TaiwanGrapefruitTea 09.02.2020, 22:35
  • 4
    Это может быть сделано для каталога вместо файла также? – ray 09.02.2020, 22:36
  • 5
    Имеет право быть главным ответом, наверняка. – null 09.02.2020, 22:36

Другой способ - копировать, используя tar + ssh вместо scp:

tar -c -C ./my/local/dir \
  | ssh dimitris@myserver.com "sudo tar -x --no-same-owner -C /var/www"
36
ответ дан 09.02.2020, 22:36
  • 1
    Это - то, что наконец работало на меня. Вы don' t имеют полномочия в удаленный файл, который Вы хотите скопировать в локальный, сделайте sudo tar, заархивируйте его, полномочия изменения с помощью chmod и chown, и затем скопируйте его в локальный. Особенно, если it' s каталог. – Md. Yusuf 09.02.2020, 22:36
  • 2
    @IBBoard: попробуйте решение здесь использование ssh-t: ssh -t dimitris@myserver.com "sudo tar -x --no-same-owner -C /var/www" – Bob 09.02.2020, 22:37
  • 3
    Я can' t заставляют этот метод работать успешно. Как записано я добираюсь sudo: sorry, you must have a tty to run sudo. Если я добавляю "-t" для выделения TTY тогда, я добираюсь Pseudo-terminal will not be allocated because stdin is not a terminal.. Я can' t видят эту работу без passwordless sudo. – Brion Lion Zion 09.02.2020, 22:37
  • 4
    @AlexanderBird, В то время как это работает во многих случаях, I' m не уверенный это работает здесь потому что we' ре, пытающееся передавать tarball по каналу по соединению SSH. См. serverfault.com/questions/14389/… – user3059993 09.02.2020, 22:37
  • 5
    Это - лучший способ сделать это. – Sagar Bhosale 09.02.2020, 22:38

Теги

Похожие вопросы