需求:
某公司因为网站服务经常出现异常,需要你开发一个脚本对服务器上的服务进行监控;检测目标服务器上是否存在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()}")
return
stdin, stdout, stderr = ssh.exec_command("systemctl start nginx")
if stderr.read().decode('utf-8').strip():
print(f"启动服务失败:{stderr.read().decode('utf-8').strip()}")
return
stdin, 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服务已成功开启