SSH到VM中,运行命令行并打印输出-Python

SSH到VM中,运行命令行并打印输出-Python,python,bash,awk,ssh,paramiko,Python,Bash,Awk,Ssh,Paramiko,我正在尝试SSH到我的VM中,运行命令行并打印输出 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

我正在尝试SSH到我的VM中,运行命令行并打印输出

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 <---------

但是如果我在虚拟机上运行它,我会看到这个

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

25871
调用shell()
用于交互式会话。这里不需要

使用
exec\u命令(cmd)
,这在行为上与
ssh yourhost“$cmd”
invoke\u shell()
用于交互式会话。这里不需要

使用
exec\u命令(cmd)
,这在行为上与
ssh yourhost“$cmd”

使用库完成答案完全相同(它使用paramiko)

优点:减少锅炉板代码的吨数,正常默认值,自动输出剥离和解码,并行和异步SSH客户端作为附加项。

使用库完成答案(它使用paramiko)


优点:减少锅炉板代码的吨数,正常默认值,自动输出剥离和解码,并行和异步SSH客户端作为附加项。

作为旁白--
ps-ef | grep vnc
可以返回
grep vnc
的PID,因为它包含字符串
vnc
。使用<代码> PGRP< <代码>来避免这一点和其他警告,或者更好地,使用适当的过程监控系统来管理服务——Sytd、UpSt着手、RunEnter、DJB DaEnOnToots等。或者,如果您倾向于去快速丑陋的黑客路线,无论如何,请考虑<代码> PS-EFAWAK/VNC//&!awk/{print$2;}'——这样,您仍然只使用一个命令行元素(
awk
,在本例中),但让它完成过滤自身的工作。顺便说一句——运行
sshroot@172.19.242.27$'ps-ef | grep vnc | awk'NR==1{print$2}'
在交互式bash提示符下工作(除了在代码返回> PID > GRP本身之外的警告)?在我们尝试用PARAMIKO实现自动化之前,最好始终确保它们在第一个地方是正确的。(),(如果你想要不依赖PARAMIKO的自动化,请考虑<代码> SSHPASS <代码>)。paramiko的最大优点是,它允许您将单个命令重新用于多个命令,而无需使用(这就是访问相同协议级别功能的OpenSSH方式的工作原理)。如果这一优势对您不重要,那也没什么大不了的。顺便说一下--
ps-ef | grep vnc
可以返回
grep vnc
的PID,因为它包含字符串
vnc
。使用<代码> PGRP< <代码>来避免这一点和其他警告,或者更好地,使用适当的过程监控系统来管理服务——Sytd、UpSt着手、RunEnter、DJB DaEnOnToots等。或者,如果您倾向于去快速丑陋的黑客路线,无论如何,请考虑<代码> PS-EFAWAK/VNC//&!awk/{print$2;}'——这样,您仍然只使用一个命令行元素(
awk
,在本例中),但让它完成过滤自身的工作。顺便说一句——运行
sshroot@172.19.242.27$'ps-ef | grep vnc | awk'NR==1{print$2}'
在交互式bash提示符下工作(除了在代码返回> PID > GRP本身之外的警告)?在我们尝试用PARAMIKO实现自动化之前,最好始终确保它们在第一个地方是正确的。(),(如果你想要不依赖PARAMIKO的自动化,请考虑<代码> SSHPASS <代码>)。paramiko的最大优点是,它允许您将单个命令重新用于多个命令,而无需使用(这就是访问相同协议级别功能的OpenSSH方式的工作原理)。如果这一优势对您来说并不重要,那也没什么关系。如何将命令的结果存储在变量中并重用该变量?我的pid。我想抓住它并杀死它,然后对它做更多的事情。
exec_command()
返回stdin、stdout和stderr——因此,如果您想将stderr读入一个变量,请简单地“nuff”。如果您不想向命令写入任何内容,请立即关闭stdin,然后从stdout和stderr中读取内容——前者用于结果,后者用于在发生故障时在任何异常中包含的解释性内容。(错误,应该是上面的“将stdout读入变量”,因为这就是您的结果所在).如何将命令的结果存储在变量中并重用该变量?我的pid。我想抓住它并杀死它,然后对它做更多的事情。
exec_command()
返回stdin、stdout和stderr——因此,如果您想将stderr读入一个变量,请简单地“nuff”。如果您不想向命令写入任何内容,请立即关闭stdin,然后从stdout和stderr中读取数据——前者用于结果,后者用于在发生故障时在任何异常中包含的解释性内容(错误,应该是上面的“将stdout读入变量”,因为这是您的结果所在)。
/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
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