使用 sudo scp 到远程服务器

Nei*_*eil 103 security sudo command-line scp

我在服务器 A 上有一个文件(它位于 NAT 后面,因此不能直接寻址)。该文件需要复制到服务器 B 中限制为 root 的目录中。我在服务器 B 上有一个具有 sudo 权限的帐户。scp 命令的语法是什么?

Joh*_*han 86

首先,您需要将文件复制到您可以在没有 sudo 的情况下进行写访问的地方,

scp yourfile serverb:
Run Code Online (Sandbox Code Playgroud)

然后使用 sudo 移动文件

ssh serverb sudo mv yourfile /path/to/the/destination
Run Code Online (Sandbox Code Playgroud)

如果您没有可写的地方,请为您的用户创建一个具有写权限的临时目录。

ssh serverb sudo mkdir tempdir && sudo chmod 777 tempdir
scp yourfile serverb:tempdir
ssh serverb mv tempdir/yourfile /path/to/the/destination
Run Code Online (Sandbox Code Playgroud)

  • /tmp 是写入(通常)所有用户都可以访问的临时文件的好地方。 (9认同)
  • 无论你想完成什么,`chmod 777` 通常都是错误的做法。考虑一下如果其他人已登录并知道您将要运行此代码会发生什么。 (7认同)
  • @Doug:请注意, /tmp 可能位于 RAM 或 / 挂载点中,并且不一定大到足以承载大文件。 (4认同)
  • @RossPresser 很抱歉回答晚了,但是您要么需要在“serverb”上设置无密码 sudo,要么需要单独“ssh serverb”,然后在登录后运行“sudo ...”。 (2认同)

小智 82

使用 SCP,您必须分两步完成,但是,您可以使用 rsync 合而为一,如下所示:

rsync --rsync-path="sudo rsync" <LOCALFILE> USER@SERVER2:/root
Run Code Online (Sandbox Code Playgroud)

注意:这确实需要NOPASSWDsudo 配置。如果必须输入 sudo 的密码,则需要两步方式。

要复制目录,您需要添加-r参数。而-v对于详细的输出。


要将上述方法与凭据一起使用,您需要将它们添加到您的~/.ssh/config文件中,例如

Host SERVER2
  HostName server2.example.colm
  User USER
  #IdentityFile ~/.ssh/custom_key.pem
Run Code Online (Sandbox Code Playgroud)

  • 这是迄今为止最简单的方法。 (7认同)
  • @mj41 使用 `-e "ssh -tt"`,我得到 `protocol version mismatch -- 你的 shell 干净吗?`。关于如何解决这个问题的任何提示? (4认同)

blu*_*yed 20

您可以使用 ssh 和 tar 来解决此问题:

ssh -t host 'sudo -v'
ssh -C host 'cd /; sudo tar cf - path/to/file/or/dir' | tar xpsf - --preserve
Run Code Online (Sandbox Code Playgroud)

这首先更新您的 sudo 时间戳(必要时要求输入密码,这需要 tty ( ssh -t)),然后使用 sudo 远程创建一个 tarball 并在本地提取它。

RedHat 5 上的“tar”需要在“xpsf -”命令之后加上“--preserve”选项。


小智 5

您可以将 sftp 与 sudo 命令一起使用,例如:

sftp -s 'sudo -u REMOTE_SUDO_USER /usr/libexec/openssh/sftp-server' REMOTE_USER@HOST
Run Code Online (Sandbox Code Playgroud)