单个命令中的多个 ssh 会话

Dre*_*rew 5 command-line shell ssh mysql

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

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

我设法通过在我的计算机上暂时保存转储来进行传输,只是想知道是否有办法让它工作。

Gil*_*il' 5

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

ssh root@server1 mysqldump --databases db | ssh root@server2 mysql
Run Code Online (Sandbox Code Playgroud)

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

ssh root@server1 'mysqldump --databases db | ssh root@server2 mysql'
Run Code Online (Sandbox Code Playgroud)

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

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

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r
Run Code Online (Sandbox Code Playgroud)

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

ssh -N -M root@server1 &
ssh -N -M root@server2 &
Run Code Online (Sandbox Code Playgroud)

然后复制:

ssh root@server1 mysqldump --databases db | ssh root@server2 mysql
Run Code Online (Sandbox Code Playgroud)

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

ssh -O exit root@server1
ssh -O exit root@server2
Run Code Online (Sandbox Code Playgroud)


J. *_*ker 4

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

ssh root@server1 'mysqldump --databases db | ssh root@server2 mysql'
Run Code Online (Sandbox Code Playgroud)

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

ssh root@server1 'mysqldump db' | ssh root@server2 'mysql db'
Run Code Online (Sandbox Code Playgroud)

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

ssh root@server1 'mysqldump db | gzip -f' | ssh root@server2 'gzip -d | mysql db'
Run Code Online (Sandbox Code Playgroud)

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

  • 您将*总是*每次*被要求输入密码,直到您设置 ssh 代理转发 + ssh 密钥。编辑服务器 sshd.conf,确保该选项设置正确“AllowAgentForwarding yes”。您还需要启用 ssh 客户端的转发,可以使用 ssh -A 或从 ssh.conf 来完成。 (3认同)