为什么这个 shell 脚本在 bash 中失败,但命令在 SSH 中有效?

为什么这个 shell 脚本在 bash 中失败,但命令在 SSH 中有效?

我正在尝试编写一个 shell 脚本,用于备份网站和所有支持它的 MySQL 数据库。我在网上找到了一些示例,但是当我在被监禁的 SSH 会话中在 bash 中运行脚本时,它失败了。如果我直接在 SSH 会话中输入命令,它们就可以正常工作。

#!/bin/sh

DB1="first_db"
THEDATE=$(date +"%Y-%m-%d")
THEUSER=user
THEDBPW=password

mysqldump -u $THEDBUSER -p$THEDBPW $DB1 > dbbackup_$DB1_$THEDATE.sql

tar -czf sitebackup_website_$THEDATE.tar /home/website/public_html
gzip sitebackup_website_$THEDATE.tar

该脚本位于 Web 服务器上,因此出于测试目的,我通过 SSH 进入服务器、cd进入目录,然后运行bash backup.sh​​. mysqldump未连接,似乎无法传递密码(它返回错误报告“使用密码:否”)。然后 tar 命令失败,报告它无法统计/home/website/public_html“没有这样的文件或目录”。 tar然后报告由于之前的错误,它正在退出并显示错误状态。

我在这里缺少什么?

答案1

通过登录服务器并运行来检查脚本的 Windows 行结尾

cat -v /path/to/script

如果该行以 结尾^M,那就是问题所在。

您可以通过运行来修复带有断行结尾的文件

dos2unix /path/to/script

如果服务器上不存在 dos2unix,您可以使用 sed,如下所示:

sed -i 's/\r$//' /path/to/script

答案2

您已将用户名分配给变量THEUSER,但您的mysqldump命令正在使用该变量THEDBUSER

答案3

tardir=$PWD ; cd /home/website/public_html && 
    tar -czf "$tardir"/sitebackup_complete-office_"$THEDATE.tar"

要不就:

tar -C/home/website/public_html -czf \
    sitebackup_complete-office_"$THEDATE.tar"

一般来说,许多人tars将无法使用绝对路径,除非明确指示这样做。

默认情况下,GNU tar 在输入或输出上删除前导/,并抱怨文件名包含组件..。此选项会关闭此行为。

命令完全有可能ssh's根据命令传递和引用来预先解析路径。这与路径名中变量的扩展相关。

答案4

如果我正确理解你对问题的描述,关键的区别似乎是入狱SSH 会话 - 在被监禁的会话中运行的进程无法看到其监狱目录(通常是其主目录)之外的内容。这就是为什么您在非监禁会话中不会遇到问题的原因。你也可以看看维基百科 监狱入口更多细节。

相关内容