1

我正在尝试打开一个 ssh shell,然后通过一个数组运行以获取预期运行进程列表的状态。

这是我所拥有的:

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 循环正在工作,但是我还需要 echo(用 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 的第二个参数在双引号 ( "") 中,因此传递给ssh. ssh看到(并在远程机器上执行)的是:

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

这就是你所看到的:14 个sdb*.

于 2013-06-18T02:17:00.020 回答