我无法使用 expect 脚本连接 sftp

I'm not able to connect sftp using expect script

我无法确定我在做什么wrong.Please如果我做错了请告诉我。

#!/usr/bin/bash

File_Sftp ()
{
    set user="xxxx"
    set password="xxxxx"
    set host="ftp.xxxx.xxxx.com"

    STATUS=$(
    expect << EOF
    spawn sftp $user@$host
    expect "User Name:"
    send "$user\r"
    expect "Password:"
    send "$password\r"
    expect "sftp> "
    send "cd in\r"
    expect "sftp> "
    send "get \r"
    expect "sftp> "
    send "exit\r"
EOF
    )

    if [ "$(echo $STATUS | grep -c 226)" -ge 1 ]; then
      echo "Success";
    else
      echo "Unsuccessful" ;
    fi
}

File_Sftp "/usr/local/bin/xxxxxx.txt"

每当我尝试执行上述 shell 脚本时,我都会遇到以下错误:

send: spawn id exp4 not open
    while executing
"send "\r""
Unsuccessful

这些 bash 行不符合您的想法:

set user="xxxx"
set password="xxxxx"
set host="ftp.xxxx.xxxx.com"

它们不是设置变量值,而是将位置参数 </code> 设置为给定的字符串。实际变量<strong>仍未设置</strong>。 </p> <p><code>spawn 会尝试启动 sftp $user@$host 失败(实际上 sftp @ 使用未设置的变量),expect "User Name:" 会在默认的 10 秒后超时,然后错误消息来自 send "$user\r"(或带有未设置变量的 send "\r")——没有生成的进程与之交互。

如果你在测试时使用expect -d <<EOF你可以看到这个(打开expect的详细调试输出)

你想要

user="xxxx"
password="xxxxx"
host="ftp.xxxx.xxxx.com"

或者,由于这是 bash,我们希望推广良好的编程实践(无全局变量)

local user="xxxx"
local password="xxxxx"
local host="ftp.xxxx.xxxx.com"

发送后加一个expect eof"exit"


要查看 226 是否出现在 expect 的输出中,我会更改此

if [ "$(echo $STATUS | grep -c 226)" -ge 1 ]; then

if grep -q '\<226\>' <<< "$STATUS" ; then

if [[ $STATUS == *226* ]]; then