将命令输出存储在变量中

时间:2014-06-26 09:15:52

标签: bash shell awk

我正在开发一个脚本,它将ssh执行到少数系统(在lab.txt中列出),运行两个命令,将命令输出存储在两个不同的变量中并打印它们。

以下是使用的脚本:

#!/bin/bash

while read host; do

ssh -n root@$host "$(STATUS=$(awk 'NR==1{print $1}' /etc/*release)  \
OS=$(/opt/agent/bin/agent.sh status | awk 'NR==1{print $3 $4}'))"

echo $STATUS
echo $OS

done < lab.txt

lab.txt文件包含几个Ips,我需要登录,执行和打印命令输出。

~#] cat lab.txt
192.168.1.1
192.168.1.2

执行脚本时,会显示192.168.1.1的ssh登录提示,输入密码后输出显示为空白。与下一个ip 192.168.1.2

相同

当我在192.168.1.1中手动执行这些命令时,将返回以下命令。

~]# awk 'NR==1{print $1}' /etc/*release        
    CentOS

~]# /opt/agent/bin/agent.sh status | awk 'NR==1{print $3 $4}'
    isrunning

脚本有什么问题?有没有更好的方法呢?

3 个答案:

答案 0 :(得分:0)

正如评论所说,您正在服务器端的bash会话中设置变量,并尝试从客户端读取它们。

如果要在客户端脚本中分配变量,则需要将赋值放在ssh命令前面,并将两个赋值分开。如下所示。

STATUS=`ssh -n root@$host 'awk \'NR==1{print $1}\' /etc/*release)`
OS=`ssh -n root@$host '/opt/agent/bin/agent.sh status | awk \'NR==1{print $3 $4}\''`

答案 1 :(得分:0)

您需要执行两个ssh命令。如果您在客户端而不是服务器上运行awk,它也会简化操作,因为ssh命令中的引用变得复杂。

while read host; do
    STATUS=$(ssh -n root@$host 'cat /etc/*release' | awk 'NR==1{print $1}')
    OS=$(ssh -n root@$host /opt/agent/bin/agent.sh status | awk 'NR==1{print $3 $4}')
    echo $STATUS
    echo $OS
done < lab.txt

答案 2 :(得分:0)

使用一个ssh语句:

read STATUS OS < <(ssh -n root@$host "echo \ 
                  \$(awk 'NR==1{print \$1}' /etc/*release) \
                  \$(/opt/agent/bin/agent.sh status | awk 'NR==1{print \$3 \$4}')")
echo $STATUS
echo $OS

说明:

&lt;(命令)语法称为process substitution。您可以在任何需要文件的地方使用它。

示例:

sdiff <(echo -e "1\n2\n3") <(echo -e "1\n3")

命令sdiff需要两个文件作为参数。使用process substitution语法,您可以使用命令作为参数。 (例如假文件)