使用sudo将scp传输到远程服务器


63

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



我已经关闭了较早的问题,作为该问题的重复项,因为提问者从来没有重新获得该问题的所有权。
奎克吉x德

我在另一个帖子中回答了如何直接自定义scp做sudo。这类似于WinSCP所做的。
YoYo

Answers:


56

首先,您需要将文件复制到没有sudo且具有写访问权限的位置,

scp yourfile serverb:

然后使用sudo移动文件

ssh serverb sudo mv yourfile /path/to/the/destination

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

ssh serverb sudo mkdir tempdir && sudo chmod 777 tempdir
scp yourfile serverb:tempdir
ssh serverb mv tempdir/yourfile /path/to/the/destination

7
/ tmp是编写(通常)所有用户都可以访问的临时文件的好地方。
道格·哈里斯

3
@Doug:请注意,/ tmp可能位于RAM或安装点中,并且不一定足够大以承载大文件。
Ravachol

2
无论您要完成什么,chmod 777通常都是错误的方法。考虑如果其他人登录并知道您将要运行此代码,该怎么办。
Tripleee 2014年

1
ssh sudo对我不起作用-抱怨“没有tty存在并且未指定askpass程序”?
Ross Presser

46

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

rsync --rsync-path="sudo rsync" <LOCALFILE> USER@SERVER2:/root

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

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


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

Host SERVER2
  HostName server2.example.colm
  User USER
  #IdentityFile ~/.ssh/custom_key.pem

5
到目前为止,这是最简单的方法。
马特·怀特

错误sudo: sorry, you must have a tty to run sudo已由修复 -e "ssh -tt"
mj41

@ mj41有了-e "ssh -tt",我得到了protocol version mismatch -- is your shell clean?。关于如何解决该问题的任何提示?
斧头。

19

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

ssh -t host 'sudo -v'
ssh -C host 'cd /; sudo tar cf - path/to/file/or/dir' | tar xpsf - --preserve

这首先会更新您的sudo时间戳(如果需要,请输入密码,需要输入tty(ssh -t)),然后使用sudo远程创建tarball并在本地将其解压缩。

RedHat 5上的“ tar”要求在“ xpsf-”命令之后使用“ --preserve”选项。


请注意:如果得到tar: Invalid replacement string,则将其移除-s似乎可以解决问题(s无论如何都不确定您需要什么)。非常感谢; 这太棒了。
RecursivelyIronic

这将需要tty_tickets被禁用,对吗?
雅各布(Jacob Budin)

@JacobBudin是的。
2016年

4

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

sftp -s 'sudo -u REMOTE_SUDO_USER /usr/libexec/openssh/sftp-server' REMOTE_USER@HOST

此方法和rsync方法可能是一步中最直接的方法。不幸的是,ant中的scp任务不支持它。您可以将其设置为使用sftp,但不能修改远程子程序。请注意,根据服务器的类型,子程序会有所不同(solaris可能会有所不同)。
悠悠球

0

如果您需要每次输入sudo的密码,可以将其保存到文件中:

echo "Enter password: "; read -s password; echo $password > password_file

然后将其与源文件一起发送。

cat password_file source_file | ssh remote_host 'sudo -S sponge target_file'

如果没有moreutils,可以使用tee代替sponge


0

首先,您需要将文件复制到没有sudo且具有写访问权限的位置,可以执行以下两个步骤。

第1步: scp filename newserver

第2步: ssh newserver sudo mv filename /path/to/the/destination

有关更多信息,请阅读scp教程


-1
current server $ sudo scp username@server:source/path/filename /tmp/

它将特定文件从源复制到当前服务器中的/ tmp /


它将在本地执行sudo,不会给您远程任何提升的特权。
YoYo

正如@Yoyo所说,这根本行不通。
玛尼

SCP可能不会连接,因为它将读取root的密钥
Pierre-Olivier Vares,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.