python远程执行ssh脚本

demo需要pytheon3pip3,还需要paramikoimport paramiko

# 连接远程服务器并执行linux命令(只能用于简单的命令执行,无法进行密码输入操作)
def sshd():
    # 创建SSH对象
    ssh = paramiko.SSHClient()
    # 允许连接不在know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    # 远程服务器地址
    ipps = ['88.88.88.88'];

    for ip in ipps:
        # 连接服务器
        ssh.connect(ip, 22, 'root', '123456', timeout=10)
        print("link===> : " + ip)

        # ---运行tomcat---begin
        exec_command(ssh, 'cd /usr/local/tomcat/bin')
        exec_command(ssh, './start.sh')
        # ---运行tomcat---end

        # ---显示命令返回信息---begin
        resultStr = exec_command(ssh, 'ls')
        print(resultStr)
        # ---显示命令返回信息---begin

        # ---校验信息---begin
        haveflag = checkStr(resultStr, 'tomcat')
        print(haveflag)
        # ---校验信息---end

        # 关闭连接
        ssh.close()
        print("linkClose===> : " + ip)


def exec_command(ssh, command):
    stdin, stdout, stderr = ssh.exec_command(command)
    # 获取命令结果
    res, err = stdout.read(), stderr.read()
    result = res if res else err
    resultStr = result.decode()
    return resultStr


# resultStr中是否包含strinfo(如果有,则返回它所在的位置;如果没有,则返回-1def checkStr(resultStr, strinfo):
    try:
        return resultStr.index(strinfo);
    except BaseException:
        print('Warning: 未找到相关字符')
        return -1


# 运行
sshd()
=================================================================================================

import time
import paramiko


# 连接远程服务器并执行linux命令
def sshd():
    # 创建SSH对象
    ssh = paramiko.SSHClient()
    # 允许连接不在know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    # 远程服务器地址
    ipps = ['88.88.88.88'];

    for ip in ipps:
        # 连接服务器
        ssh.connect(ip, 22, 'root', '123456', timeout=10)
        # 直接登录终端,返回通道对象
        channel = ssh.invoke_shell()
        print("link===> : " + ip)

        # ---scp---begin
        exec_command(channel, 'scp root@127.0.0.1:/root/abc.txt /usr/local/', 3)
        # 第一次连接会有个信任提示
        exec_command(channel, 'yes', 2)
        # 输入密码(可能有些不需要密码,但是输入一次也没关系,直接会报没有本命令)
        exec_command(channel, '123456', 2)
        # ---scp---end

        # ---运行tomcat---begin
        exec_command(channel, 'cd /usr/local/tomcat/bin', 1)
        exec_command(channel, './start.sh', 6)
        # ---运行tomcat---end

        # ---登录数据库---begin
        exec_command(channel, 'mysql -u root -p', 1)
        # 输入密码
        exec_command(channel, '123456', 1)
        # ---登录数据库---end

        # ---获取控制台信息---begin
        resultStr = getConsoleTXT(channel)
        print("==" + resultStr)
        # ---获取控制台信息---end

        # ---校验信息---begin
        haveflag = checkStr(resultStr, 'xxxxxx')
        print(haveflag)
        # ---校验信息---end

        # 关闭连接
        channel.close()
        ssh.close()
        print("linkClose===> : " + ip)


def exec_command(channel, command, second):
    # /n是换行
    channel.send(command + '\n')
    # sleep一下,是为了让程序执行完,单位是:秒
    time.sleep(second);
# 获取通道输出信息,每次获取的都是未获取的(比如第一次执行这个方法获取了第一行信息,下次再执行获取的就是第二行开始的当前所有控制台打印的信息)
def getConsoleTXT(channel):
    return channel.recv(9999).decode()

# resultStr中是否包含strinfo(如果有,则返回它所在的位置;如果没有,则返回-1def checkStr(resultStr, strinfo):
    try:
        return resultStr.index(strinfo);
    except BaseException:
        print('Warning: 未找到相关字符')
        return -1


# 运行
sshd()
发布者:songJian   点击数:4070   发布时间:2019-04-03 22:22:54   更新时间:2021-08-09 00:02:35
正在加载评论...
相关文章