2017-03-17 4 views
0

私はSFTPサーバーからのファイルのダウンロードを自動化するbashスクリプトを書くのに最後の3日間から苦労してきました。私はプログラムの構造を作りました。スニペットでテストしましたが、これは私が執着しているものです。期待どおりにSFTPサーバーからsftp lsコマンドの出力をキャプチャするには?

私は、このようにSFTPサーバにログイン:

/usr/bin/expect <<EOD 
spawn sftp $ftp_server 
expect "password:" 
send "$password\r" 
expect "sftp>" 
send "ls\r" 
expect "sftp>\r" 
send "exit\r" 
EOD 

私はダウンロードするファイルを決定するlsコマンドの出力をループしたいです。出力をテキストファイルにリダイレクトしてそこからファイル名を取得しようとしましたが、 "sftp>"プロンプトやその他の無関係な情報も格納されています。クリーンlsの出力をexpectとして保存してループするにはどうすればよいですか?

+0

なし*クリーン*ソリューションはここにありません。あなたは 'sftp'セッションと手動で対話しているときと同じように、文字列操作コマンドを使用して興味のない情報をフィルタリングする必要があります(例えば、' sftp> 'プロンプトが表示され、あなたの心はそれを無視するように指示します。:) – pynexj

+0

sftpコマンドラインユーティリティの自動化に問題がある場合は、独自のユーティリティをperl、python、c#、javaなどで作成することを検討する必要があります。これらの言語にはすべてssh/sftpクライアントライブラリがあり、sftpプロトコルをより詳細に制御できます。 – Kenster

答えて

1

-bスイッチを使用して、標準入力で入力する代わりに、コマンド(ls)でスクリプトを渡します。

このようにsftpは、プロンプトなしでバッチモードで実行されます。

0

の例では、リストにすべてのファイル名をキャッチする方法があります:

#!/bin/sh 
# the next line restarts using expect \ 
    LC_TYPE=C exec expect -f "$0" -- "[email protected]" 

# do not show sftp output by default 
log_user 0 

set ftp_server 127.0.0.1 
set password pass 
set sftp_prompt {sftp> } 

spawn -noecho sftp $ftp_server 

expect "password:" 
send "$password\r" 

expect $sftp_prompt 

# 'ls -1' will show filenames line by line 
send "ls -1\r" 

# ignore echo of command from sftp 
expect -re {ls -1\r?\n} 

# init empty list for filename collecting 
set files {} 

expect -re {([^\r\n]+)\r?\n} { 
    # catch each filename line by line and put it to list 'files' 
    lappend files $expect_out(1,string) 

    # run current 'expect' again to catch next filename 
    exp_continue 
} -ex $sftp_prompt { 
    # catch sftp prompt to break 
} 

# loop over example :) 
foreach f $files { 
    puts $f 
} 
関連する問題