SSH进入VM并运行命令行并打印输出 - Python

时间:2017-04-24 20:34:07

标签: python bash awk ssh paramiko

我尝试通过SSH连接到我的虚拟机并运行命令行并打印输出

import paramiko
import time
import os
import sys

# Note
# sudo pip install --user paramiko


def ssh_con (ip, un, pw):
    global ssh
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    print ("SSH CONNECTION ESTABLISHED TO %s" % ip)
    ssh.connect(ip, username=un, password=pw,key_filename='/Users/keys/id_ssc-portal', timeout=200)


def cmd(command):
    global ssh_cmd

    print ("Run : " + command)
    ssh_cmd.send("%s \n" %command)
    time.sleep(1)
    output = ssh_cmd.recv(10000).decode("utf-8")

    return output

ip = '172.19.242.27'
un = 'root'
pw = '####'

ssh_con(ip,un,pw)
ssh_cmd = ssh.invoke_shell()

p_id = cmd("ps -ef | grep vnc | awk 'NR==1{print $2}'")

print p_id <---------

我一直在

/usr/bin/python /Applications/MAMP/htdocs/code/python/restart_vnc.py
SSH CONNECTION ESTABLISHED TO 172.19.242.27
Run : ps -ef | grep vnc | awk 'NR==1{print $2}'
ps -ef | grep vnc | awk 'NR==1{print $2}' 


Process finished with exit code 0

但如果我在VM上运行它,我应该看到这个

[root@vm ~]# ps -ef | grep vnc | awk 'NR==1{print $2}'

25871 &lt; ---我的pid列应该打印出来

我做错了什么或忘记了什么?

如何在变量中存储命令结果并重用该变量?

实施例。我的pid。我想抓住它并杀死它,并为此做更多其他事情。

对此的任何提示/方向将非常感谢!

2 个答案:

答案 0 :(得分:1)

invoke_shell()适用于互动会话。你在这里不需要一个。

改为使用exec_command(cmd)与<{1}}的行为完全相同

答案 1 :(得分:1)

使用parallel-ssh库完成答案(它使用paramiko)。

from pssh import ParallelSSHClient
ip = '172.19.242.27'
un = 'root'
pw = '####'

client = ParallelSSHClient(hosts=[ip], user=un, password=pw)
output = client.run_command("ps -ef | grep vnc | awk 'NR==1{print $2}'")
pid = list(output.stdout)
print pid

好处:减少锅炉板代码,理智默认值,自动输出剥离和解码,并行和异步SSH客户端作为附加功能。