私は以下に私自身の答えを与えた。
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
指定されていません。path
glob(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
lftp
find
再帰リストのコマンドもあります。
コマンドラインからパスワードを渡すのは一般的に悪い考えです。別のアプローチは、可能であれば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