当前位置: 首页>>技术教程>>正文


如何将需要root权限的文件复制到scp?

, , , ,

问题描述

我有一台使用SSH连接的Ubuntu服务器。

我需要从我的机器上传文件到服务器上的/var/www/中,/var/www/中的文件由root拥有。

使用PuTTY登录后,我必须首先键入sudo su和我的密码才能修改/var/www/中的文件。

但是当我使用WinSCP复制文件时,我无法在/var /www /中创建创建/修改文件,因为我正在连接的用户对/var /www /中的文件没有权限,而且我也无法说sudo su,就像我在ssh会话中一样。

你知道我可以如何处理这个?

如果我在本地机器上工作,我会调用gksudo nautilus,但在这种情况下,我只能通过终端访问机器。

最佳解决办法

你是对的,在与scp合作时没有sudo。一种解决方法是使用scp上传文件到您的用户有权限创建文件的目录,然后通过ssh登录和使用sudo于/COPY文件移动到它们的最终目的地。

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

另一种解决方案是更改上传文件的目录的权限/所有权,以便您的non-privileged用户能够写入这些目录。

一般来说,在root帐户中工作应该是一个例外,而不是一个规则 – 您对问题进行措辞的方式会让我觉得您可能会滥用它,这反过来会导致权限问题 – 在正常情况下您不会需要super-admin权限才能访问您自己的文件。

从技术上讲,您可以将Ubuntu配置为允许直接以root的身份进行远程登录,但由于某种原因该功能被禁用,因此我强烈建议您不要这样做。

次佳解决办法

另一种方法是使用tar + ssh而不是scp来复制:

tar -c -C ./my/local/dir \
  | ssh dimitris@myserver.com "sudo tar -x --no-same-owner -C /var/www"

第三种解决办法

您也可以使用ansible完成此操作。

使用安全的copy模块复制到远程主机:

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

使用安全的fetch模块从远程主机获取:

ansible -i HOST, -b -m fetch -a "src=SRC_FILEPATH dest=DEST_FILEPATH flat=yes" all

注意:

  • -i HOST,语法中的逗号不是拼写错误。这是使用安全而不需要库存文件的方式。

  • -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

P.S.,我意识到说“只是安装这个神话般的工具”就是一种tone-deaf答案。但是我发现它对于管理远程服务器非常有用,所以安装它肯定会为您带来除部署文件之外的其他好处。

第四种办法

当您运行sudo su时,您创建的任何文件都将由root拥有,但默认情况下不可以直接以root身份使用ssh或scp登录。用scp也不可能使用sudo,所以文件不可用。声明对您的文件拥有所有权来解决此问题:

假设你的用户名是dimitri,你可以使用这个命令。

sudo chown -R dimitri:dimitri /home/dimitri

从那时起,正如其他答案中提到的那样,”Ubuntu”的方式是使用sudo,而不是root登录。这是一个有用的范例,具有很大的安全优势。

第五种办法

可能最好的方法是通过SSH使用rsync(Windows中的Cygwin /cwRsync)?

例如,要用所有者www-data上传文件,请执行以下操作:

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

在你的情况下,如果你需要root权限,命令将是这样的:

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

请参阅:scp to remote server with sudo

第六种办法

如果您使用OpenSSH工具而不是PuTTY,则可以通过在sudo服务器上启动scp文件传输来完成此操作。确保您的本地计算机上运行了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 .

第七种办法

快速的方法:

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/450.html,未经允许,请勿转载。