文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python脚本实现本地或远程执行命令

2023-01-31 06:12

关注

功能:
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、创建脚本

root@om:~# mkdir /scripts/python -p
root@om:~# touch /scripts/python/shell.py
root@om:~# 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 #更新

root@om:~# 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()

# 执行脚本结果
root@om:~# ./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.
阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯