我试图借助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$
答案 0 :(得分:3)
不是在Expect中推出自己的解决方案(我大约在9年前也做过这个),而是使用tcllib中的FTP模块 - 它已经过强化了。
答案 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