我有一个简单的脚本,用于为几个开发人员同步测试环境。它不需要比仅仅获取 mysql 转储、通过 SSH 检查哈希值更复杂,然后如果发生更改,将转储移动到新环境并取消转储它。
我已经重写了它以掩盖敏感信息,但这是我到目前为止所写的脚本的要点:
#!/bin/bash
mysqldump -h localhost testDB > dbPath/testdb.sql
hash1=$(md5sum dbPath/testdb.sql) | awk '{print $1}'
echo $hash1
执行脚本时:
sudo ./testScript.sh
我看到使用 -rw-r--r-- 1 root root 权限创建的 mysqldump 对我来说似乎是正确的,但是,随着脚本继续到 md5 哈希,我得到以下信息:
./testScript.sh: line 5: dbPath/testdb.sql: Permission denied
当我从 shell(不在脚本中)执行 md5sum 命令时,它工作得很好,即使是我的普通用户不使用 sudo 也是如此。当我切换到 root 并从 shell 执行命令时,它可以正常工作。当我以任何身份运行脚本时(从我的用户帐户、从我的用户帐户执行 sudo 或直接从 root 运行),我在 md5sum 行上收到权限被拒绝的错误。
我认为我的用户帐户的权限在某个地方正在溢出,而不是使用 root 的权限,除了以下事实:root 无法从 root 的 shell 执行该脚本,而不会出现权限被拒绝的错误,据我所知, root 不应该被拒绝任何事情的权限。作为测试,我在 md5sum 命令之前和之后添加了 whoami,并且在使用 sudo 或 root 执行时,这两个命令都将 root 输出为用户。
Root 和我的用户帐户显然都有权对文件执行 md5sum;事实上,这是从一个脚本运行的,它改变了我或 root 执行命令或操作文件的能力?
环境是RHEL 6。
答案1
根本问题是这一行的解析错误:
hash1=$(md5sum dbPath/testdb.sql) | awk '{print $1}'
几乎可以肯定的是
hash1=$(md5sum dbPath/testdb.sql | awk '{print $1}')
您可以在以下位置检查此类错误https://shellcheck.net