在服务器之间一行复制受保护的文件?

在服务器之间一行复制受保护的文件?

我想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 次密码请求。但文件将被复制过来。

相关内容