簡體   English   中英

使用paramiko執行命令

[英]Command execution using paramiko

我正在研究一個python腳本,該腳本接受在遠程linux上執行的命令。 我沖浪並找到了Paramiko。 我開發了一個腳本,該腳本在執行“ ”,“ ps ”,“ ls ”之類的命令時可以正常工作。 但是同一腳本無法執行“ top ”和“ ping ”命令。 請幫助我。

import paramiko
import sys

class sampleParamiko:
    ssh = ""
    def __init__(self, host_ip, uname, passwd):
        try:
            self.ssh = paramiko.SSHClient()
            self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            self.ssh.connect(host_ip, username=uname, password=passwd)
            #print "In init function"
        except (paramiko.BadHostKeyException, paramiko.AuthenticationException, paramiko.SSHException) as e:
            print str(e)
            sys.exit(-1)

    def ececuteCmd(self,cmd):
        try:
            stdin, stdout, stderr = self.ssh.exec_command(cmd)
            out_put = stdout.readlines()
            for item in out_put:
                print item,
        except paramiko.SSHException as e:
            print str(e)
            sys.exit(-1)
host_ip = "10.27.207.62"
uname = "root"
password = "linux"
cmd = str(raw_input("Enter the command to execute in the host machine: "))
conn_obj = sampleParamiko(host_ip, uname, password)
conn_obj.ececuteCmd(cmd)

你可能想看看invoke_shell()的方法paramiko.SSHClient

從您的代碼中,您可以執行以下操作:

import paramiko
import sys

class sampleParamiko:
    ssh = ""
    def __init__(self, host_ip, uname, passwd):
        try:
            self.ssh = paramiko.SSHClient()
            self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            self.ssh.connect(host_ip, username=uname, password=passwd)
            #print "In init function"
        except (paramiko.BadHostKeyException, paramiko.AuthenticationException,     paramiko.SSHException) as e:
            print str(e)
            sys.exit(-1)

    def ececuteCmd(self,cmd):
        try:
            channel = self.ssh.invoke_shell()
            timeout = 60 # timeout is in seconds
            channel.settimeout(timeout)
            newline        = '\r'
            line_buffer    = ''
            channel_buffer = ''
            channel.send(cmd + ' ; exit ' + newline)
            while True:
                channel_buffer = channel.recv(1).decode('UTF-8')
                if len(channel_buffer) == 0:
                    break 
                channel_buffer  = channel_buffer.replace('\r', '')
                if channel_buffer != '\n':
                    line_buffer += channel_buffer
                else:
                    print line_buffer
                    line_buffer   = ''
        except paramiko.SSHException as e:
            print str(e)
            sys.exit(-1)
host_ip = "10.27.207.62"
uname = "root"
password = "linux"
cmd = str(raw_input("Enter the command to execute in the host machine: "))
conn_obj = sampleParamiko(host_ip, uname, password)
conn_obj.ececuteCmd(cmd)

輸出為:

Jean@MyDesktop:~$ ./test_paramiko.py 
Enter the command to execute in the host machine: ping -c2 127.0.0.1
ping -c2 127.0.0.1 ; exit 
[root@myserver ~]# ping -c2 127.0.0.1 ; exit 
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.032 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.043 ms

--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.032/0.037/0.043/0.008 ms
logout

但是您不能以交互方式發送命令。 因此,如果您僅ping 127.0.0.1 ,它將一直持續下去,直到您[CTRL] + [C]或殺死您的python腳本。 top相同。

如果需要交互式外殼,請查看paramiko隨附的示例腳本。 特別是demos / demo.pydemos / interactive.py

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM