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

its*_*dok 13 ssh sudo file-transfer

我想squid.conf从一台服务器复制到另一台服务器。

  • 服务器不互相交谈。我想通过我的工作站。
  • 两台服务器都有该文件,因此它将在目标上被覆盖。
  • 这些文件有600权限并且归 root 所有。
  • 通过 ssh 的 root 登录被禁用 ( PermitRootLogin no)。
  • 如果可能的话,我想在一行中完成,因为它将成为设置指南的一部分。

我知道要做

ssh source 'tar czpf - -C /etc/squid/ squid.conf' | \
    ssh target 'tar xzpf - -C /etc/squid/'
Run Code Online (Sandbox Code Playgroud)

在服务器之间复制文件并保留权限。但是,在这种情况下,我将收到“权限被拒绝”。

我也知道我可以这样做:

ssh -t source 'sudo cat /etc/squid/squid.conf'
Run Code Online (Sandbox Code Playgroud)

这种方式-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'
Run Code Online (Sandbox Code Playgroud)

称其为单线似乎有点牵强。我想我会把它分解成设置指南中的单独步骤。

Gil*_*il' 12

使用 ssh 链接 ssh 比使用 sudo 链接 ssh 更容易。所以更改 ssh 服务器配置是可以的,我建议为每个服务器的 root 打开 ssh,但只能从本地主机。您可以使用Matchin 中的子句执行此操作sshd_config

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes
Run Code Online (Sandbox Code Playgroud)

然后,您可以设置从远程用户到本地用户以及从本地用户到 root 的基于密钥的身份验证链。您仍然有一个身份验证跟踪,因此您的日志会告诉您谁以 root 身份登录,并且身份验证步骤与涉及 sudo 时相同。

要以 root 身份连接到服务器,请定义一个别名,~/.ssh/config如下所示:

Host server-root
HostName server.example.com
User root
ProxyCommand "ssh server.example.com nc %h %p"
Run Code Online (Sandbox Code Playgroud)

如果您坚持使用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'
Run Code Online (Sandbox Code Playgroud)

¹除非你有NOPASSWD,但你不会问这个。