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


13

我想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'

称其为单线似乎有点困难。我想我会将其分解为安装指南中的单独步骤。


Answers:


11

用ssh链接ssh比使用sudo链接ssh更容易。因此,更改ssh服务器配置是可以的,我建议为每个服务器的根目录打开ssh,但只能从本地主机打开。您可以使用中的Match子句来做到这一点sshd_config

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes

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

要以根用户身份连接到服务器,请按以下方式定义别名~/.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,否则您不会问这个。


第一个解决方案对我来说效果很好,但第二行应该是Match host localhost
cduck

4

您可以设置sudo不询问密码的另一种方式:

来源:

user    ALL=NOPASSWD:/bin/cat

估计的正好:

user    ALL=NOPASSWD:/usr/bin/tee

并在您的机器上做:

ssh source 'sudo cat /test' | ssh target 'sudo tee /test'

但是我建议使用类似puppet的东西。它更好,更轻松地解决了配置文件分发问题。

PS。顺便说一下,如果您要设置sudo向用户询问密码,则带有的字符串[sudo] password for user将出现在目标文件中。


+1表示人偶,但您的解决方案似乎不安全。我也可以允许以root用户身份登录。
itsadok 2011年

2

您可以使用scp在服务器之间传输文件,而不必使用ssh。

登录到目标服务器:

更改为要复制文件的目标目录。

#scp -r -p -P 22 root@source-ipaddress:/source-path-file-to-copy .

r-递归p-保留原始文件的修改时间,访问时间和模式


假设我可以以root用户身份登录,但不能。更新问题。
itsadok 2011年

2

在不更改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和localhost上的意思是$ {target}计算机上的localhost。

ssh -p 60000 '$(whoami)'@localhost

5-打包远程文件并将其压缩后发送到stdout

cd /path/to/dir; tar -czf - file

6-通过stdout接收软件包并相应地将文件提取到/ path / to / target目录中

|tar -C/path/to/target -xzf -

注意:您可能最多收到3个sshkey确认和3个密码请求。但是文件将被复制。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.