我在服务器 A 上有一个文件(位于 NAT 后面,因此无法直接寻址)。需要将该文件复制到服务器 B 中,并将其放在仅限 root 使用的目录中。我在服务器 B 上有一个具有 sudo 权限的帐户。scp 命令的语法是什么?
答案1
首先,你需要将文件复制到你无需 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
答案2
使用 SCP,您必须分两步完成,但是,您可以使用 rsync 一步完成,如下所示:
rsync --rsync-path="sudo rsync" <LOCALFILE> USER@SERVER2:/root
注意:这确实需要NOPASSWD
sudo 配置。如果您必须输入 sudo 密码,则需要两步操作。
要复制目录,您需要添加-r
参数。并-v
进行详细输出。
要使用上述方法和凭证,您需要将其添加到您的~/.ssh/config
文件中,例如
Host SERVER2
HostName server2.example.colm
User USER
#IdentityFile ~/.ssh/custom_key.pem
答案3
您可以使用 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”选项。
答案4
如果每次使用 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