Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash ssh+;ksh+;grep&x2B;厕所_Bash_Ssh_Scripting - Fatal编程技术网

Bash ssh+;ksh+;grep&x2B;厕所

Bash ssh+;ksh+;grep&x2B;厕所,bash,ssh,scripting,Bash,Ssh,Scripting,如果某些应用程序正在某些远程机器上运行,我将尝试“ping” 为此,我有一个包含服务器和应用程序的文件,如: server1:application1 server2:application1 server3:application2 Etc. 我希望获得服务器上运行的具有此名称的应用程序的数量 要连接和检查,我需要ssh连接 我的脚本是bash,如下所示: Ping_Applications () { SetParam cat $APPFILE | while rea

如果某些应用程序正在某些远程机器上运行,我将尝试“ping”

为此,我有一个包含服务器和应用程序的文件,如:

server1:application1
server2:application1
server3:application2
Etc.
我希望获得服务器上运行的具有此名称的应用程序的数量

要连接和检查,我需要ssh连接

我的脚本是bash,如下所示:

Ping_Applications () {    
    SetParam
    cat $APPFILE | while read next
    do
     server=`echo $next | cut -d : -f1`
     app=`echo $next | awk -F":" '{print $2}'`

     commando="/bin/ssh $server '/bin/ps -fea | /bin/grep $app | /bin/grep -v grep | /bin/wc -l'"
     eval COMA=\$\($commando\)
     echo $commando

     if [ $COMA != 0 ]
     then
      echo -e "$TIME : Application $app of on server $server is \E[32m[ RUNNING ]\E[0m";
     else
      echo -e "$TIME : Application $app of on server $server is \E[31m[ NOT RUNNING ]\E[0m";
     fi
    done;  
}
Ping_Applications () {    
SetParam
cat $APPFILE | while read next
do
 server=`echo $next | cut -d : -f1`
 app=`echo $next | awk -F":" '{print $2}'`

 commando=( /bin/ssh $server '/bin/pgrep -f "'"$app"'" | /bin/wc -l' )
 COMA=$( "${commando[@]}" )

 if [ $COMA -gt 0 ]
 then
  echo -e "$TIME : Application $app of on server $server is \E[32m[ RUNNING ]\E[0m";
 else
  echo -e "$TIME : Application $app of on server $server is \E[31m[ NOT RUNNING ]\E[0m";
 fi
done;  
我的问题是当我发送

ssh $server 'ps -fea | grep $app | grep -v grep | wc -l'
这将返回数字,但是当使用脚本发送时,我没有回答,因为(我认为)管道打开了一个新的shell

我不知道怎么解决这个问题

有什么想法吗

谢谢

路易斯

这是

您希望将命令放入数组中,而不是使用
eval
来调用它:

commando=( /bin/ssh $server '/bin/ps -fea | /bin/grep "'"$app"'" | /bin/grep -v grep | /bin/wc -l' )
COMA=$( "${commando[@]}" )
commando
是一个包含3个元素的数组,因此最后一个元素可以作为单个单词传递给远程服务器。注意
$app


另外,由于$COMA将是一个数字,请使用数字比较:
如果[$COMA-ne 0]

您可能需要分隔/bin/ssh命令及其参数。同时将“突击队”用双引号引起来:

而不是:

commando="/bin/ssh $server '/bin/ps -fea | /bin/grep $app | /bin/grep -v grep | /bin/wc -l'"
eval COMA=\$\($commando\)
试试这个:

commando="/bin/ps -fea | /bin/grep $app ..."
/bin/ssh $server "$commando"
Bash变量以双引号展开,但不是单引号。

谢谢您的帮助

我混合了Eric Renouf和Glenn Jackman的答案,解决方案如下:

Ping_Applications () {    
    SetParam
    cat $APPFILE | while read next
    do
     server=`echo $next | cut -d : -f1`
     app=`echo $next | awk -F":" '{print $2}'`

     commando="/bin/ssh $server '/bin/ps -fea | /bin/grep $app | /bin/grep -v grep | /bin/wc -l'"
     eval COMA=\$\($commando\)
     echo $commando

     if [ $COMA != 0 ]
     then
      echo -e "$TIME : Application $app of on server $server is \E[32m[ RUNNING ]\E[0m";
     else
      echo -e "$TIME : Application $app of on server $server is \E[31m[ NOT RUNNING ]\E[0m";
     fi
    done;  
}
Ping_Applications () {    
SetParam
cat $APPFILE | while read next
do
 server=`echo $next | cut -d : -f1`
 app=`echo $next | awk -F":" '{print $2}'`

 commando=( /bin/ssh $server '/bin/pgrep -f "'"$app"'" | /bin/wc -l' )
 COMA=$( "${commando[@]}" )

 if [ $COMA -gt 0 ]
 then
  echo -e "$TIME : Application $app of on server $server is \E[32m[ RUNNING ]\E[0m";
 else
  echo -e "$TIME : Application $app of on server $server is \E[31m[ NOT RUNNING ]\E[0m";
 fi
done;  
}

现在我有一个不同的问题:

此解决方案有效,但仅适用于第一次输入,然后脚本停止

我的$APPFILE中有大约10个不同的应用程序,但只执行第一个

问候


路易斯

欢迎来到stackoverflow。使用突出显示的代码/数据/错误MSG编辑框左上角的
{}
工具保持正确的格式。祝你好运您不只是直接运行命令而不是将其放入字符串中以进行
eval
,这有什么原因吗?另外,没有关系,但您可以尝试使用
pgrep
而不是
ps
和2
grep
s