python指令碼實現本地或遠端執行命令
阿新 • • 發佈:2018-11-10
功能:
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.