我正在尝试编写一个 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 会话 - 在被监禁的会话中运行的进程无法看到其监狱目录(通常是其主目录)之外的内容。这就是为什么您在非监禁会话中不会遇到问题的原因。你也可以看看维基百科 监狱入口更多细节。