for account in ${accounts}
do
`ssh -q id@server "touch EVENTS_${account}_${date}.log"`
done
何度もSSHを実行する代わりに、SSHを介してforループを実行してファイルをタッチできますか?
答え1
ssh を使用すると、複数のコマンドを実行できます。各コマンドをセミコロンで区切ってください。
command=": "
for account in ${accounts}
do
command=$command"; touch EVENTS_${account}_${date}.log"
done
ssh -q id@server "$command"
すべての「:」は「次のコマンドを続行する」を意味します。これにより、コマンドはセミコロンで始まりません。
また、コマンドの周りにバックティックを使用する必要はありません。
答え2
リモートコンピュータでループを実行します。
ssh -q id@server "for account in ${accounts}; do touch EVENTS_\${account}_${date}.log; done"
$accounts
には$date
シェル特殊文字()が含まれていないとします"$'()&;<>[\]`{|}~
。特に$accounts
リモートシェルに挿入され、そこで解釈されます。特殊文字を保護する必要がある場合は、引用にさらに注意する必要があります。
q=\'\\\'\' # '\'' effectively quotes a single quote inside single quotes
ssh -q id@server 'for account in '\'"${accounts//\'/$q}"\''; do touch "EVENTS_${account}_${date}.log"; done'
または、次のコマンドを使用してリモートファイルシステムをマウントします。sshfsまるで地元の人のように運営されています。
mkdir mnt
sshfs id@server mnt
for account in ${accounts}; do touch "mnt/EVENTS_\${account}_${date}.log"; done
答え3
クラスタshあなたがしたいことのための完璧なツールのようです。
ClusterSSHは、同時に複数のサーバーで同じ変更を実行できるツールです。 "cssh"コマンドは、指定されたすべてのホストの管理コンソールとxtermを開きます。管理コンソールに入力されたすべてのテキストはすべてのウィンドウにコピーされます。すべてのウィンドウで直接入力することもできます。
このツールは、クラスタ内のすべてのノードで同じ構成またはコマンドを実行する必要があるクラスタ管理に適していますが、これに限定されません。このツールを使用してこれらのコマンドを一度実行すると、すべてのノードが同期されたままになります。