微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 sudo 运行脚本以执行 ssh 命令并查询 Mysql 数据库失败

如何解决使用 sudo 运行脚本以执行 ssh 命令并查询 Mysql 数据库失败

我的 bash 脚本中有多个 sudo 命令。所以我更喜欢将脚本运行为 sudo ./script.sh
但是,如果我以 sudo 身份运行脚本,那么我在远程服务器上通过 ssh 执行某些 db 命令的以下查询将失败(我的猜测是因为它需要以 root 身份运行)

我试图从下面的命令中删除 sudo 并将脚本作为 sudo 运行 - 这也失败了。它的唯一工作方式是明确地使用 sudo 命令并将脚本运行为 ./script.sh

status=$(ssh -o "UserKNownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" $connect_host 'sudo connect_string MysqL -S /var/MysqL/state/MysqL.sock -uroot mydb -BN -e "update table1 set column1='\'NULL\'' where column2='\'$myvar\''"')

有没有其他方法可以做到这一点?

  • 案例 1

当我以 sudo 身份运行脚本时,使用 sudo 的特定查询如下

sudo ./script.sh

status=$(ssh -o "UserKNownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" $connect_host 'sudo connect_string MysqL -S /var/MysqL/state/MysqL.sock -uroot mydb -BN -e "update table1 set column1='\'NULL\'' where column2='\'$myvar\''"')
 

错误

Warning: Permanently added '10.0.0.1' () to the list of kNown hosts.
Permission denied (publickey).
  • 案例 2

当我以 sudo 身份运行脚本时,没有 sudo 的特定查询如下

sudo ./script.sh

status=$(ssh -o "UserKNownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" $connect_host 'connect_string MysqL -S /var/MysqL/state/MysqL.sock -uroot mydb -BN -e "update table1 set column1='\'NULL\'' where column2='\'$myvar\''"')
 

错误

Warning: Permanently added '10.0.0.1' () to the list of kNown hosts.
Permission denied (publickey).
 
  • 案例 3

当我运行脚本 没有 sudo 和特定查询 with sudo 和脚本中明确提到 sudo 的所有查询如下

./script.sh

status=$(ssh -o "UserKNownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" $connect_host 'sudo connect_string MysqL -S /var/MysqL/state/MysqL.sock -uroot mydb -BN -e "update table1 set column1='\'NULL\'' where column2='\'$myvar\''"')
 

完美运行

解决方法

案例 1 和案例 2 中的问题源于通过 sudo 调用脚本。根据 sudoman page,运行 sudo ./myscript.sh 将在本地机器上作为 root 执行整个脚本。

ssh 命令默认为当前用户,由于 root 调用,现在为 sudo 用户,并且您没有足够的身份验证直接作为 {{1} } 在外部机器上。

root 身份运行脚本不会修改在外部机器上运行的 SQL 命令,因此您需要在 SQL 查询之前明确包含 root

您有两个选择:

  1. 在脚本中需要它的每个命令中明确使用 sudo。这是首选,因为这样可以最大限度地减少以 sudo 用户身份运行的命令数。
  2. 继续通过 root 调用脚本,但在 sudo 命令中指定您的常规用法。这可以通过 ssh 选项 (-l) 或 ssh -l myuser $connect_host 语法2 来实现。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。