2016-05-12 116 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