Bash 使用expect时sftp不起作用
我正在使用bash脚本执行sftp,脚本正在运行,它启动sftp进程并完成它,但它不复制完整的数据。(由于我的数据大小约为600 MB,它只复制800KB并终止。手动执行时,同样可以正常工作。) 下面是我的脚本内容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
#!/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