【问题标题】:How to connect to a ftp server via bash script?如何通过 bash 脚本连接到 ftp 服务器?
【发布时间】: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:root root 是因为脚本在使用 ftp 连接到远程 ftp 服务器时在root 下运行。这与在 ftp 连接期间提供用户名不同。您可以通过手动使用 ftp 看到这一点
  • 使用 ftp -n 必须有效。像下面的例子
  • "here-doc" ftp 脚本是主要的,但没有错误处理。不要将它们用于任何重要的事情。 0 的 test 仅确认 ftp 已成功退出,它会在其输出中报告一切都失败后很高兴地这样做。我已经编写了根据脚本读取和响应的基于 shell 的循环,但这并不重要。如果您可以使用scp,请尝试。如果没有,请将您刚刚发送的文件拉回本地临时名称并比较发送到拉取的文件。如果它们匹配,则您提取了您发送的文件,您可以删除临时文件并继续。
  • @PaulHodges scp 是个好主意。它工作得很好。谢谢。

标签: bash ftp


【解决方案1】:

使用这样的东西很常见:

$: ftp -vn <<!
> open localhost
> user foo
> put someFile
> quit
> !
> ftp: connect :Connection refused
Not connected.
Not connected.
Not connected.
$: echo $?
0

不幸的是 ftp 认为它成功报告了所有问题,所以它以一个快乐的零退出。

使用scp:

if scp "$lcldir/$filename" "$usr/$pw@$svr:$dir/"
then echo "file delivered"
else echo "delivery failed"
fi

如果您不能使用scp,请尝试expect,或在Perl 中写一些东西——您可以通过某种方式交互式地测试和确认每个步骤。

作为最后的手段,让 here-doc 发送文件,然后将其拉回本地尚不存在的临时文件。如果之后你可以成功cmp file1 file2,那么发送肯定是正常的。

【讨论】:

    【解决方案2】:

    我用:

    ftp -v -n >> /tmp/ftpb.log <<EOF
            open $URL
            user $USER $PASS
            binary
            put $FILE
            quit
    EOF
    

    并且有效

    【讨论】:

    • 如果您认为-n 是关键,请在您的回答中明确说明。
    • 很遗憾,-n 标志不起作用,我已经尝试过了。我现在用scp 来做这件事,因为那行得通。
    猜你喜欢
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2016-07-18
    • 2012-05-16
    相关资源
    最近更新 更多