web-dev-qa-db-ja.com

lftpリターンコード

リモートサーバーからリストを取得するために、以下のコードを記述しました。

_echo "set xfer:log yes" > batchfile.txt
echo "set xfer:log-file Templogfile1.txt">> batchfile.txt
echo "open -p $rport -u $ruser,$rpass sftp://$ripaddress">> batchfile.txt
echo "cache flush">> batchfile.txt
echo "cd $rrdir">> batchfile.txt
echo "pwd">> batchfile.txt
echo "ls -l $srfile">> batchfile.txt
echo "quit">> batchfile.txt

exec 3>&1 4>&2                 
exec > TempSessionLog.txt 2>&1 
set -x                         
( 
  lftp -f batchfile.txt >TempLogFile.log <<- EndFTP 
  EndFTP
)  
retval1="$?" 
exec 1>&3 2>&4   
set +x         
_

間違ったディレクトリ名を渡しました。標準のsftpはエラーコード_($? != 0)_を返しますが、lftpは成功_(retval1 = 0)_リターンコードを送信します。

上記のTempSessionLogFileには、正常な戻り値を示すエラーメッセージcd: Access failed: No such file (<<Directory Path>>)が表示されます。

リターンコードでlftpのエラーをキャプチャする方法はありますか?そうでない場合、私の選択肢は何ですか?

1
user196962

FTPプロトコルで微妙なことをしていない限り、ここではそうではありません。簡単な方法は、通常のコピーコマンドを使用することです。 mount FTPサーバーをディレクトリに追加します。 LftpFS を使用できます。これは、内部でlftpを使用する Fuse ファイルシステムです。代替案には CurlFtpFS が含まれます。 FTPではなくSFTPの場合は、 [〜#〜] sshfs [〜#〜] を使用します。

#!/bin/sh
trap 'fusermount -u mnt; rmdir mnt' EXIT INT TERM HUP
set -e
mkdir mnt
sshpass -p"$rpass" sshfs "$ruser@$ripaddress:/" mnt
cd "mnt/$rrdir"
ls -l "$srfile"