需求:
某公司因为网站服务经常出现异常,需要你开发一个脚本对服务器上的服务进行监控;检测目标服务器上是否存在nginx软件(提供web服务的软件),如果不存在则安装(服务器可能的操作系统Ubuntu24/RedHat9);如果nginx软件存在则检查nginx服务是否启动,如果没有启动则启动该服务(为了确认是否启动成功,需要在自己浏览器中访问服务器ip地址对应的URL:$http://192.168.0.200$ 是否能看到nginx启动页面)
- 提示1:检测服务器操作系统,推荐命令:`uname -a`,从它里面提取关键字检测
- 提示2:unbutn安装命令`apt install 软件名称`,redhat安装命令`yum install 软件名称`
- 提示3:nginx是一个软件,启动之后就会是一个名称为nginx的服务,提供网站服务-启动之后能在80端口访问到一个默认页面`http://192.168.0.200:80`等价于`http://192.168.0.200`,因为`http://`协议默认端口-80端口;需要注意`https://`默认端口-443端口
需求分析:
import sys
import paramiko
def remote_command(host, username, password,service):try:#建立远程连接ssh = paramiko.SSHClient()#忽略known_hosts 文件限制ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#连接服务器ssh.connect(host, username=username, password=password)#执行命令stdin, stdout, stderr = ssh.exec_command("cat /etc/os-release")res=stdout.read().decode('utf-8').strip()if "Red Hat" in res:name='redhat'print("操作系统是redhat")elif "Ubuntu" in res:name='ubuntu'print("操作系统是ubuntu")stdin, stdout, stderr = ssh.exec_command(f"yum list installed | grep {service}")result = stdout.read().decode('utf-8').strip()#判断某个服务是否安装if service in result:#如果安装则检查其是否启动print(f"{service} 已安装,正在检查服务是否启动......")stdin, stdout, stderr = ssh.exec_command(f"systemctl is-active {service}")service_status =stdout.read().decode('utf-8').strip()if service_status =="inactive":print(f"{service}服务未启动.正在尝试启动....")stdin, stdout, stderr = ssh.exec_command(f"systemctl start {service}")if stderr.read().decode('utf-8').strip():print(f"启动服务失败:{stderr.read().decode('utf-8').strip()}")ssh.close()stdin, stdout, stderr = ssh.exec_command(f"systemctl is-active {service}")service_status_2 =stdout.read().decode('utf-8').strip()if service_status_2 =="active":print(f"{service}服务已启动")ssh.close()else:print(f"{service}已启动")ssh.close()else:#若果为安装,则安装print(f"{service}未安装,尝试安装......")#ubantu和redhat操作系统安装命令不同if name=="redhat":stdin, stdout, stderr = ssh.exec_command(f"yum install {service} -y")elif name=="ubuntu":stdin, stdout, stderr = ssh.exec_command(f"apt install {service} -y")#如果正常执行,则返回0,反之返回非0状态码install_result=stdout.channel.recv_exit_status()if install_result != 0:print(f"安装{service}失败:{stderr.read().decode('utf-8').strip()}")returnstdin, stdout, stderr = ssh.exec_command("systemctl start nginx")if stderr.read().decode('utf-8').strip():print(f"启动服务失败:{stderr.read().decode('utf-8').strip()}")returnstdin, stdout, stderr = ssh.exec_command(f"systemctl is-active {service}")service_status3=stdout.read().decode().strip()if service_status3 =="active":print(f"{service}已成功安装并启动")#关闭连接ssh.close()except Exception as e:print("连接建立失败",e)
if __name__=='__main__':remote_command(#获取命令行参数host=sys.argv[1],username=sys.argv[2],password=sys.argv[3],service=sys.argv[4])
例如:要在192.168.5.129上服务器上开启nginx服务
运行代码后nginx服务已成功开启