python远程执行python脚本返回结果_python脚本实现本地或远程执行命令

功能:

1、执行本地shell命令,执行完成后获取结果

2、执行本地shell命令,执行中实时获取输出结果

3、执行远程shell命令,执行完成后获取结果

4、执行远程shell命令,执行中实时获取输出结果

实际操作:

1、安装paramiko

apt-get install python3-pip libevent-dev libffi-dev libssl-dev -y

pip3 install paramiko -i https://pypi.mirrors.ustc.edu.cn/simple/ --trusted-host https://pypi.mirrors.ustc.edu.cn

2、创建脚本

[email protected]:~# mkdir /scripts/python -p

[email protected]:~# touch /scripts/python/shell.py

[email protected]:~# cat /scripts/python/shell.py

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

import subprocess

import paramiko

import re

import sys

class Cmd(object):

def onetime_shell(self,cmd):

cmd = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE)

cmd = cmd.communicate()

cmd = cmd[0].decode().rstrip()

return cmd

def realtime_shell(self,cmd):

cmd = subprocess.call(cmd, shell=True)

return cmd

class Remote_cmd(object):

def __init__(self,PrivateKey,IP,Port,User):

self.private_key = paramiko.RSAKey.from_private_key_file(PrivateKey)

self.ssh = paramiko.SSHClient()

self.set_missing_host_key_policy = self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

self.connect = self.ssh.connect(hostname=IP, port=Port, username=User,pkey=self.private_key)

def onetime_shell(self,cmd,notice=False):

stdin, stdout, stderr = self.ssh.exec_command(cmd)

result = stdout.read().decode(‘utf-8‘).rstrip()

if notice:

self.ssh.close()

return result

def realtime_shell(self,cmd,notice=False):

try:

stdin, stdout, stderr = self.ssh.exec_command(cmd)

for line in stdout:

print(line.strip("\n"))

for error in stderr:

print(error.strip("\n"))

if notice:

self.ssh.close()

except Exception as e:

print("execute command %s error, error message is %s" % (cmd, e))

return ""

例子:

1、本地执行shell命令,执行完成后获取结果:

mkdir /tmp/shell #创建目录/tmp/shell

echo shell >> /tmp/shell/shell.log # 输出shell 写入/tmp/shell/shell.log

2、本地执行shell命令,实时获取输出结果

apt-get update #更新

3、远程执行shell命令,执行完成后获取结果

mkdir /tmp/remote_shell #创建目录/tmp/remote_shell

echo remote_shell >> /tmp/remote_shell/remote_shell.log #输出remote_shell写入/tmp/remote_shell/remote_shell.log

4、远程执行shell命令,实时获取输出结果

apt-get update #更新

[email protected]:~# cat exec_shell.py

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

import sys

sys.path.append(‘/scripts/python/‘)

from shell import Cmd,Remote_cmd

class ExecShell (object):

def __init__(self):

self.cmd = Cmd()

self.remote_nfs_server = Remote_cmd(‘/root/.ssh/id_rsa‘,‘nfs-server‘,‘22‘,‘root‘)

def local_onetime_shell(self):

print("执行本地shell命令,执行完成后获取结果")

self.cmd.onetime_shell(‘mkdir /tmp/shell‘)

self.cmd.onetime_shell(‘echo shell >> /tmp/shell/shell.log‘)

re = self.cmd.onetime_shell(‘cat /tmp/shell/shell.log‘)

print(re)

def local_realtime_shell(self):

print("执行本地shell命令,执行中实时获取输出结果")

self.cmd.realtime_shell(‘apt-get update‘)

def remote_onetime_shell(self):

print("执行远程shell命令,执行完成后获取结果")

self.remote_nfs_server.onetime_shell(‘mkdir /tmp/remote_shell‘)

self.remote_nfs_server.onetime_shell(‘echo remote_shell >> /tmp/remote_shell/remote_shell.log‘)

re = self.remote_nfs_server.onetime_shell(‘cat /tmp/remote_shell/remote_shell.log‘)

print(re)

def remote_realtime_shell(self):

print("执行远程shell命令,执行中实时获取输出结果")

self.cmd.realtime_shell(‘apt-get update‘)

execshell = ExecShell()

execshell.local_onetime_shell()

execshell.local_realtime_shell()

execshell.remote_onetime_shell()

execshell.remote_realtime_shell()

# 执行脚本结果

[email protected]:~# ./exec_shell.py

执行本地shell命令,执行完成后获取结果

shell

执行本地shell命令,执行中实时获取输出结果

Hit:1 http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial InRelease

Get:2 http://repo.percona.com/apt jessie InRelease [15.9 kB]

Hit:3 http://us.archive.ubuntu.com/ubuntu xenial InRelease

Get:4 http://security.ubuntu.com/ubuntu xenial-security InRelease [107 kB]

Hit:5 http://us.archive.ubuntu.com/ubuntu xenial-updates InRelease

Ign:2 http://repo.percona.com/apt jessie InRelease

Hit:6 http://us.archive.ubuntu.com/ubuntu xenial-backports InRelease

Fetched 123 kB in 1s (68.6 kB/s)

Reading package lists... Done

W: GPG error: http://repo.percona.com/apt jessie InRelease: The following signatures couldn‘t be verified because the public key is not available: NO_PUBKEY 9334A25F8507EFA5

W: The repository ‘http://repo.percona.com/apt jessie InRelease‘ is not signed.

N: Data from such a repository can‘t be authenticated and is therefore potentially dangerous to use.

N: See apt-secure(8) manpage for repository creation and user configuration details.

执行远程shell命令,执行完成后获取结果

remote_shell

执行远程shell命令,执行中实时获取输出结果

Hit:1 http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial InRelease

Get:2 http://repo.percona.com/apt jessie InRelease [15.9 kB]

Hit:3 http://us.archive.ubuntu.com/ubuntu xenial InRelease

Get:4 http://security.ubuntu.com/ubuntu xenial-security InRelease [107 kB]

Hit:5 http://us.archive.ubuntu.com/ubuntu xenial-updates InRelease

Ign:2 http://repo.percona.com/apt jessie InRelease

Hit:6 http://us.archive.ubuntu.com/ubuntu xenial-backports InRelease

Fetched 123 kB in 1s (63.9 kB/s)

Reading package lists... Done

W: GPG error: http://repo.percona.com/apt jessie InRelease: The following signatures couldn‘t be verified because the public key is not available: NO_PUBKEY 9334A25F8507EFA5

W: The repository ‘http://repo.percona.com/apt jessie InRelease‘ is not signed.

N: Data from such a repository can‘t be authenticated and is therefore potentially dangerous to use.

N: See apt-secure(8) manpage for repository creation and user configuration details.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值