【问题标题】:sudo'd mysqldump over ssh syntax?sudo'd mysqldump over ssh 语法?
【发布时间】:2023-03-03 23:30:01
【问题描述】:

我想要一个命令:

  • ssh 以用户 foo 的身份进入我的服务器,使用我设置的公钥
  • 使用 /etc/mysql/debian.cnf 默认文件执行某个数据库的 mysqldump
  • 到标准输出,所以我可以在本地管道它
  • 远程在服务器上执行 sudo 时,因为不允许用户 foo 读取 /etc/mysql/debian.cnf。 foo 允许 sudo bash 但不允许 sudo mysqldump。

这是我想出的最好的:

echo 'mysqldump --defaults-file=/etc/mysql/debian.cnf dbname' | ssh -t -i keys/id_rsa -l foo example.com sudo bash -s

这个丑陋的野兽工作,但产生:Pseudo-terminal will not be allocated because stdin is not a terminal.,我真的不喜欢回声。一定有更好的办法吗?

【问题讨论】:

    标签: bash ssh mysqldump sudo


    【解决方案1】:

    ssh -i keys/id_rsa foo@example.com sudo bash -c "'mysqldump --defaults-file=/etc/mysql/debian.cnf dbname'"

    这只有在 sudo 不需要询问密码时才有效。如果是这样,你需要-t 选项来 ssh。

    注意双引号和单引号。外部引号将被您的本地 shell 删除,整个 'mysqldump --defaults-file=/etc/mysql/debian.cnf dbname' 字符串将作为单个参数传递给 ssh。 SSH 会将其传递给远程 sudo,因此您的远程将看到单引号。远程 bash 需要单引号将 -c 之后的部分解释为单个参数。

    【讨论】:

    • 你能解释一下quotes-inside-quotes吗?外面的大概是把一个字符串传给了 ssh,但是里面的呢?
    • (添加解释回答)外部引号将被您的本地 shell 带走,整个 'mysqldump --defaults-file=/etc/mysql/debian.cnf dbname' 字符串将作为单个参数传递给 ssh。 SSH 会将其传递给远程 sudo,因此您的远程将看到单引号。远程 bash 需要单引号将 -c 之后的部分解释为单个参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2012-03-08
    相关资源
    最近更新 更多