1、Python 本地服务器执行Linux的shell命令
1)os.system
使用os.system只是在一个子终端运行系统命令,而不能获取命令执行后的返回信息。如下,
import os
result = os.system('cat /etc/passwd')
print(result)
2)os.popen
如要控制台输出的内容,则可以使用os.popen的方法,popen返回的是一个file对象,与open打开文件操作类似。如下,
import os
# popen返回文件对象,和open操作差不多
f = os.popen("cat /etc/passwd", "r")
d = f.read() # 读文件
print(d)
print(type(d))
f.close()
3)使用模块 subprocess
import subprocess
def localExecute(command):
p = subprocess.Popen([command],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=True)
out = p.stdout.read().decode('utf-8')
print(out)
if __name__ == '__main__':
localExecute("cat /etc/passwd")
2、Python 远程服务器执行Linux的shell命令
paramiko
是用Python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。paramiko支持Linux, Solaris, BSD, MacOS X, Windows等平台通过SSH从一个平台连接到另外一个平台。可以方便的进行ssh连接和sftp协议进行sftp文件传输。
1)安装paramiko模块
pip3 install paramiko
2)paramiko使用代码
import paramiko
# 远程登陆Linux服务器,并在服务器上执行命令
def remoteSsh(sys_ip, username, command, password=''):
try:
# 创建ssh客户端
client = paramiko.SSHClient()
# 第一次ssh远程时会提示输入yes或者no
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
if len(password) == 0:
key_file = paramiko.RSAKey.from_private_key_file("/root/.ssh/id_rsa")#免密登陆
client.connect(sys_ip, 22, username=username, pkey=key_file, timeout=20)
else:
client.connect(sys_ip, 22, username=username, password=password, timeout=20)#密码登陆
print(f"开始在远程服务器上执行指令:{command}")
# 执行查询命令
stdin, stdout, stderr = client.exec_command(f"""{command}""", get_pty=True)
# 获取查询命令执c行结果,返回的数据是一个list
result = stdout.read().decode('utf-8')
print(f"{sys_ip}执行结果:", result)
error = stderr.read().decode('utf-8')
if error != "":
print(f"{sys_ip}错误信息:", error)
else:
pass
except Exception as e:
print(e)
finally:
client.close()
# 多台服务器批量执行同一命令
def batchExecuteRemoteCommand(host_list, command):
import threading
thread_list = []
for ip, username, password in host_list:
thread = threading.Thread(target = remoteSsh, args = (ip,username,password,command))
thread_list.append(thread)#将生成的线程添加到列表里
for t in thread_list:
t.start() #开始执行线程
for t in thread_list:
t.join() #挂起线程,到所有线程结束
if __name__ == '__main__':
batchExecuteRemoteCommand(('192.168.31.21','root','Aa123456'),'cat /etc/passwd')