在bash中调用python进程,然后将输出捕获到变量中

时间:2016-09-21 06:04:50

标签: python linux bash shell output

我已经广泛搜索了这个答案,但似乎仍然没有找到我。 我正在尝试编写一个bash脚本,用于检查具有ip:port的多个服务器是否存活。 由于ping不支持不同的端口(AFAIK),我发现了一个漂亮的python 1线程,可以集成到bash中:

portping() { python <<<"import socket; socket.setdefaulttimeout(1); socket.socket().connect(('$1', $2))" 2> /dev/null && echo OPEN || echo CLOSED; }

这会创建一个可以在bash脚本中调用的函数portping,然后我想在包含主机列表的txt文件上使用它:

Contents of hosts.txt
myserver.host.com 3301
myserver.host.com 3302

然后我希望bash脚本从hosts.txt中读取两个变量$ ip和$ port,移植这些变量,然后将'OPEN'或'CLOSED'的回显结果存储到变量中以进行进一步的操作(发送一个pushbullet消息告诉我服务器已关闭)。

while read ip port;
do
    echo "Checking if $ip port $port is alive"
    portping $ip $port # debug check to see if python function is actually working
    status = 'portping $ip $port' # herein lies my issue, how do I get the python functions echo output into the variable ?
    echo "$ip $port is $status"
    if [ "$status" == "CLOSED" ]
        then
        echo "Sending pushbullet notification"
        # pushbullet stuff;
    else
        echo "It's Alive!"
    fi
done < ${HOSTS_FILE}

然而,我得到的输出是:

$ ./pingerWithPython.sh hosts.txt
Using file hosts.txt
Checking if myserver.host.com port 3301 is alive
OPEN
status: Unknown job: =
myserver.host.com 3301 is
It's Alive!
Checking if myserver.host.com port 3302 is alive
CLOSED
status: Unknown job: =
myserver.host.com 3302 is
It's Alive!

谎言!它不活着:) 显然问题在于status = line。必须有一个简单的解决方案,但我太难以弄清楚了!

2 个答案:

答案 0 :(得分:2)

要在变量中获取命令的结果,您需要使用反引号(`)而不是简单的引号(')或$()惯用语:

status=`portping $ip $port`

status=$(portping $ip $port)

等号周围没有空格

答案 1 :(得分:2)

添加到Serge Ballesta's answerdon't put spaces around the = in assignments,因为shell对空间敏感。

理想情况下应该是

status=$(portping $ip $port)