以一个用户身份通过​​ SSH 连接到服务器,切换到 root 并创建 mysql 转储 - 如何编写脚本

以一个用户身份通过​​ SSH 连接到服务器,切换到 root 并创建 mysql 转储 - 如何编写脚本

我希望能够将 mysqdump 从远程服务器复制到本地机器。

我有一个脚本可以做到这一点,但我们的操作人员现在已经更改了服务器权限,它不起作用。

因此,在我能够从我的机器以 root 身份登录 SSH 并提供密码并连接到 mysql 之前,我在 Perl 脚本中有一个命令,如下所示:

sshpass -p root_password ssh root@$servername  mysqldump $database_name > $mysqldump_location

无论如何,权限已经改变,我无法使用 root 从本地机器登录。

现在我需要

  • 使用部署用户登录远程服务器。
  • 登录后,我需要使用 su - 来获取 root 用户
  • 现在我可以执行 mysqldump 命令(部署用户收到拒绝访问消息)

我想要一个可以从我的本地机器执行的脚本或命令,并让其执行以下步骤 - 以部署身份登录,切换到 root ,创建 mysql 转储并将其复制到我的本地机器。

最好的解决方法是什么?使用 SSH 隧道是否可行?或者脚本选项是否更好(如何编写多个登录脚本)?

答案1

你可能最好使用 ansible 来实现这一点: https://docs.ansible.com/ansible/2.5/modules/mysql_db_module.html

...它将负责 sudo 以及转储如何完成。

例如,mysqldump.yml 剧本包含:

- hosts: all
  gather_facts: false
  serial: 1
- name: Dump all databases to hostname.sql
  mysql_db:
    state: dump
    name: all
    target: /tmp/{{ inventory_hostname }}.sql

...然后定位你的 mysql 框,像这样 sudo'ing (-kK):

$ ansible-playbook -i ${servername}, mysqldump.yml -kK -v
SSH password: <your non-root password on target>
SUDO password[defaults to SSH password]: <usually hit return>

答案2

您不需要成为 Linux 操作系统上的 root 用户就可以以 root 身份运行 MySQL 命令,您只需从您的个人 Linux 帐户登录到 MySQL root 帐户,只需将 root 用户名和 root 密码添加到您的脚本中即可(并且可能更改您写入数据库转储的文件系统位置)。

甚至更好的是为 MySQL 备份创建一个专用用户,这样您就不需要过多的 DBA 权限来进行简单的备份。

CREATE USER 'backup'@'localhost' IDENTIFIED BY 's3cr3t-p@ssw0rd';

可以与 INNODB 表一起使用的 mysqldump --single-transaction 需要以下权限:

GRANT SELECT, SHOW VIEW, RELOAD, REPLICATION CLIENT, EVENT, TRIGGER ON *.* TO 'backup'@'localhost';

MyISAMB 表的 mysqldump --lock-all-tables 还需要 LOCK TABLES 角色:

GRANT LOCK TABLES ON *.* TO 'backup'@'localhost';

答案3

如果可以的话,您可以使用 RSA 密钥直接登录到 root 帐户。

要允许使用 RSA 密钥直接登录 root:

  • 编辑文件/etc/sshd/sshd_config并设置允许无密码登录(如果您使用允许用户,也把根放在那里)
  • 重新启动 SSH:服务 sshd 重启(可能是服务 ssh 重启,一次重启,视情况而定)

之后,生成你的 RSA 密钥(本地机器)并将其放入授权密钥(远程服务器):

  • 在本地机器上,运行ssh-keygen然后系统会提示你把文件放在哪里、设置密码等;只需按回车键即可完成
  • 复制内容id_rsa.pub里面/根/.ssh(或者 /home/你的用户/.ssh如果不是root)
  • 转到远程服务器并生根
  • 编辑文件/root/.ssh/authorized_keys(若不存在则创建)
  • 将密钥粘贴到文件末尾并保存
  • 返回您的机器并尝试直接登录root@remoteserver。

相关内容