SFTP経由でファイルリストをテキストファイルとして保存

SFTP経由でファイルリストをテキストファイルとして保存

私は以下に私自身の答えを与えた。

SFTPを使用して正常に動作するいくつかのbashスクリプトがあります。私がしたいのは、単にフォルダのlsまたはdirをSFTPサーバー上のファイルにリダイレクトすることです。

cronジョブとして実行するか、手動で実行できます。リモートサーバーのファイルリストを見ることができますが、リモートサーバーからローカルサーバーへのファイルリストをテキストファイルとして生成したいと思います。 。

これが私がこれまでbashスクリプトについて知っていることです。以下の4番目のエコーは問題のある行です。

#!/bin/bash

localpath=/home/localacct/somepath
remotelocation=/home/account/logs/archive
remotehost=' [email protected]'

    echo  > $localpath/list.sftp
    echo "cd $remotelocation " >> $localpath/list.sftp
    echo "dir *.* " >> $localpath/list.sftp
    echo "dir *.* > $localpath/dirlist.txt " >> $localpath/list.sftp
    echo "bye " >> $localpath/list.sftp
    sftp -b $localpath/list.sftp $remotehost

exit

答え1

コマンドはsftp非常に制限的です。目的のタスクを実行できない場合は、他のアプローチを使用できます。SSHFSファイルシステムSSHFSはSFTPをトランスポートプロトコルとして使用するため、サーバー側にはSFTPクライアントが1つだけ表示されます。利用できる必要があります。ヒューズクライアント側から。

SSHFSを使用すると、リモートディレクトリを既存の空のディレクトリにマウントし、通常のコマンドを使用できます。

mkdir remote
sshfs "$remotehost:$remotelocation" remote
cd remote

echo *.* >"$localpath/dirlist.txt"

fusermount -u remote
rmdir remote

答え2

これはこれまで最高のものです:

echo 'ls' | sftp hostname

次のように出力をファイルに渡すことができます。

echo 'ls' | sftp hostname > /tmp/mylist.txt

答え3

dirクライアント内のコマンドはsftpリダイレクトをサポートしません。次の例は、何もしない方法を示しています。

sftp> pwd
Remote working directory: /var/tmp/foodir
sftp> lcd /var/tmp/foodir
sftp> dir *.*
foo.txt
sftp> dir *.* >dirlist.txt
foo.txt
sftp> dir
foo.txt
sftp>

マニュアルページsftp確認してください。

ls[-1afhlnrSt][path]

    リモートディレクトリリストの表示pathまたは現在のディレクトリの場合path指定されていません。  pathglob(3) 文字を含めることができ、複数のファイルと一致させることができます。

    次の兆候が認識され、行動が変わります。lsしたがって:

    -1

        単一の出力列を生成します。
    -a
        ドット( '')で.始まるファイルを一覧表示します。
    -f
        リストを並べ替えないでください。デフォルトのソート順は辞書順です。
    -h
        長いフォーマットオプションと一緒に使用する場合は、バイト、キロバイト、メガバイト、ギガバイト、テラバイト、ペタバイト、およびエクサバイト単位のサフィックスを使用して2の累乗を使用してビット数を変換します。 4桁以下に減らします(K = 1024、M = 1048576など)。
    -l
        権限と所有権情報を含む追加の詳細を表示します。
    -n
        ユーザーとグループの情報を数値形式で含む長いリストを生成します。
    -r
        リストのソート順を逆に置き換えます。
    -S
        ファイルサイズでリストを並べ替えます。
    -t
        最後の変更時刻に基づいてリストをソートします。

答え4

以下も使用できますlftp

lftp -c 'connect sftp://user:password@host/dir; ls' > list.txt

または

lftp -e 'ls;quit' sftp://user:password@host/dir > list.txt

lftpfind再帰リストのコマンドもあります。

コマンドラインからパスワードを渡すのは一般的に悪い考えです。別のアプローチは、可能であればSSHキー認証を使用することです(キー認証が可能な場合は、上記のパスワードは無視されるため、空の文字列に設定します)。あるいは、環境を通して渡すこともできます。

 LFTP_PASSWORD=password lftp --env-password -e 'ls;quit' \
   sftp://user:password@host/dir > file.list

または、ここで説明されているようにstdinを介してコマンドを渡します(シェルによって削除された一時ファイルまたはパイプを使用して実装されます)。

lftp <<'EOF' > file.list
connect sftp://user:password@host/dir
ls
EOF

関連情報