面对使用TCL将文件从一台服务器传输到另一台服务器的困难

时间:2012-05-23 10:00:31

标签: ftp tcl expect

我试图借助TCL脚本将文件从一台服务器传输到远程服务器。 但是我的脚本在消息“200 Port set okay”之后停止,并继续从下面的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"

输出

spawn ftp 10.87.121.26
Connected to 10.87.121.26.
220 VxWorks FTP server (VxWorks VxWorks5.4.2) ready.
Name (10.87.121.26:vkumar): user
331 Password required
Password:
230 User logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd FW
250 Changed directory to "C:/FW"
ftp> ha
Hash mark printing on (1024 bytes/hash mark).
ftp> bi
200 Type set to I, binary mode
ftp> mput "mm155_005.006.010.200_bt.fw"
mput mm155_005.006.010.200_bt.fw? yes
200 Port set okay                         \ I am unable to see hash progress bar after this line
spawn telnet 10.87.121.26
Trying 10.87.121.26...
Connected to 10.87.121.26.
Escape character is '^]'.

Login: user
password: 

node84.7.PXM.a > cd FW

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

3 个答案:

答案 0 :(得分:3)

不是在Expect中推出自己的解决方案(我大约在9年前也做过这个),而是使用tcllib中的FTP模块 - 它已经过强化了。

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

答案 1 :(得分:1)

报告的脚本不太可能产生完全相同的输出;在ls之后mput没有任何内容。但是,如果mput悬而未决,最可能出现的问题是firewall issue; FTP使用多个套接字来进行文件传输(这就是为什么FTP在整体防火墙管理方面如此痛苦)。特别是,它有一个命令通道(与FTP服务器通信的套接字)和每个文件的单独数据通道(以及一些远程命令的输出,如ls);那是Port set okay的意思。这不是防火墙友好的,并且很容易在这个区域中错误配置防火墙(特别是在有NAT的情况下)。

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

答案 2 :(得分: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