我正在将开发环境从 Windows 迁移到 OS X,遇到了 TFTP 问题。我使用 TFTP 将文件上传到嵌入式网络设备,这是获取设备上文件的唯一选项(不提供 SCP 支持)。
每次我为该设备构建固件时,都需要上传一系列三个文件。在 Windows 上,我有一些简单的脚本,可以一次性上传我需要的所有文件,这使得部署一切变得简单得多。这些脚本很容易,因为 Windows TFTP 客户端以一行命令运行,如下所示:
tftp -i <Server IP Address> PUT <Local Filename> <Server Filename>
在 OS X 上似乎没有办法用这样的一个命令上传文件。相反,你必须打开 tftp 程序并执行一系列如下所示的命令:
$ tftp
tftp> connect <Server IP Address>
tftp> mode binary
tftp> put <Local Filename> <Server Filename>
tftp> quit
到目前为止,我还没有弄清楚如何编写脚本来执行此操作,尽管我对 Unix shell 脚本编写经验不多。有没有人尝试过做类似的事情并想出任何解决方案?
答案1
你应该能够使用“此处文档”tftp
在脚本中向程序提供命令:
#!/bin/sh
tftp <<EOF
connect <server IP Address>
mode binary
put <Local Filename 1> <Server Filename 1>
put <Local Filename 2> <Server Filename 2>
put <Local Filename 3> <Server Filename 3>
quit
EOF
答案2
您可能会发现此 URL 在 shell 脚本 TFTP 中很有用: http://www.unix.com/shell-programming-and-scripting/159848-redirect-output-shell-script-tftp.html
答案3
您可以使用在提示符下输入的命令创建纯文本脚本tftp>
,然后使用 unix shell 的stdin
重定向将命令传递给tftp
可执行文件。
例如,在我的/tmp/
目录中,我将文件bin1
bin2
和放入其中bin3
。
然后我使用文本编辑器创建了一个loader.txt
包含以下内容的文件:
binary
put bin1
put bin2
put bin3
quit
由于没有运行 TFTP 服务器,我曾经ttcp -r -u
打开 UDP 端口 5001,并观察文件是否正在被处理,然后我在另一个窗口中执行以下操作:
[Nevins-mac-mini:/tmp] nevin% tftp 127.0.0.1 5001 < loader.txt
Transfer timed out.
Transfer timed out.
Transfer timed out.
[Nevins-mac-mini:/tmp] nevin%
对于我的测试用例来说,超时是预料之中的。
我验证了每个文件在超时后都是按顺序提供的,并且它们是以二进制而不是 ascii 模式提供的,因此我确信其中的每一行loader.txt
都是通过tftp
二进制进行解析的。
我希望这有帮助...