Вам нужно будет добавить репозиторий, а затем выполнить обновление дистрибутива.
[+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.
Вы правы, при работе с 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
, но эта функция по какой-то причине отключена, поэтому я настоятельно рекомендую вам не делать этого.
Вот модифицированная версия ответа Вилли Уилера, которая передает файл (ы) через 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 Запишите подсказку к стандартной ошибке и прочитайте пароль из стандартного ввода вместо использования терминального устройства. За паролем должен следовать символ новой строки.
blockquote>Теперь мы на самом деле хотим, чтобы вывод 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" на мою локальную машину для демонстрации.
Когда вы запускаете sudo su
, все созданные вами файлы будут принадлежать пользователю root, но по умолчанию невозможно напрямую войти в систему как root с помощью ssh или scp. Также невозможно использовать sudo с scp, поэтому файлы нельзя использовать. Исправьте это, заявив право собственности на ваши файлы:
Предполагая, что ваше имя пользователя dimitri, вы можете использовать эту команду.
sudo chown -R dimitri:dimitri /home/dimitri
С этого момента, как уже упоминалось в других ответах, «Ubuntu» использует sudo, а не root-логины. Это полезная парадигма с большими преимуществами безопасности.
sudo chow ...
для каждого каталога: S
– user1338062
09.02.2020, 22:32
-R
в chown
говорит ему изменять владение того каталога, и все дочерние файлы и каталоги рекурсивно..., таким образом, можно сделать что-либо, которое Вам нравится.
– Stefan Rein
09.02.2020, 22:32
Вы можете использовать сценарий, который я написал, вдохновленный этой темой:
touch /tmp/justtest && scpassudo /tmp/justtest remoteuser@ssh.superserver.com:/tmp/
, но это требует некоторых сумасшедших вещей (что, кстати, автоматически выполняется сценарием)
Здесь идет сценарий:
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
Может быть, лучший способ - использовать 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
Если вы используете инструменты 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 .
Вы также можете использовать ansible
для этого.
copy
ansible : ansible -i HOST, -b -m copy -a "src=SRC_FILEPATH dest=DEST_FILEPATH" all
fetch
модуль [116] ansible : ПРИМЕЧАНИЕ:
-i HOST,
не является опечаткой. Это способ использовать ansible без необходимости в инвентаре. -b
заставляет действия на сервере выполняться от имени пользователя root. -b
расширяется до --become
, и по умолчанию --become-user
является root, по умолчанию --become-method
является sudo. flat=yes
копирует просто файл, не копирует весь удаленный путь, ведущий к файлу 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 полезным для администрирования удаленных серверов, поэтому его установка, несомненно, принесет вам другие преимущества, помимо развертывания файлов.
Вы можете комбинировать 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
Быстрый способ
С сервера на локальный компьютер:
ssh user@server "sudo cat /etc/dir/file" > /home/user/file
С локального компьютера на сервер:
cat /home/user/file | ssh user@server "sudo tee -a /etc/dir/file"
Другой способ - копировать, используя tar + ssh вместо scp:
tar -c -C ./my/local/dir \
| ssh dimitris@myserver.com "sudo tar -x --no-same-owner -C /var/www"
sudo tar
, заархивируйте его, полномочия изменения с помощью chmod
и chown
, и затем скопируйте его в локальный. Особенно, если it' s каталог.
– Md. Yusuf
09.02.2020, 22:36
ssh -t dimitris@myserver.com "sudo tar -x --no-same-owner -C /var/www"
– Bob
09.02.2020, 22:37
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
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