1

我正在尝试借助 TCL 脚本将文件从一台服务器传输到远程服务器。但是我的脚本在消息“200 Port set OK”之后停止,并继续从下面的 telnet 会话中运行。

我检查了目标位置,我的文件没有传输。

请建议我能做什么或我错在哪里

#!/usr/bin/tclsh
#!/usr/bin/expect

package require Expect

set p "mm155_005.006.010.200_bt.fw"

#**************************************************************\
                FILE TRANSFER TO REMOTE SERVER                  \
***************************************************************
spawn ftp 10.87.121.26
expect "User (10.87.121.26:(none)):"
send "user\r"
expect "Password:"
send "pswd\r"

expect "ftp>"
send "cd FW\r"
expect "ftp>"
send "ha\r"
expect "ftp>"
send "bi\r"
expect "ftp>"

send "mput \"$p\"\r"
expect "mput $p? "
send "yes\r"
expect "ftp>"
send "ls\r"


#**************************************************************\
                RUNNING THE TRANSFERED FILE                     \
***************************************************************

spawn telnet 10.87.121.26
expect "Login: "
send "user\r"
expect "password: "
send "pswd\r"

expect "*? > "
send "cd FW\r"

expect "*? > "
send "burnboot 30 5.6(10.200)\r"

输出

生成 ftp 10.87.121.26
连接到 10.87.121.26。
220 VxWorks FTP 服务器(VxWorks VxWorks5.4.2)准备就绪。
名称(10.87.121.26:vkumar):用户
331 需要密码
密码:
230 用户登录
远程系统类型是 UNIX。
使用二进制模式传输文件。
ftp> cd 固件
250 将目录更改为“C:/FW”
ftp>哈哈
散列标记打印(1024 字节/散列标记)。
ftp>bi
200 类型设置为 I,二进制模式
ftp> mput "mm155_005.006.010.200_bt.fw"
输入 mm155_005.006.010.200_bt.fw?是的
200 Port set OK \ 我在这行之后看不到哈希进度条
生成远程登录 10.87.121.26
正在尝试 10.87.121.26...
连接到 10.87.121.26。
转义字符是 '^]'。

登录:用户
密码:

node84.7.PXM.a > cd FW

node84.7.PXM.a > bash-2.05b$
4

3 回答 3

3

与其在 Expect 中推出自己的解决方案(大约 9 年前我也这样做过),不如使用 tcllib 中的 FTP 模块——它已经久经考验。

http://tcllib.sourceforge.net/doc/ftp.html

于 2012-05-23T12:36:41.410 回答
1

报告的脚本不太可能完全产生该输出;ls完成之后没有什么mput。但是,如果mput挂起,最可能的问题是存在防火墙问题;FTP 使用多个套接字进行文件传输(这就是为什么 FTP 在整体防火墙管理方面如此痛苦的原因)。特别是,它有一个命令通道(您与 FTP 服务器通信的套接字)和每个文件的单独数据通道(以及一些远程命令的输出,例如ls);就是这样Port set okay。这对防火墙不友好,并且很容易在该区域错误配置防火墙(尤其是当还有 NAT 时)。

您可能(即,首先尝试这个)想要使用被动模式,因为这样可以降低防火墙级别的复杂性。尝试passive在 the 之前发出 a mput(就像您当前发出binary 一样)。

于 2012-05-23T10:22:40.140 回答
0

这是我用类似功能编写的 bash 脚本;

您应该能够使其适应您的需求。

在 SSH 中添加几行并运行脚本应该非常简单。

作为旁注;你为什么要使用TCL?

#!/bin/bash

fileName=`ls /home/user/downloads -t1 | head -n1`
latestFile="/home/user/downloads/$fileName"
echo $latestFile
hostname="HOSTNAME"
username="USER"
password="PASS"
ftp -inv $hostname << EOF
quote USER $username
quote PASS $password
cd transfer/jirabackup 
binary
put $latestFile $fileName
quit
于 2012-05-23T10:24:16.457 回答