【发布时间】:2020-03-16 07:34:12
【问题描述】:
我编写了一个 bash 脚本,用于将备份文件从服务器上传到 ftp 服务器。但我总是得到一个错误。
Name (myftpserver:root): Permission denied.
Login failed.
Login with USER first.
Please login with USER and PASS.
Local directory now /backup01
Please login with USER and PASS.
Passive mode refused.
这是我的脚本:
#!/bin/bash
DATE=`date +%Y-%m-%d_%H%M`
LOCAL_BACKUP_DIR="/backup01"
DB_NAME="databasename"
DB_USER="root"
FTP_SERVER="randomIP"
FTP_USERNAME="myname"
FTP_PASSWORT="supersecret"
FTP_UPLOAD_DIR="/home/mydirectory/ftp/upload"
LOG_FILE=/backup01/backup-$DATE.log
mysqldump -u $DB_USER $DB_NAME | gzip > $LOCAL_BACKUP_DIR/$DATE-$DB_NAME.sql.gz
ftp $FTP_SERVER << END_FTP
quote USER $FTP_USERNAME
quote PASS $FTP_PASSWORD
cd $FTP_UPLOAD_DIR
lcd $LOCAL_BACKUP_DIR
put "$DATE-$DB_NAME.sql.gz"
bye
END_FTP
if test $? = 0
then
echo "Database successfully uploaded to the FTP Server!"
echo "Database successfully created and uploaded to the FTP Server!" | mail -s "Backup from $DATE" my.email@whereever.com
else
echo "Error in database upload to Ftp Server" > $LOG_FILE
fi
也许有人可以帮助我,因为我已经尝试了我在互联网上找到的所有内容。 我制作了一个 .netrc 文件。我配置了 vsftpd.conf,启用了被动模式,启用了用户列表,我还做了很多其他的东西...... 但是现在我不知道我还需要做什么才能让这个脚本按它应该的方式工作。而且我不知道为什么它试图通过 root 连接......
也许有人可以提供帮助。 提前致谢。
【问题讨论】:
-
您的 FTP 客户端可能不喜欢文件名两边的双引号。
-
您在此处看到
myftpserver:rootroot 是因为脚本在使用 ftp 连接到远程 ftp 服务器时在root下运行。这与在 ftp 连接期间提供用户名不同。您可以通过手动使用 ftp 看到这一点 -
使用 ftp -n 必须有效。像下面的例子
-
"here-doc" ftp 脚本是主要的,但没有错误处理。不要将它们用于任何重要的事情。 0 的
test仅确认ftp已成功退出,它会在其输出中报告一切都失败后很高兴地这样做。我已经编写了根据脚本读取和响应的基于 shell 的循环,但这并不重要。如果您可以使用scp,请尝试。如果没有,请将您刚刚发送的文件拉回本地临时名称并比较发送到拉取的文件。如果它们匹配,则您提取了您发送的文件,您可以删除临时文件并继续。 -
@PaulHodges
scp是个好主意。它工作得很好。谢谢。