![在服务器之间一行复制受保护的文件?](https://linux22.com/image/19912/%E5%9C%A8%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B9%8B%E9%97%B4%E4%B8%80%E8%A1%8C%E5%A4%8D%E5%88%B6%E5%8F%97%E4%BF%9D%E6%8A%A4%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我想squid.conf
从一台服务器复制到另一台服务器。
- 服务器之间不互相通信。我想检查一下我的工作站。
- 两个服务器都有该文件,因此它将在目标上被覆盖。
- 这些文件具有
600
权限并且归 root 所有。 - 通过 ssh 的 root 登录已禁用 (
PermitRootLogin no
)。 - 如果可能的话,我想在一行中完成它,因为它将成为设置指南的一部分。
我知道要做
ssh source 'tar czpf - -C /etc/squid/ squid.conf' | \
ssh target 'tar xzpf - -C /etc/squid/'
在服务器之间复制文件并保留权限。但是,在这种情况下,我会收到“权限被拒绝”。
我也知道我可以这样做:
ssh -t source 'sudo cat /etc/squid/squid.conf'
这样就-t
允许 sudo 在输出文件内容之前询问管理员密码。
问题是,我不知道如何将这些技术结合起来,在每台服务器上要求输入 sudo 密码,并将文件传输到目的地。这可能吗?
更新: 这是我能想到的最好的:
ssh -t source 'sudo tar czf /tmp/squid.tgz -C /etc/squid squid.conf' && \
ssh source 'cat /tmp/squid.tgz' | \
ssh target 'cat >/tmp/squid.tgz' && \
ssh -t source 'sudo rm /tmp/squid.tgz' && \
ssh -t target \
'sudo tar xzf /tmp/squid.tgz -C /etc/squid && sudo rm /tmp/squid.tgz'
称其为一句台词似乎有些牵强。我想我会在设置指南中将其分解为单独的步骤。
答案1
使用 ssh 链接 ssh 比使用 sudo 链接 ssh 更容易。因此,更改 ssh 服务器配置是可以的,我建议为每个服务器的根目录打开 ssh,但只能从本地主机打开。您可以使用以下Match
子句来做到这一点sshd_config
:
PermitRootLogin no
Match Host localhost
PermitRootLogin yes
然后,您可以设置从远程用户到本地用户以及从本地用户到 root 的基于密钥的身份验证链。您仍然有身份验证跟踪,因此您的日志会告诉您谁以 root 身份登录,并且身份验证步骤与涉及 sudo 时相同。
要以 root 身份连接到服务器,请定义一个别名,~/.ssh/config
如下所示:
Host server-root
HostName server.example.com
User root
ProxyCommand "ssh server.example.com nc %h %p"
如果您坚持使用sudo
,我相信您将需要单独的命令,因为sudo
坚持从终端读取(即使它有您帐户的票证),并且没有常用的文件复制方法(scp、sftp、rsync)支持与远程终端交互。
坚持使用 ssh 和 sudo,您建议的命令可以得到简化。在每一侧,如果您将 sudo 设置为不再询问密码,则可以运行一次来完成密码要求,然后再运行一次来复制文件。 (您无法轻松地直接复制文件,因为密码提示会妨碍您。)
ssh -t source 'sudo true'
ssh -t target 'sudo true'
ssh -t source 'sudo cat squid.conf' |
ssh -t target 'sudo tee /etc/squid/squid.conf'
¹除非你有NOPASSWD
,但那样你就不会问这个了。
答案2
sudo
接下来您可以设置不询问密码:
来源:
user ALL=NOPASSWD:/bin/cat
估计的正好:
user ALL=NOPASSWD:/usr/bin/tee
并在你的机器上执行以下操作:
ssh source 'sudo cat /test' | ssh target 'sudo tee /test'
但我建议使用类似的东西木偶。它可以更好、更轻松地解决您的配置文件分发问题。
附言。顺便说一句,如果您设置sudo
向用户询问密码,则 的字符串[sudo] password for user
将出现在目标文件中。
答案3
您可以使用 scp 在服务器之间传输文件,而不是使用 ssh。
登录目标服务器:
更改为要复制文件的目标目录。
#scp -r -p -P 22 root@source-ipaddress:/source-path-file-to-copy .
r - 递归 p - 保留原始文件的修改时间、访问时间和模式
答案4
在不更改 ssh 配置的情况下,您可以通过到 server2 的 ssh 连接创建两个 ssh 隧道 host->server1 和 server2->host。在主机上连接这两个隧道(同一端口)。并在 server2 上运行 sudo 以从 server1 上连接的隧道检索数据并将其保存在 server2 上。
ssh -L60000:${source}:22 -R60000:localhost:60000 -t ${target} 'sudo bash -c "ssh -p 60000 '$(whoami)'@localhost \"cd /path/to/dir; tar -czf - files\"|tar -C/path/to/target -xzf -"'
这个想法是: 1- 在端口 60000 上创建从您的计算机到源计算机的本地隧道
ssh -L60000:${source}:22
1b- 创建远程隧道以返回您的计算机
-R60000:localhost:60000
2-连接到目标机器
-t ${target}
3-在目标机器上以 root 身份运行所有内容以进行写入
'sudo bash -c "..."'
4-通过隧道连接到源机器。 whoami 和 on localhost 表示 ${target} 机器上的本地主机。
ssh -p 60000 '$(whoami)'@localhost
5-打包远程文件并将其压缩发送到标准输出
cd /path/to/dir; tar -czf - file
6-通过stdout接收包并在/path/to/target目录中相应地提取文件
|tar -C/path/to/target -xzf -
注意:您可能会收到最多 3 次 sshkey 确认和 3 次密码请求。但文件将被复制过来。