单个命令中的多个 ssh 会话

单个命令中的多个 ssh 会话

我正在尝试将数据库从一台服务器复制到另一台服务器。我尝试使用以下命令,但它与输入 ssh 密码有关。如果我输入一台服务器的密码,它会抱怨另一台服务器,反之亦然。

ssh root@server1 mysqldump --databases db | ssh root@server2 mysql

我设法通过将转储暂时保存在计算机上来完成传输,只是想知道是否有办法让它发挥作用。

答案1

密码提示很麻烦。使 ssh 更可用的方法是使用密钥进行身份验证,并运行密钥代理 ( ssh-agent),您可以在每个会话中注册一次密钥(具有可选的超时)。然后就可以直接运行

ssh root@server1 mysqldump --databases db | ssh root@server2 mysql

如果您可以从server1登录到server2,则应该直接在两台服务器之间传输数据。

ssh root@server1 'mysqldump --databases db | ssh root@server2 mysql'

(或者如果您可以从 server2 登录到 server1,则相反)。同样,拥有用于身份验证的 SSH 密钥。在本地计算机上,注册一个可让您访问 server1 的 SSH 私钥和一个可让您访问 server2 的 SSH 私钥;确保代理转发已启用(AgentForwarding yes在 中~/.ssh/config)。

如果您确实无法避免输入密码,最好的办法是先建立连接,然后再传输数据。使用足够新的 OpenSSH 版本,您可以打开主连接,然后通过它路由从连接。从属连接不需要额外的身份验证。在你的~/.ssh/config

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

启动到两台服务器的主连接:

ssh -N -M root@server1 &
ssh -N -M root@server2 &

然后进行复制:

ssh root@server1 mysqldump --databases db | ssh root@server2 mysql

此后,如果不再需要主连接,您可以终止它们。

ssh -O exit root@server1
ssh -O exit root@server2

答案2

最有效的方法是从mysqldump服务器进行管道传输。有点像这个命令列表......

ssh root@server1 'mysqldump --databases db | ssh root@server2 mysql'

如果您无法从远程计算机进行管道传输,由于某些配置相关的原因,您可以执行此命令列表...

ssh root@server1 'mysqldump db' | ssh root@server2 'mysql db'

如果我是被迫为了做到后者,我会考虑对mysqldump.我相信这节省了我一些转移时间,尽管这不应该是第一选择。

ssh root@server1 'mysqldump db | gzip -f' | ssh root@server2 'gzip -d | mysql db'

最后一个例子可能不是 100% 正确,我只是假设它应该有效。

答案3

如果您被迫从A对于类似代理的机器,没有灵丹妙药:您必须使用代理,作为您的计算机或中间服务器。

这可能很烦人,但 ssh 非常灵活,可以变得透明。如果您nc在代理上安装程序,则可以将其添加到您~/.ssh/configA:

Host B
  ProxyCommand ssh -q my_proxy nc -q0 B 22

之后,您将能够从A,使经典的 ssh/scp 命令就像根本没有代理一样。

因此,通过此配置,您将能够使用sshfs

sshfs B: /mnt/B_fs

使用 sshfs,您的转储命令最终可以如下所示:

 mysqldump --databases db ... > /mnt/B_fs/db.dump

遗憾的是,它不会加速代理的带宽。使用 ssh 可以做的最好的事情就是启用Compression并引发CompressionLevel

这个帖子有关 ssh 多跳的更详细说明。

答案4

所说的关键解决方案是最好的选择。但是,如果您出于任何原因无法做到这一点,您可以将命令行修改为

ssh root@server1 mysqldump --databases db | {sleep 5; ssh root@server2 mysql; }

为了让第二个命令等待。5根据您输入第一个密码的速度来调整。

请注意,这只是一个后备解决方案,关键解决方案要好得多。

相关内容