2016-05-12 112 views
-1

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

下面是我的脚本内容

#!/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 [email protected]$HOST 
expect "password:" 
send "$PASSWORD\r" 
expect "sftp>" 
send "get $SOURCE_FILE $TARGET_DIR\r" 
expect "sftp>" 
send "bye\r" 
! 

请帮助。

+0

这是一个'expect'问题,而不是'bash'问题。 Expect是基于TCL的语言,根本不在POSIX sh系列中。 –

+0

另外,在许多(但不是全部)系统上覆盖'USER'是不好的形式 - 你会注意到它已经有一个值,即当前用户名。为自己的变量使用小写字母名称的一部分(正如相关POSIX标准中推荐的http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html - 请参阅第四段,保留在介意shell和环境变量共享一个名称空间)不会错误地覆盖系统变量。 –

回答

1

我的SFTP的实施允许批处理模式,为什么你需要预期脚本吗?

. 
. 
echo "get $SOURCE_FILE $TARGET_DIR" | sftp -b - -o Port=$PORT [email protected]$HOST 
+0

如果安装'lftp'可能很好,可能更可取 - 但我的系统上没有安装。也许OP也不能安装它? –

0

考虑lftp,这是明确的建成可脚本(和支持,但其中许多协议,SFTP):

user=abc 
password=password 
host=x.x.x.x 
port=22 
source_file=/nobackup/file.gz 
target_dir=/home 

printf -v cmd 'open %q; get -o %q %q' \ 
    "sftp://$user:[email protected]$host:$port/" \ 
    "${target_dir}/${source_file##*/}" \ 
    "$source_file" 

lftp -c "$cmd" 

printf生成一个字符串类似于如下:

open sftp://abc:[email protected]:22/; get -o /home/file.gz /nobackup/file.gz 

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

+0

它提供了错误:get:访问失败:没有这样的文件(/home/file.gz) – NiteshM

+0

并且代替'/ home'目录实际存在吗? –

+0

/iiidb /软件 – NiteshM