0

Linux シェル スクリプトを介してリモート サーバーへの SFTP 接続を開きました。次に、ディレクトリ/distributionで最後に作成されたディレクトリに入り、そこからファイルをダウンロードする必要があります。コードは次のようになります。

lftp -u ${sourceEnv},${sourcePass} sftp://${sourceHost}<<EOF
cd $sourceBuildDir/distribution
variable=$(ls -t -r | tail -n 1)
cd $variable
mget *
bye
EOF

ただし、コマンドls -t -r | SFTP 接続では機能しません。tail -n 1自体でも、変数の作成でもありません。何か案は ?前もって感謝します

4

1 に答える 1

2

Marc Bの答えと同じ精神で、lftp内ですべてを実行できるとは思いません。特に、ユーザー変数をサポートしているとは思いません...(確認する必要があります...)

したがって、いくつかの目的のために、lftpスクリプト内でlftpを開始するシェルを呼び出すことができます。例えば:

# This is a lftp script (like yours)
ls -tr| ! "tail -1|awk '{print $NF}'"

'!'以降のすべて UNIXシェルに渡されます。呼び出される「テール」はシステムテールであり、一部のlftpコマンドではありません。同じことがawkにも当てはまります。これは、dirの名前のみを取得するために使用します(lftpのlsはすべてのファイルパーミッションなどを提供します...)

より複雑なことについては(あなたの要求に応じて)、他のシェルコマンドと同じようにlftpを使用するシェルスクリプトを使用したほうがよいと思います。あなたの例は次のようになります:

    # Call lftp to log in and do 'ls', capture the ouput and process it.
    sourceBuildDir=$(lftp -c "open ${sourceEnv}:${sourcePass}@${sourceHost}; ls" \
                     |tail -1|awk '{print $NF}');
    echo "I am about to download $sourceBuildDir";
    # Call lftp with the processed dir name and do the rest 
    # (btw. did you consider using the 'mirror' command?)
    lftp -c "open ${sourceEnv}:${sourcePass}@${sourceHost}; \
             cd $sourceBuildDir/distribution; mget *";

PS時々、lftpコマンドは「[FEATネゴシエーション...]」のような余分なものを生成し、スクリプトを壊す可能性があります。おそらく、lftpコマンドを2回繰り返すことで解決できるので、2回目は、lftpによるそれ以上のネゴシエーションなしで成功します。

これが正しい軌道に乗るのに役立つことを願っています!乾杯。

于 2012-05-01T17:02:53.637 に答える