如何完善这个FTP(shell)功能?

2024-04-26

我有大量使用以下函数的脚本:

# 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 几乎不会失败。但这是人们有机会(时间)回去查看待办事项列表中标记的代码的罕见时刻之一。唯一的问题是我不太确定如何改进它......我会向你们提出关于那里应该改变什么的建议。

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

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

感谢您的任何意见!

ps.:log_message_file只是一个基本的日志记录...在功能上没有任何作用。


  • 良好的文档
  • 好的变量名
  • 良好的缩进,您可能想阅读有关
  • 很好地使用 tmp 文件名和 $$ (取决于此函数的使用程度,您可能希望将父脚本名称附加为 tmp 名称的一部分,以进一步消除歧义,但优先级较低)
  • 充分利用 $(cat ftp.err.$$) 即实际显示错误消息,而不仅仅是像“发生错误”这样的消息(我一直看到这个,什么错误?消息是什么?!)

  • 您可以扩展 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

我希望这有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何完善这个FTP(shell)功能? 的相关文章

随机推荐

  • Firestore snapshotChanges DocumentChangeType“已删除”从未发送

    我正在使用 where 子句查询 Firestore 集合 并订阅 snapshotChanges 根据文档 我应该为添加 修改和删除的每个元素获取一个事件 我很好地得到了添加和修改的文档 但我从未得到删除的文档 这是我的代码的示例 thi
  • 使用 QueueLinearFloodFill 算法着色时留下空白

    我正在尝试在android中实现洪水填充算法 它的工作速度非常慢 所以我根据此链接尝试了队列线性洪水填充算法 Android中如何使用洪水填充算法 https stackoverflow com questions 16968412 how
  • 在 Firebase-ios-swift 中创建和附加数组

    如何在firebase 3 0中创建数组并在数组中执行append和delete功能 这是我正在寻找的数据结构 1 UserIds 0 12345 1 678910 2 1112131415 2 UserProfile 0 12345 0
  • React - JSX 语法问题,以及如何迭代地图并在换行符上显示项目

    我是一个 React 菜鸟 正在制作 ToDo 列表样式食谱列表应用程序 https fcc recipebox surge sh 我有一个功能组件 Item js 我使用 JSX 和映射函数来迭代每个配方项并显示它们 我希望每个菜谱项目都
  • 使用PHP通过FTP递归扫描目录和子目录

    我正在尝试创建目录中所有文件 及其大小 的列表 包括子目录中的所有内容 这些文件位于远程服务器上 所以我的脚本通过 FTP 连接 然后使用以下命令运行递归函数ftp chdir浏览每个目录 如果有其他方法可以做到这一点 我愿意接受建议 fl
  • 停止pandoc自动添加id

    我在用Pandoc对Markdown的扩展 http pandoc org MANUAL html pandocs markdown来生成 HTML 以下降价 test specificId test2 test3 生成以下 html h1
  • 如何使用 Xerces 同时使用 Maven 从 XSD 1.1 生成源

    我有一个带有断言标签的 XSD 文件 我读到 Xerces 支持带有这些标签的 XML Schema 1 1 草案 如何在我的 Maven 构建中使用实际的 Xerces 版本 而不是标准 Java 实现 使用 Xerces 版本的一种旧方
  • config_cache_enabled 错误

    使用 Zend 框架 2 1 当我设定 config cache enabled gt true在我的里面application config php 它返回以下错误 Warning var export does not handle c
  • 使用 SessionBean EJBObject 和 EJBHome 接口创建 EJB

    我对创建 EJB 感到困惑 我在互联网上看到了许多 EJB 示例 也看到了使用 SessionBean EJBObject 和 EJBHome 接口开发 EJB 的示例项目 在其他一些示例中 EJB 是在没有这些接口的情况下创建的 并且仅使
  • 如何获取数组中每个数字的阶乘值?

    我试图使用此方法获取数组中每个项目的阶乘值 但这仅输出一个值 任何人都可以帮助我找出我做错的地方吗 function mathh arr fn for i 1 i lt sizeof arr i arr2 arr2 i fn arr i r
  • 如何在 Jackson 和 Gson 之间转换日期?

    在我们的 Spring 配置的 REST 服务器中 我们使用 Jackson 将对象转换为 Json 该对象包含几个 java util Date 对象 当我们尝试使用 Gson 的 fromJson 方法在 Android 设备上反序列化
  • 如何在CSS中捏住一行的中间

    我正在尝试制作一条看起来几乎在末端有衬线的线条 本质上 我想让它在最末端变宽 在中间变细 只需使用 css 这实际上被证明是一个相当大的挑战 任何帮助 将不胜感激 到目前为止 我已经能够了解我想要如何使用 after伪选择器 但顶部没有运气
  • 如何使用shoulda匹配器来测试多态关联?

    我正在使用带有rails的shoulda matchers 并创建一个名为 comments 的模型和另一个名为 post 的模型 评论是多态的 当我在这样的帖子中使用 shoulda 匹配器进行测试时 it should have man
  • 导入错误:没有名为“编码”的模块

    我最近重新安装了ubuntu并升级到16 04并且无法使用python python manage py runserver Could not find platform independent libraries
  • 将 Azure CDN 与共享访问签名结合使用

    我正在尝试合并 Azure 来存储应用程序的大部分文件 我想将这些文件上传到 azure 中的私有容器和私有 blob 并通过 Azure CDN 将这些上传内容复制到所有其他节点 仍然作为私有容器和 blob 然后 我希望我的应用程序向存
  • “from Six.moves import urllib”在 Python 中做什么?

    我在 Python 代码中发现了以下行 from six moves import urllib 同时 我可以找到urllib py任何地方 我发现有一个文件six py在包根目录中 它有class Module six moves url
  • 在 R 中查找观察值之间的时间差

    我正在尝试确定两次观察之间的时间差 数据由不同的个人分解 每个人都有自己唯一的 ID 我有一个数据集 它告诉我每次状态发生变化时他们的状态会更新什么 以及他们的状态何时发生变化 状态可以是两个值之一 并且它总是更改为它不是的值 在本例中 从
  • C# 中的可选数组参数[重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中传递一个空数组作为可选参数的默认值 https stackoverflow com questions 3480382 passing an empty array as default v
  • 比特币客户端如何确定第一个连接的IP地址?

    据我所知 比特币是一种 p2p 协议P2P协议必须有一个专用的中央服务器 https stackoverflow com questions 310607 peer to peer methods of finding peers 但据说比
  • 如何完善这个FTP(shell)功能?

    我有大量使用以下函数的脚本 Copies files over using FTP Configurations set at the beggining of the script param 1 FTP Host 2 FTP User