在 IEC 61131-3 中使用 Curl 实现安全 SFTP 上传
几周前我收到这样一个问题。需用运行在 ESM 中的程序,通过 SFTP 服务器上传日志文件。
SSH 文件传输协议 (SFTP) 是一种网络协议,提供通过任何可靠数据流的文件访问、传输和管理。由互联网工程任务组 (IETF) 设计为 Secure Shell 协议 (SSH) 2.0 版本的扩展,提供安全文件传输能力。
SFTP 包含在 PLCnext 固件中,这不应成问题。
步骤 1:我用结构化文本创建日志文件。示例见:
https://www.plcnext-community.net/en/hn-makers-blog/438-datalogging-in-iec-61131-3-the-basic-principle.html
https://www.plcnext-community.net/en/hn-makers-blog/447-datalogging-in-iec-61131-3-create-your-own-file-manager.html
步骤 2:我需要 SFTP 服务器测试 PLC 应用。我用 CrushFTP,安装在笔记本电脑的虚拟机中。
安装软件后,需为 Web 界面创建管理用户。完成后,可为 PLC 访问创建用户。
本例:user = PLCnext, password = 123456789
步骤 3:命令行上传文件。
上图可见先给命令,第二步输入密码。若要用 “PBCL_SysLinuxShell_1” FB 自动化此过程,需单行命令。
此 FB 在 PLCnextBase 库中。(https://www.plcnextstore.com/#/720)
所以需另一命令执行文件上传。看 Curl。
固件 2020.6.1 自带版本不支持 SFTP。得益于 Oliver Warneke,我安装了支持 SFTP 的 Curl 版本。不展示完整安装过程,结果是支持 SFTP 的版本。固件 2021.0.0 LTS 将可用以下版本。
得益于 Curl,现可用另一命令。
curl -k -sS --key ~/.ssh/id_rsa --max-time 25 --connect-timeout 10 "sftp://192.168.1.50:22/test/Upload/" --user "PLCnext:12345679" -T "/opt/plcnext/Test.pdf" --ftp-create-dirs
将此命令用于 Shell FB,可在以下日志文件查看结果检查程序。
/opt/plcnext/PLCnextBase.ServiceProvider.log
参数说明:
-k, --insecure
(TLS) 默认每个 SSL 连接都验证安全。此选项允许 curl 对服务器连接继续操作,即使被认为不安全。通过确保服务器证书含正确名称并用证书存储成功验证来验证服务器连接。
-S, --show-error
配合 -s, --silent 使用时,失败则显示错误信息。
-s, --silent
静默模式。不显示进度条或错误信息。使 Curl 静音。仍输出请求的数据,除非重定向否则可能输出到终端/stdout。配合 -S, --show-error 禁用进度条但仍显示错误。
--key
(TLS SSH) 私钥文件名。允许在单独文件提供私钥。SSH 时若未指定,curl 依次尝试:'~/.ssh/id_rsa'、'~/.ssh/id_dsa'、'./id_rsa'、'./id_dsa'。
-m, --max-time
允许整个操作的最长秒数。防止批处理作业因网络慢或链路中断挂起数小时。
--connect-timeout
允许 curl 连接阶段的最长秒数。仅限制连接阶段,若在给定周期内连接成功将继续 — 否则退出。
-T, --upload-file
将指定本地文件传输到远程 URL。若指定 URL 无文件部分,curl 将追加本地文件名。
--ftp-create-dirs
(FTP SFTP) FTP 或 SFTP URL/操作用的路径在服务器不存在时,curl 标准行为是失败。用此选项,curl 将尝试创建缺失目录。
参考:
https://en.wikipedia.org/wiki/SSH_File_Transfer_Protocol
https://www.crushftp.com/index.html
https://curl.se/docs/manpage.html
工业技术