Bash 使用expect时sftp不起作用

Bash 使用expect时sftp不起作用,bash,sftp,expect,Bash,Sftp,Expect,我正在使用bash脚本执行sftp,脚本正在运行,它启动sftp进程并完成它,但它不复制完整的数据。(由于我的数据大小约为600 MB,它只复制800KB并终止。手动执行时,同样可以正常工作。) 下面是我的脚本内容 #!/bin/bash HOST=x.x.x.x PORT=22 USER=abc PASSWORD=password SOURCE_FILE=/nobackup/file.gz TARGET_DIR=/home /usr/bin/expect<<! spawn /u

我正在使用bash脚本执行sftp,脚本正在运行,它启动sftp进程并完成它,但它不复制完整的数据。(由于我的数据大小约为600 MB,它只复制800KB并终止。手动执行时,同样可以正常工作。)

下面是我的脚本内容

#!/bin/bash
HOST=x.x.x.x
PORT=22
USER=abc
PASSWORD=password
SOURCE_FILE=/nobackup/file.gz
TARGET_DIR=/home

/usr/bin/expect<<!

spawn /usr/bin/sftp -o Port=$PORT $USER@$HOST
expect "password:"
send "$PASSWORD\r"
expect "sftp>"
send "get $SOURCE_FILE $TARGET_DIR\r"
expect "sftp>"
send "bye\r"
!
!/bin/bash
主机=x.x.x.x
端口=22
用户=abc
密码=密码
SOURCE_FILE=/nobackup/FILE.gz
TARGET_DIR=/home
/usr/bin/expect

请提供帮助。

我的sftp实现允许批处理模式,为什么需要expect脚本

 .
 .
 echo "get $SOURCE_FILE $TARGET_DIR" | sftp -b - -o Port=$PORT $USER@$HOST
考虑一下,它被显式构建为可编写脚本(并且在众多协议中支持sftp):


printf
生成一个类似于以下内容的字符串:

open sftp://abc:password@x.x.x.x:22/; get -o /home/file.gz /nobackup/file.gz

…这是一个有效的lftp脚本。

这是一个
expect
问题,而不是
bash
问题。expect是一种基于TCL的语言,根本不在POSIX sh系列中。此外,覆盖
用户
是一种糟糕的形式——在许多(但不是所有)情况下)系统中,您会注意到它已经有了一个值,即当前用户名。为您自己的变量使用小写名称的部分要点(如相关POSIX标准中所建议的--请参阅第四段,记住shell和环境变量共享一个名称空间)没有错误地覆盖系统变量。如果安装了
lftp
,可能会更好,但可能没有安装在我的系统上。可能OP也无法安装它?它给出了错误:get:Access失败:没有这样的文件(/home/file.gz)你所取代的
/home
目录真的存在吗?…这并不能回答我的问题。
open sftp://abc:password@x.x.x.x:22/; get -o /home/file.gz /nobackup/file.gz