如何使用 scp 复制需要 root 访问权限的文件?

Dim*_*kas 202 server ssh root webserver

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

我需要将文件从我的机器上传到/var/www/服务器上,其中的文件/var/www/root.

使用 PuTTY,在我登录后,我必须先输入sudo su我的密码才能修改/var/www/.

但是,当我复制使用WinSCP赋予文件,我不能创建创建/修改中的文件/var/www/,因为我与连接用户没有对文件的权限/var/www/,我不能说sudo su,因为我在一个SSH会话的情况下做.

你知道我怎么处理这个吗?

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

Ser*_*gey 143

你是对的,sudo在使用scp. 一种解决方法是使用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
Run Code Online (Sandbox Code Playgroud)

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

一般来说,在root帐户中工作应该是一个例外,而不是规则——你表达问题的方式让我觉得你可能有点滥用它,这反过来会导致权限问题——在正常情况下你不需要访问您自己的文件的超级管理员权限。

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

  • 关于。第一个解决方案。1. `scp -R mysite dimitris@myserver.com:/home/dimitris/` 2. `ssh dimitris@myserver.com` 3. `sudo mv ~/mysite /var/www` - 这是一个两步过程,首先,您将文件“scp”到您的主目录,然后您通过 ssh 登录并将文件复制/移动到它们应该放置的位置 (7认同)

小智 82

快捷方式

从服务器到本地机器:

ssh user@server "sudo cat /etc/dir/file" > /home/user/file
Run Code Online (Sandbox Code Playgroud)

从本地机器到服务器:

cat /home/user/file | ssh user@server "sudo tee -a /etc/dir/file"
Run Code Online (Sandbox Code Playgroud)

  • 这个答案被低估了。它很简单,干净,使用单个原子操作读取或写入根文件,并且如果您使用 scp,则不需要任何不能保证存在的东西。主要缺点是它不复制权限。如果你想要那个,焦油解决方案更好。这是一种强大的技术,特别是如果结合 xargs/bash 魔法来遍历路径.. (12认同)
  • 当然,值得成为最佳答案。 (3认同)
  • ...但是您需要将 `-t` 传递给 ssh,除非{一些先决条件假设}_。否则,它会出现“sudo: no tty present and no askpass program specified”的错误。和`tee -a`?问题是关于复制,而不是关于追加并同时回显到标准输出。 (3认同)
  • 做得漂亮。这正是我向上和向下寻找的。谢谢 (2认同)
  • 这也可以为目录而不是文件完成吗? (2认同)

小智 43

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

tar -c -C ./my/local/dir \
  | ssh dimitris@myserver.com "sudo tar -x --no-same-owner -C /var/www"
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的方法。 (2认同)
  • 我无法让这种方法成功运行。正如所写的那样,我得到 `sudo:抱歉,你必须有一个 tty 才能运行 sudo`。如果我添加“-t”来分配 TTY,那么我会得到`伪终端将不会被分配,因为标准输入不是终端。`。如果没有无密码的 sudo,我就看不到这个工作。 (2认同)
  • @AlexanderBird 虽然这在很多情况下都有效,但我不确定它在这里是否有效,因为我们正在尝试通过 SSH 连接传输 tarball。请参阅 https://serverfault.com/questions/14389/when-would-ssh-t-not-be-property-instead-of-ssh (2认同)

小智 31

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

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

ansible -i HOST, -b -m copy -a "src=SRC_FILEPATH dest=DEST_FILEPATH" all
Run Code Online (Sandbox Code Playgroud)

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

ansible -i HOST, -b -m fetch -a "src=SRC_FILEPATH dest=DEST_FILEPATH flat=yes" all
Run Code Online (Sandbox Code Playgroud)

笔记:

  • -i HOST,语法中的逗号不是拼写错误。这是在不需要库存文件的情况下使用 ansible 的方法。
  • -b导致以 root 身份在服务器上执行操作。-b扩展为--become,默认--become-user为 root,默认--become-method为 sudo。
  • flat=yes的文件,不会复制整个远程路径通往文件
  • 这些 ansible 模块不支持在文件路径中使用通配符。
  • 复制目录由支持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
Run Code Online (Sandbox Code Playgroud)

简洁的调用是:

cd sourcedir && \
ansible -i hostname, -b -m copy -a "src=. dest=/var/www/" all
Run Code Online (Sandbox Code Playgroud)

PS,我意识到说“只需安装这个出色的工具”是一种聋哑的回答。但我发现ansible是超级用于管理远程服务器有用的,所以在安装它必将为你带来超越部署文件的其他好处。

  • 跳出框框思考的方式!Ansible 的大量使用 (2认同)

Ale*_*nov 16

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

例如,使用 owner 上传文件www-data

rsync -a --rsync-path="sudo -u www-data rsync" path_to_local_data/ login@srv01.example.com:/var/www
Run Code Online (Sandbox Code Playgroud)

在您的情况下,如果您需要 root 权限,命令将如下所示:

rsync -a --rsync-path="sudo rsync" path_to_local_data/ login@srv01.example.com:/var/www
Run Code Online (Sandbox Code Playgroud)

请参阅:使用 sudo scp 到远程服务器


tro*_*ers 12

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

假设您的用户名是 dimitri,您可以使用此命令。

sudo chown -R dimitri:dimitri /home/dimitri
Run Code Online (Sandbox Code Playgroud)

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

  • 强烈建议不要为了传递方便而将所有系统文件的所有权更改给用户。它允许您可能遇到的任何用户空间错误严重危及系统的安全性。最好由 SCP 更改您需要更改或更新的文件的所有权,但让 root 拥有其他所有内容(就像它应该的那样)。也就是说,`chown` 中的 `-R` 告诉它改变该目录的所有权,以及递归的所有子文件和目录......所以你可以做任何你喜欢的事情。 (4认同)

小智 6

如果您使用 OpenSSH 工具而不是 PuTTY,则可以通过scp在服务器上使用sudo. 确保您sshd的本地机器上有一个守护进程正在运行。有了ssh -R你可以给服务器的方式来联系你的机器。

在您的机器上:

ssh -R 11111:localhost:22 REMOTE_USERNAME@SERVERNAME
Run Code Online (Sandbox Code Playgroud)

除了让您登录到服务器之外,这会将在服务器端口 11111 上建立的每个连接转发到您机器的端口 22:您sshd正在侦听的端口。

在服务器上,像这样开始文件传输:

cd /var/www/
sudo scp -P 11111 -r LOCAL_USERNAME@localhost:FOLDERNAME .
Run Code Online (Sandbox Code Playgroud)