将文件复制到远程服务器上的受保护目录

将文件复制到远程服务器上的受保护目录

我正在编写一个脚本,需要将一些文件从本地计算机复制到远程服务器上的目录。我遇到的问题是目录 (/etc/init.d) 归 root 所有,因此如果我尝试将文件复制到该目录中,就会出现权限异常。这意味着如果不以 root 身份登录,我就无法使用 scp。

到目前为止我发现的最接近的解决方案是这个答案:https://askubuntu.com/a/872537/798391。不幸的是,给出的答案不太管用,评论中给出的建议似乎都无法解决这个问题。如果我运行

cat myscript.sh | ssh foo@myserver "sudo tee -a /etc/init.d/myscript.sh"

我得到了错误

sudo:没有 tty 存在并且没有指定 askpass 程序

其中一条评论建议在 ssh 命令中添加 -t

cat myscript.sh | ssh -t foo@myserver "sudo tee -a /etc/init.d/myscript.sh"

但导致了错误

不会分配伪终端,因为 stdin 不是终端。

另一个建议的选项是使用 sudo 的 -S 参数

cat myscript.sh | ssh foo@myserver "sudo -S tee -a /etc/init.d/myscript.sh"

它至少会提示输入密码,但是在完全输入密码之前它会超时并再次询问。

到现在为止,我已经没有主意了。有什么方法可以让这个命令工作吗?有没有更好的替代解决方案可以将文件复制到受保护的远程位置?

答案1

有多种方法可以实现您想要的目标,这取决于两台机器的详细配置。

最简单的方法是(如果可能的话)配置基于密钥的 ssh 身份验证,以便本地用户可以以 root 身份通过 ssh 连接到远程机器。

另一种方法是使用预计编写一个脚本,通过 ssh 以交互方式登录到远程计算机,执行sudo -i(并输入适当的密码),然后以相反的方向复制文件scp(即scp在远程服务器上向本地计算机执行 - 它必须有一个活动的 ssh 服务器)。

可能最接近您最初尝试的解决方案如下:

  1. 准备一个脚本(我们称之为/tmp/password),其内容如下:

     #!/bin/sh
     echo password
    

    远程服务器上password用户的实际密码在哪里。foo

  2. chmod 700 /tmp/password这样该文件是可执行的,除所有者之外没有人可以访问它

  3. 将文件(保留权限)复制到远程服务器scp -p /tmp/password foo@myserver:/tmp

  4. 使用以下命令:

     cat myscript.sh | ssh foo@myserver "SUDO_ASKPASS=/tmp/password sudo -A tee -a /etc/init.d/myscript.sh"
    

相关内容