首页 > 编程语言 >python ssh 交互式命令行脚本

python ssh 交互式命令行脚本

时间:2022-10-13 16:34:16浏览次数:32  
标签:username python ip self ssh 交互式 password port

import paramiko
import json
import time
import sys
import os
from paramiko.ssh_exception import NoValidConnectionsError
from paramiko.ssh_exception import AuthenticationException


class SSHConnection():
    def __init__(self, hostname, port, username, password, answering):
        self.hostname = hostname
        self.port = port
        self.username = username
        self.password = password
        self.answering = answering


    def connect(self):
        self.ssh = paramiko.SSHClient()
        self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        self.ssh.connect(hostname=self.hostname, port=self.port, username=self.username, password=self.password)


    def run(self, input):
        try:
            self.connect()
        except (AuthenticationException, NoValidConnectionsError, TimeoutError) as e:
            print(e)

        if self.answering:
            self.answering_shell(input)
        else:
            for cmd in input:
                self.cmd(cmd)

        self.close()


    def cmd(self, input):
        stdin, stdout, stderr = self.ssh.exec_command(input)
        print(stdout.read().decode())


    def close(self):
        self.ssh.close()


    def answering_shell(self, cmds):
        try:
            channel = self.ssh.invoke_shell()
            time.sleep(1)
            for cmd in cmds:
                channel.send(cmd.encode())
                channel.send(b'\n')
                time.sleep(1)
                r = channel.recv(40960).decode()
                sys.stdout.write(r)
            channel.close()
        except Exception as e:
            print(e)


if __name__ == '__main__':
    config = {
                'serverIP': '',
                'serverPort': '',
                'username': '',
                'password': '',

                'answering_shell': True,             #是否开启应答式Shell(默认开启)

                #需要输入的命令集合,可多条命令依次执行,直接输入多条命令即可
                #'cmds': '''
                #           ip add
                #           reboot
                #           shutdown
                # '''
                'cmds': '''                          
                            
                '''
    }

    ip, port, username, password, answering, cmds = \
        config['serverIP'], config['serverPort'], config['username'], config['password'], \
        config['answering_shell'], config['cmds']

    if cmds:
        cmds = [cmd.strip() for cmd in cmds.split('\n') if  cmd.strip()]
        if not cmds:
            print('未指定要执行的命令,请在“config”中指定,3秒后退出程序。')
            time.sleep(3)
            os._exit(1)

    if not ip:
        print('请按下列示例输入服务器IP或者IP+端口号')
        print('Example: 192.168.1.1')
        print('Example: 192.168.1.1:8088')
        ip_port = input('请输入服务器IP:')
        if ip_port.find(':') > 0 or ip_port.find(':') > 0:
            ip_port = ip_port.replace(':', ':')
            ip = ip_port.split(':')[0]
            port = ip_port.split(':')[1]
        else:
            ip = ip_port
            if not port:
                port = '22'
    else:
        if not port:
            port = '22'

    if not username:
        username = input('请输入用户名:')

    if not password:
        password = input('请输入密码:')


    ssh = SSHConnection(ip, port, username, password, answering)
    ssh.run(cmds)
    ssh.close()


    # dingding(output)

 

标签:username,python,ip,self,ssh,交互式,password,port
From: https://www.cnblogs.com/itfat/p/16788612.html

相关文章

  • 常用脚本(python)
    目录:    第一部分:布尔盲注类型:importrequestsurl="http://32a87616-b3a4-4290-808b-9c3d3e1163d2.node4.buuoj.cn:81/index.php"forchangduinrange(1,......
  • python 异常总结:raise except
    raise语句是用来主动抛出一个指定的异常。raise语法格式:raise[Exception[,args[,traceback]]]raise主动抛出异常种类总结:except有匹配的error类型except......
  • Python 学习笔记
    代码编写过程中的需要注意事项1.PEP是PythonEnhancementProposal的缩写,通常翻译为“Python增强提案”2.类总是使用驼峰格式命名,即所有单词首字母大写其余字母小写,类......
  • Python基础四【字符串】
    1#双引号:使用双引号的一个好处,就是字符串中可以使用单引号字符。2#“转义字符”让你输入一些字符,它们用其他方式是不可能放在字符串里的。转义字符包含一个倒斜杠(\),......
  • virtualenv--python沙盒环境安装
    有人说:virtualenv、fabric和pip是pythoneer的三大神器,今天学习安装下virtualenvvirtualenv可以搭建虚拟且独立的python环境,可以使每个项目环境与其他项目独立开来,保持......
  • Python解析Xml
    Python解析Xmlfromlxmlimportetreedefget_info_from_xml(xml_text):try:parser=etree.XMLParser(recover=True)tree=etree.fromstring(......
  • Windows下python组件hyperscan的编译与安装
    什么是Hyperscan:hyperscan是英特尔推出的一款高性能正则表达式引擎,一次接口调用可以实现多条规则与多个对象之间的匹配,可以支持多种匹配模式,块模式和流模式,它是以PCRE为原......
  • Python周期任务神器之Schedule模块使用详解
    Python中schedule模块关于定时任务使用方法_python_脚本之家(jb51.net)Python中schedule模块定时任务的使用方法(2)_python_脚本之家(jb51.net)......
  • Python进阶:如何将字符串常量转化为变量?
     前几天,我们​​Python猫交流学习群​​里的M同学提了个问题。这个问题挺有意思,经初次讨论,我们认为它无解。然而,我认为它很有价值,应该继续思考怎么解决,所以就在私密的知......
  • Python与家国天下
     导读:Python猫是一只喵星来客,它爱地球的一切,特别爱优雅而无所不能的Python。我是它的人类朋友豌豆花下猫,被授权润色与发表它的文章。如果你是第一次看到这个系列文章,那我......