我遇到过一种情况,我必须创建一个实用的 shell 脚本,该脚本将在来自不同区域的许多服务器中执行。目的是转储本地 mysql 数据库,将其复制到另一台服务器并将 mysql 导出到远程服务器的数据库。
该脚本将为此目的读取用户的输入。
问题是我必须避免打开超过一同一服务器的 SSH 连接,换句话说,脚本不应多次询问 SSH 密码,而我想到的解决方案最终会要求至少两次。
我也有一些限制:我无法更改 ssh控制大师并且服务器不能有sshpass安装。另外,有些服务器不是我们自己的,我无法为所有服务器添加密钥,因为要求我的脚本应该是一种独立的方法,无需在任何外部服务器中进行进一步的更改。
我遵循的步骤如下:
- 我使用 mysqldump 导出数据库。
- 然后我SCP将 .sql 文件传输到目标计算机。
- 我使用 mysql 导入例程生成一个新的 .sh 文件。
- 然后打开一个到目标服务器的新 ssh 连接,我在其中传递 .sh 文件并执行它。
- 我清理了 sql 文件和临时 sh 文件。
有谁知道执行此例程的更好方法,它可以让我仅使用一个会话来完成所有这些工作?
答案1
由于似乎限制更多地集中在用户体验方面(不必一次又一次输入密码),因此这里最好的选择是在目标文件中输入您的公钥(文件夹.pub
中的文件) 。~/.ssh
~/.ssh/authorized_keys
这里的~
文件夹代表源计算机和目标计算机上相应的用户的主页。
如果userA@machine1
在 上获得授权,则(并且只有这样)打开到 的 SSH 连接userB@machine2
时不需要密码。授权纯粹通过非对称加密完成(只有授权用户应该拥有自己的私钥),这就是为什么不需要密码。userA@machine1
userB@machine2
这样,scp
和ssh
命令仍将是 2 个连接(但始终一次只有一个连接,而不是同时连接!),但两者都将完全无密码。
如果您无权访问服务器,则必须要求那里的管理员添加您的公钥文件。所有涉及的机器只需要您的单个公钥文件。
实际上,我自己运行了一个 cronjob,它几乎执行完全相同的任务(ssh
触发转储,然后scp
进行复制,即使使用 MySQL 数据库也是如此),有趣的巧合。 ;)