预计 SFTP 脚本在 bash 中不起作用
Expect Script for SFTP not working in bash
我创建了一个 shell 脚本,其中包含用于从远程位置获取文件的 expect 脚本。一切正常,直到发送了一些命令。无论是 'ls' 还是 'pwd' 或任何其他命令,expect 脚本都会突然结束。你能帮我解决这个问题吗?
注意:安全性不是问题,因此不使用 Public 密钥。
#!/bin/ksh
FTPREMOTEPATH=/Inbox
FTPREMOTEFILENAME=test.CSV
/usr/bin/expect -f - <<EOFEXPECT1
set timeout 60
spawn sftp -oPort=1002 username@test.server.com
expect {
default { exit 1}
-re "failed|invalid password|Permission denied" {exit 2}
"Connection closed" {exit 1}
timeout {exit 1}
}
expect "Password:"
send "password\r"
expect {
default {exit 1}
-re "password|Enter password for " {puts "Incorrect Password"; exit 2}
"sftp>" {send "cd $FTPREMOTEPATH \r"}
}
expect "sftp>"
send "pwd\r"
send "get $FTPREMOTEFILENAME \r";
EOFEXPECT1
在上面的脚本中,发送 cd $FTPREMOTEPATH 后脚本突然结束。
下面是输出:
$ ./test.sh
spawn sftp -oPort=1002 username@test.server.com
Enter password for username
Password:
sftp> cd /Inbox
sftp> $
好吧,显然我错过了 expect "sftp>" {send "bye\n"} ,在 EOF (EOFEXPECT1) 之前。
但是,我仍然有兴趣了解 bye 在 expect 脚本中的重要性。
这是更新后的工作代码:
#!/bin/ksh
FTPREMOTEPATH=/Inbox
FTPREMOTEFILENAME=test.CSV
/usr/bin/expect -f - <<EOFEXPECT1
set timeout 60
spawn sftp -oPort=1002 username@test.server.com
expect {
default { exit 1}
-re "failed|invalid password|Permission denied" {exit 2}
"Connection closed" {exit 1}
timeout {exit 1}
}
expect "Password:"
send "password\r"
expect {
default {exit 1}
-re "password|Enter password for " {puts "Incorrect Password"; exit 2}
"sftp>" {send "cd $FTPREMOTEPATH \r"}
}
expect "sftp>"
send "pwd\r"
send "get $FTPREMOTEFILENAME \r";
expect "sftp>" {send "bye\n"}
EOFEXPECT1
假设您打电话给当地一家餐馆,说 "get me some food" 然后就挂断了。餐厅应该做什么?
当您等待 sftp 提示时,您正在等待食物送达。
我推荐两件事:
- 在
send "get ...
之前将超时值更改为 -1
-- 如果接收文件的时间超过 60 秒,这将有所帮助。
- 发送 "bye" 后,
expect eof
-- 让 sftp 连接正常关闭。
原因是您的 Expect 脚本已到达脚本末尾,因此在 ftp 进程有机会完成文件下载之前终止子 (ftp) 进程。
我创建了一个 shell 脚本,其中包含用于从远程位置获取文件的 expect 脚本。一切正常,直到发送了一些命令。无论是 'ls' 还是 'pwd' 或任何其他命令,expect 脚本都会突然结束。你能帮我解决这个问题吗?
注意:安全性不是问题,因此不使用 Public 密钥。
#!/bin/ksh
FTPREMOTEPATH=/Inbox
FTPREMOTEFILENAME=test.CSV
/usr/bin/expect -f - <<EOFEXPECT1
set timeout 60
spawn sftp -oPort=1002 username@test.server.com
expect {
default { exit 1}
-re "failed|invalid password|Permission denied" {exit 2}
"Connection closed" {exit 1}
timeout {exit 1}
}
expect "Password:"
send "password\r"
expect {
default {exit 1}
-re "password|Enter password for " {puts "Incorrect Password"; exit 2}
"sftp>" {send "cd $FTPREMOTEPATH \r"}
}
expect "sftp>"
send "pwd\r"
send "get $FTPREMOTEFILENAME \r";
EOFEXPECT1
在上面的脚本中,发送 cd $FTPREMOTEPATH 后脚本突然结束。
下面是输出:
$ ./test.sh
spawn sftp -oPort=1002 username@test.server.com
Enter password for username
Password:
sftp> cd /Inbox
sftp> $
好吧,显然我错过了 expect "sftp>" {send "bye\n"} ,在 EOF (EOFEXPECT1) 之前。
但是,我仍然有兴趣了解 bye 在 expect 脚本中的重要性。
这是更新后的工作代码:
#!/bin/ksh
FTPREMOTEPATH=/Inbox
FTPREMOTEFILENAME=test.CSV
/usr/bin/expect -f - <<EOFEXPECT1
set timeout 60
spawn sftp -oPort=1002 username@test.server.com
expect {
default { exit 1}
-re "failed|invalid password|Permission denied" {exit 2}
"Connection closed" {exit 1}
timeout {exit 1}
}
expect "Password:"
send "password\r"
expect {
default {exit 1}
-re "password|Enter password for " {puts "Incorrect Password"; exit 2}
"sftp>" {send "cd $FTPREMOTEPATH \r"}
}
expect "sftp>"
send "pwd\r"
send "get $FTPREMOTEFILENAME \r";
expect "sftp>" {send "bye\n"}
EOFEXPECT1
假设您打电话给当地一家餐馆,说 "get me some food" 然后就挂断了。餐厅应该做什么?
当您等待 sftp 提示时,您正在等待食物送达。
我推荐两件事:
- 在
send "get ...
之前将超时值更改为-1
-- 如果接收文件的时间超过 60 秒,这将有所帮助。 - 发送 "bye" 后,
expect eof
-- 让 sftp 连接正常关闭。
原因是您的 Expect 脚本已到达脚本末尾,因此在 ftp 进程有机会完成文件下载之前终止子 (ftp) 进程。