如何改进这个FTP(shell)功能?

时间:2011-04-05 16:02:14

标签: shell ftp

我有大量使用以下功能的脚本:

# Copies files over using FTP.
# Configurations set at the beggining of the script
# @param    $1 = FTP Host
#           $2 = FTP User
#           $3 = FTP User password
#           $4 = Source file name
#           $5 = destination directory
#           $6 = local directory
doftp() {
    log_message_file "INFO" "Starting FTP"

    ftp_hst=$1
    ftp_usr=$2
    ftp_pwd=$3
    sourcefile=$4
    destdir=$5
    locdir=$6

    ftp -nv $FTPH << EOF 2> ftp.err.$$
quote USER $ftp_usr
quote PASS $ftp_pwd
cd $destdir
lcd $locdir
bin

put $sourcefile

bye
EOF

    if [ "$(wc ftp.err.$$|cut -d" " -f8)" != 0 ] ; then
        log_message_file "ERROR" "Problem uploading files: $(cat  ftp.err.$$)"
    else
        log_message_file "INFO" "FTP finished"
    fi
    rm ftp.err.$$
}

除非ftp失败,否则它有效。幸运的是,脚本非常精确,FTP几乎不会失败。但这是一个罕见的时刻,当有人有机会(时间)返回并审查TODO列表中标记的代码。唯一的问题是我不太确定如何改进它......我会带你们去看那些改变的建议。

一个明显的问题是从ftp解析错误,这是完全蹩脚的。但我也会考虑函数的其他部分:)

值得一提的是这是在AIX服务器上运行的吗?哦,不,我不能使用SFTP :(

感谢您的任何意见!

ps。:log_message_file只是一个基本的日志记录......对函数没有影响。

1 个答案:

答案 0 :(得分:2)

  • 良好的文档
  • 好的变量名称
  • 好的缩进,您可能想要阅读&lt;&lt; -EOF(' - '作为我打算用此评论突出显示的项目。使用该功能可以让你缩进(必须使用tab chars)整个这里-document匹配其余脚本的缩进。
  • 很好地使用tmp文件名和$$(取决于使用这个函数的程度,您可能希望将父脚本名称作为tmp名称的一部分附加,以进一步消除歧义,但优先级较低)
  • 很好地使用$(cat ftp.err。$$)即实际显示错误消息,而不仅仅是'错误发生'这样的消息(我一直看到这个,什么错误?什么是MSG?!)

  • 你可以扩展ftp服务以使用mput,但是你必须了解你的特定ftp客户端的变幻莫测并记下你的自己,任何时候你需要更改ftp客户端检查你的mput $ {fileNames}变量是否仍然按预期工作。

  • 考虑改进的一个地方可能是使用case语句来解析STDERR输出,但同样,额外的好处可能不值得维护成本。

errMsgs="$(cat ftp.err.$$)"

case "${errMsgs}" in
    *warningStrings* ) print "warning found, msg was ${errMsg} ;;
    *errorStrings* ) print "error found, msg was ${errMsg} ;;
    *fatalStrings* ) pring "fatal error found, can't continue, msg was ${errMsg} ;;
esac

我希望这会有所帮助。