我正在编写一个脚本,需要将一些文件从本地计算机复制到远程服务器上的目录。我遇到的问题是目录 (/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 服务器)。
可能最接近您最初尝试的解决方案如下:
准备一个脚本(我们称之为
/tmp/password
),其内容如下:#!/bin/sh echo password
远程服务器上
password
用户的实际密码在哪里。foo
chmod 700 /tmp/password
这样该文件是可执行的,除所有者之外没有人可以访问它将文件(保留权限)复制到远程服务器
scp -p /tmp/password foo@myserver:/tmp
使用以下命令:
cat myscript.sh | ssh foo@myserver "SUDO_ASKPASS=/tmp/password sudo -A tee -a /etc/init.d/myscript.sh"