SFTP的预期脚本无法在bash中运行

问题描述 投票:0回答:2

我创建了一个shell脚本,其中包含一个期望脚本,用于从远程位置获取文件。一切正常,直到发送了一些命令。无论是“ ls”,“ pwd”还是任何其他命令,期望脚本都会突然结束。你们能帮我这个忙吗?

注意:安全性不是问题,因此不使用公共密钥。

#!/bin/ksh

FTPREMOTEPATH=/Inbox
FTPREMOTEFILENAME=test.CSV


/usr/bin/expect -f - <<EOFEXPECT1
set timeout 60
spawn sftp -oPort=1002 [email protected]
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 [email protected]
Enter password for username
Password:
sftp> cd /Inbox
sftp> $
linux shell ftp sftp expect
2个回答
1
投票

想象一下,您打电话给当地一家餐馆,说“给我吃点东西”,然后挂断电话。这家餐厅应该做什么?

当您等待sftp提示时,您正在等待食物交付。

我推荐两件事:

  1. send "get ...之前将超时值更改为-1 –如果接收文件的时间超过60秒,这将有所帮助。
  2. 发送“ bye”后,expect eof-使sftp连接正常关闭。

0
投票

好,显然我在EOF(EOFEXPECT1)之前缺少期望“ sftp>” {发送“ bye \ n”}

但是,我仍然很想知道在期望脚本中再见的重要性。

这里是更新的工作代码:

#!/bin/ksh

FTPREMOTEPATH=/Inbox
FTPREMOTEFILENAME=test.CSV


/usr/bin/expect -f - <<EOFEXPECT1
set timeout 60
spawn sftp -oPort=1002 [email protected]
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
© www.soinside.com 2019 - 2024. All rights reserved.