1

ssh シェルを開こうとしていて、配列を実行して、予想される実行中のプロセスのリストのステータスを取得しようとしています。

ここに私が持っているものがあります:

procList=("sdb*" 'fepkrn' 'fepcmd' 'fepmts' 'fepxml' 'fepdbs' 'feprdc' 'feproot' 'fephist2' 'fepagent' 'feprpl gwnma' 'feprpl gwsun' 'feprpl gwper' 'feprpl gwlur')

ssh $1 "for(( p = 0 ; p < ${#procList[@]} ; p++ )); do echo ${procListNOC[$p]}; done"

配列を繰り返し処理できない理由がわかりません。私が現在得ている出力:

sdb*
sdb*
sdb*
sdb*
sdb*
sdb*
sdb*
sdb*
sdb*
sdb*
sdb*
sdb*
sdb*
sdb*

したがって、for ループが機能していることはわかっていますが、配列全体を実行するにはエコー (pgrep コマンドに置き換える必要があります) も必要です。

4

2 に答える 2

4

多分これ:

ssh localhost "for p in ${procList[@]}; do echo \$p ; done"

つまり、配列は定義されていないため、リモート ホストに送信する前に配列を拡張する必要があります。あなたの場合、echo ${procListNOC[$p]};送信する前に展開しているだけで、に展開されsdb*ます。送信しているコマンドは次のように表示されます。

echo "for(( p = 0 ; p < ${#procList[@]} ; p++ )); do echo ${procListNOC[$p]}; done"

そしてそれはあなたに表示されます:

for(( p = 0 ; p < 14 ; p++ )); do echo sdb*; done

本当にインデックスを反復処理する必要がある場合:

ssh localhost "IFS=' ' read -a procList <<< \"${procList[@]}\";\
    for(( p = 0 ; p < \${#procList[@]} ; p++ )); \
    do echo \${procList[\$p]}; done"

アップデート

次のようなスクリプトを作成した場合 [ remote.sh]:

#!/bin/bash
procList=("sdb*" 'fepkrn' 'fepcmd' 'fepmts' 'fepxml' 'fepdbs' 
  'feprdc' 'feproot' 'fephist2' 'fepagent' 'feprpl gwnma' 
  'feprpl gwsun' 'feprpl gwper' 'feprpl gwlur')

for p in ${procList[@]}; do
    pgrep $p
done

できるよ:

scp remote.sh remotehost:~/
ssh remotehost sh remote.sh

スクリプトが大きい場合は、rsync を使用して転送サイズを減らすことを検討してください。

于 2013-06-18T02:16:52.293 に答える
1

ssh の 2 番目の引数は二重引用符 ( ) で囲まれているため、に渡される""にパラメーター展開されます。見る(そしてリモートマシンで実行する)ものは次のとおりです。sshssh

ssh <some hostname> "for(( p = 0 ; p < 14 ; p++ )); do echo sdb*; done"

それがあなたが見るものです: の 14 エコーsdb*

于 2013-06-18T02:17:00.020 に答える