我正在开发一个脚本,它将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
脚本有什么问题?有没有更好的方法呢?
答案 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语法,您可以使用命令作为参数。 (例如假文件)