私は多くのインターネット検索をしてきましたが、私がやろうとしているのはopenssh / scp v4.xでは可能ではないと思いますが、誰かがクリエイティブな解決策がある場合はここで質問したいと思いました。
リモートホストから複数のファイルをローカルディレクトリにコピーしたいのですが(ディレクトリ全体を望んでいませんが、ファイル名はわかっていて静的な名前です)、各ファイルに新しい名前を付けたいのです。ファイル名の前にコンピュータ名を付けます。
また、私がこれをしたいのは、リモートホストごとにログインが1回しかないからです(sshキーなし)(すべてのファイルにパスワードを入力する必要はありません)。
これが私が持っているものです:
machine="server1.nyc.ny"
logdir="/var/log/jboss"
logs="garbage.log splunk.log jboss.log"
for BOX in ${machine[@]};do
scp $BOX:$logdir/\{"${logs[0]}","${logs[1]}","${logs[2]}"\} ./
done
これは、すべてのファイルを取得するためにリモートホストに一度ログインすると機能しますが、最終的には複数のリモートホストがあるため、ログファイル名にコンピュータ名を追加しようとします。つまり:server1.nyc.ny-garbage.log
ファイルをインポートするのと同じ構文がターゲットに対して機能しません。私のssh / scpはv4なので、ControlPersistオプションは利用できません。
創造的な解決策はありますか?とても感謝しています!
ps:ここではログファイル名の配列は必要ありませんが、一部のユーザーがsshキーを持っているので使用しました。したがって、これらの配列を使用するネストされたループがそれらに適しています。 SSHキーを持たないユーザーのためのソリューションが必要なので、パスワードの入力量を最小限に抑える必要があります。
答え1
mv
何かが欠落している可能性がありますが、コピーされたファイルの名前を変更するには追加の手順が必要なようです。それは次のとおりです。
machine="server1.nyc.ny"
logdir="/var/log/jboss"
logs="garbage.log splunk.log jboss.log"
targets=""
for BOX in ${machine[@]};do
scp $BOX:$logdir/\{"${logs[0]}","${logs[1]}","${logs[2]}"\} ./
for log in ${logs[@]}; do
mv "$log" $BOX_"$log"
done
done