django搭建一个小型的服务器运维网站-服务器SSH服务配置与python中paramiko的使用...

news/2024/4/27 18:53:36/文章来源:https://blog.csdn.net/weixin_34221332/article/details/88853332

目录

  1. 项目介绍和源码;
  2. 拿来即用的bootstrap模板;
  3. 服务器SSH服务配置与python中paramiko的使用;
  4. 用户登陆与session;
  5. 最简单的实践之修改服务器时间;
  6. 查看和修改服务器配置与数据库的路由;
  7. 基于websocket的实时日志实现;
  8. 查看服务器中的日志与前端的datatable的利用;
  9. 重启服务器进程。

前言

  我们的Web小项目需要用到python中的paramiko这个模块去和服务器简单交互,python中的paramiko模块已经帮我们实现了基于SSH的远程服务器连接方法,本篇文章会介绍一下如何在服务器上配置一个ssh服务器,并结合网站的需求介绍下paramiko的功能,给出一些需要使用到的函数。

配置SSH服务器

  本地安装paramiko只需要执行pip install paramiko即可,然后把网站需要用到的服务器功能封装成函数方便调用。除此之外我们还需要在Linux服务器上配置好SSH服务,通过SSH客户端登陆服务器有三种方式,分别是:用户名+密码、用户名+私钥,后者也可以叫做免密登陆。我们先在Linux上安装一个SSH服务:

  • 执行ps -e | grep ssh*查看服务器是否开启了ssh服务,若没有则在服务器上利用sudo apt-get install openssh-server openssh-client安装ssh服务。
  • 安装好后开启ssh服务:执行/etc/init.d/ssh start开启服务,如图1,利用ifconfig获取到服务器的ip地址。

图1 开启ssh服务

  • 打开Xsehll工具,填好服务器上面查询到的ip地址和端口号(默认为22),输入密码之后,就可以登陆到我们的服务器了,下图图2和图3。

图2 Xshell登陆
图3 登陆到服务器

  • 若需要免密登陆,就需要配置好公钥和私钥,为了保证安全,在自己的用户名下创建密钥对就好:
lishouxian@lishouxian:~$ ssh-keygen                                     <== 建立密钥对
Generating public/private rsa key pair.
Enter file in which to save the key (/home/lishouxian/.ssh/id_rsa):     <== 密钥对生成的地方
Enter passphrase (empty for no passphrase):                             <== 密钥密码,可留空
Enter same passphrase again: 
Your identification has been saved in /home/lishouxian/.ssh/id_rsa.     <== 私钥
Your public key has been saved in /home/lishouxian/.ssh/id_rsa.pub.     <== 公钥
The key fingerprint is:
SHA256:1Qj14JZLLGhekIjSY7rsCBoDAQ4QeoMvVKN4jxqzzrQ lishouxian@lishouxian
The key's randomart image is:
+---[RSA 2048]----+
|Bo + .....o      |
|B.B o .o + *     |
|+O+.  o o O o    |
|++ + o . = .     |
|*.o . . S .      |
|=B               |
|B+               |
|*..              |
| E               |
+----[SHA256]-----+
  • 用自己的用户账号切换到自己用户名的.ssh目录下安装公钥cat id_rsa.pub >> authorized_keys,并执行chmod 600 authorized_keys获得权限。
  • 打开配置文件vim /etc/ssh/sshd_config,设置RSAAuthenticationPubkeyAuthentication两个字段为yes
  • 把私钥id_rsa拷贝到本地,在服务器上执行/etc/init.d/ssh restart重启SSH服务,这个时候在本地就可以打开Xshell用用户名和密钥登陆服务器了,因为我们没有设置密钥密码,所以登陆时可以不用输入图4红框中的密码。

图4 使用密钥免密登陆

python中的paramiko使用

服务器的登陆

  服务器登录可通过用户名+密码和用户名+密钥免密登陆,下面代码会给出这两种登陆方式对应的代码:

# -*- coding: utf-8 -*-
import paramiko
import os
import time
import re
import sysreload(sys)
sys.setdefaultencoding('utf-8')login_config = {"hostip": "",                 # 服务器的ip(需要填写)"hostport": 22,               # 端口号"username": "lishouxian",     # 登陆的用户名"userpwd": "",                # 登陆密码(需要填写)"rootusr": "root",            # root 用户"rootpwd": "root",            # root 密码# 私钥,将配置好的id_rsa文件放在项目目录下"keypath": os.path.join(os.path.dirname(os.path.abspath(__file__)), "id_rsa"),
}# 通过密钥登陆服务器
def login_server_by_rsa():try:server_ssh = paramiko.SSHClient()server_ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())pkey = paramiko.RSAKey.from_private_key_file(login_config["keypath"])server_ssh.connect(hostname=login_config["hostip"],port=login_config["hostport"],username=login_config["username"],pkey=pkey)return server_sshexcept Exception, e:print e# 通过密码登陆服务器
def login_server_by_pwd():try:server_ssh = paramiko.SSHClient()server_ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())server_ssh.connect(hostname=login_config["hostip"],port=login_config["hostport"],username=login_config["username"],password=login_config["userpwd"])return server_sshexcept Exception, e:print e

  登陆服务器之后可以操作查看时间、查看文件之类的操作。

获得root权限

  因为我们以用户名登陆,修改其他用户名下的文件、修改时间、上传或者删除文件这些需要root权限,获得root权限的代码如下,这种交互方式像在一问一答,代码运行结果如图5,代码送指令并获得反馈,每当执行下一步操作都需要一个状态进行判断while not buff.endswith('Password: ')语句用来判断是否到了服务器问代码要密码的阶段。

# 获得root权限
def authenticating_channel(login_ssh):channel = login_ssh.invoke_shell()try:print '............Authenticating............'channel.send("su %s\n" % login_config["rootusr"])buff = ''while not buff.endswith('Password: '):resp = channel.recv(10000)buff += respprint buffchannel.send("%s\n" % login_config["rootpwd"])buff = ''while not buff.endswith('# '):resp = channel.recv(10000)buff += respprint buffexcept Exception, e:print echannel.close()login_ssh.close()return channel

图5 获得root权限

网站中用到的一些操作

  这些操作基本上都是利用代码向服务器发送Linux命令,然后获得结果。

  • 获得服务器时间,用到的Linux命令:date +%Y-%m-%d\ %H:%M:%S
# 获取服务器时间
def get_server_time():ssh = login_server_by_pwd()stdin, stdout, stderr = ssh.exec_command('date +%Y-%m-%d\ %H:%M:%S')servertime = stdout.read()ssh.close()return servertimeprint get_server_time()
  • 修改服务器时间,需要权限,用到的Linux命令:date +%Y-%m-%d\ %H:%M:%S,结果如图6所示。
# 重置服务器时间
def restore_server_time():local_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())modify_server_time(local_time)# 修改服务器时间
def modify_server_time(newtime):ssh = login_server_by_pwd()channel = authenticating_channel(ssh)print '............Sending ModifyTime Commander............'channel.send("sudo date -s \"%s\" \n" % newtime)buff = ''while not buff.endswith('# '):resp = channel.recv(10000)buff += respprint buff.decode('utf-8')ssh.close()modify_server_time('2018-08-08 08:08:08')
# restore_server_time()

图6 修改时间

  • 获得配置文件,一般情况下服务器的配置文件会写在某个文件夹里面,例子中的配置文件皆为json格式的文件,不同类型的配置文件会用不同的子文件夹装着,考虑到这种情况,可以把 Linux命令写复杂点,但是这样不利于程序的扩展。ls -lR遍历文件夹下的所有的文件(包含子文件夹),grep ^-只显示文件名,不显示文件夹的名字,awk \'{ print $9 }\'用来获取这些配置文件的名字(\'为转义字符),图7是服务器的所有配置文件,图8是程序返回的配置名列表。
# 获取文件配置
def get_serverconfig_lists():ssh = login_server_by_pwd()# execute commandstdin, stdout, stderr = ssh.exec_command('ls -lR /home/configs/ |  grep ^- | awk \'{ print $9 }\'')file_list = stdout.read().split("\n")[:-1]return file_listprint get_serverconfig_lists()

图7 配置文件
图8 程序返回的配置名列表

  • 查看配置文件find \"$PWD\" -name XXX在本目录和子目录下查找XXX的文件(\"为转义字符),| xargs cat将上一个命令的结果作为下一个指令的参数,这里的意思是将找到的文件名作为cat的参数,结果就是打开这个文件,结果如图9。
#读取配置配置
def read_serverconfig(filename):ssh = login_server_by_rsa()# execute commandtry:stdin, stdout, stderr = ssh.exec_command('cd /home/configs/; find \"$PWD\" -name ' + filename + ' | xargs cat')read = stdout.read().decode('utf-8')return readexcept Exception, e:print eprint read_serverconfig('setting_1.json')

图9 读取文件

  • 修改配置文件,我们采用了一个最简单的修改文件方法,直接覆盖原来的文件,所以在本地产生一个文件,输入文件内容(是否符合json文件格式在后面利用javascript在前端页面做了)然后利用paramiko中的sftp模块上传。由于修改文件需要权限,所以有个折衷的办法是:先把文件上传到自己的服务器文件夹下,然后在服务器获得root权限,把自己服务器文件夹下的文件覆盖掉配置文件夹中的同名文件。
# 修改配置文件
def generate_config_upload_file(filename, json_str):local_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), filename).replace('\\', '/')# 登陆服务器ssh = login_server_by_rsa()# 获得配置文件所在的位置stdin, stdout, stderr = ssh.exec_command('cd /home/configs/; find \"$PWD\" -name ' + filename)to_path = stdout.read()# 本地产生一个json文件的配置with open(local_path, 'w') as config_file:config_file.write(json_str)# 上传配置文件my_server_path = "/home/lishouxian/" + filenametry:transport = ssh.get_transport()sftp = paramiko.SFTPClient.from_transport(transport)sftp.put(local_path, my_server_path)os.remove(local_path)except Exception, e:print essh.close()os.remove(local_path)return 'Unsuccessful Upload'sftp.close()# 将文件从自己的项目文件夹转移到配置文件夹下channel = authenticating_channel(ssh)print '............Sending Upload Commander............'channel.send("cp /home/lishouxian/" + filename + " " + to_path + "\n")buff = ''while not buff.endswith('# '):resp = channel.recv(10000)buff += respprint buffssh.close()return 'Successful Upload'json_config = '{"name": "data_3", "id": "2"}'
print generate_config_upload_file('data_3.json', json_config)
  • 删除配置文件,Linux命令解释如上面的读取配置
# 删除配置文件
def delete_config(filename):ssh = login_server_by_rsa()# delete configchannel = authenticating_channel(ssh)try:print '............Sending Delete Commander............'channel.send('cd /home/configs/; find \"$PWD\" -name ' + filename + ' | xargs rm \n')buff = ''while not buff.endswith('# '):resp = channel.recv(10000)buff += respprint buffexcept e:print essh.close()ssh.close()return 'Successful Delete'print delete_config('config_4.json')
  • 调用shell脚本,为了演示,重启进程这个服务器的操作我们用自己的写的shell脚本替代,shell脚本会延时一分钟然后输出结果,最后演变成利用paramiko执行用户自定义的Linux脚本过程,我们在服务器的/home/目录下创建一个shell脚本:
#!/bin/sh
echo 'Rebooting...'
sleep 10
echo 'Suceessful rebooted!'

  在代码中调用shell代码如下:

# 重启某个进程,调用shell脚本
def rebootserver():ssh = login_server_by_rsa()channel = authenticating_channel(ssh)# reboot game serverprint '............Sending Reboot Commander............'channel.send("bash /home/reboot.sh restart; echo \"quit:$?\" \n")resp = ''while not resp.endswith('# '):resp = channel.recv(10000)print respquit_num = re.findall("quit:(\d+)", resp, re.M)if len(quit_num) > 0:if quit_num[0] == '0':ssh.close()return "Successful Rebooted!"else:ssh.close()return "Unsuccessful Rebooted!"ssh.close()print rebootserver()

结语

  本篇文章介绍了如何在服务器上搭建一个支持客户端免密和使用密码登陆的ssh服务,然后利用python中的paramiko模块登陆服务器,后面的网站都是基于paramiko和服务器进行交互。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_804940.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何解决公司网站首页被恶意跳转的安全问题

2019独角兽企业重金招聘Python工程师标准>>> 近日某客户网站被黑&#xff0c;导致网站首页被篡改并跳转到赌博网站&#xff0c;网站在百度的收录也收录了一些什么彩票内容的快照&#xff0c;网站首页快照也被修改成赌博内容&#xff0c;并被百度直接红色风险拦截提示…

神器扒网站——teleport ultra

转载:https://blog.csdn.net/leisure_life/article/details/69371904 神器扒网站——teleport ultra在平时的开发或者学习的过程中&#xff0c;我们难免会看到一些让人心动的网站&#xff0c;于是自己想把它搞下来&#xff0c;自己手工一个文件一个文件把它保存下来也可以实现&…

SEO网站优化需要抓住哪些重要环节?

一般网站内部优化包括&#xff1a;网站内链、网站内容、网站关键词、友链等等。如果一个网站内容质量特别的差&#xff0c;那么他想要获得用户和搜索引擎的认可同样是非常困难的。下面搜客大伟就跟大家介绍一下SEO网站优化需要抓住哪些重要环节&#xff1f; 1、外链 大部分人都…

【教程视频分享】Java SSM开发购物网站项目教程视频

获取方式——关注公众号&#xff1a;Java开发教程视频 点击【IT资源】即可获取

你离大牛就差这10家国内知名的慕课网站。

MOOC即Massive Open Online Course的缩写&#xff0c;翻译成中文就是&#xff1a;大规模的在线开放课程或者大型开放是网络课程&#xff0c;是任何人都可以注册使用的在线教育新模式&#xff0c;被人称之为是人类印刷术以来关于教育的重要发明&#xff0c;是一种新型的在线教育…

做一个网站真的有那么难吗?

现在这个互联网时代&#xff0c;什么都跟互联网挂钩&#xff0c;哪怕卖水果都开始用网店了&#xff08;其实我也想卖水果%>_<%&#xff09;。下面就讲一下水果哥和水果妹的依托互联网卖水果的故事。 背景介绍 话说再很久很久以前&#xff0c;有两个小伙伴一起合伙卖水果…

3行代码 为网站博客添加萌萌哒看板娘可爱二次元女动漫玩偶人物

看板娘一词源自日语“看板娘(かんばんむすめ)”。其中的“看板”指的是店面招牌&#xff0c;或者是为了宣传、打广告而制作的宣传牌。“看板娘”也就是店面的招牌姑娘&#xff0c;亦即能够提升店面人气和顾客流量的女服务生、女店员等。也就是说&#xff0c;看板娘本身就是一块…

用HTML+CSS编写一个计科院网站首页的静态网页

由于能力的不足&#xff0c;这个网页还有很多功能未完善&#xff0c;比如图片的滚动&#xff0c;在学习了javascript后我会将其完善。 以下是几张成品和工程的截图&#xff1a; 以下是完整的HTML和CSS代码&#xff1a; 1 <!DOCTYPE html>2 <html>3 <head>4 &…

宝塔安装建站教程

一、安装宝塔 centos安装脚本&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install.sh && sh install.sh ubuntu、deepin安装脚本 wget -O install.sh http://download.bt.cn/install/install-ubuntu.sh &&…

用Meta标签代码让360双核浏览器默认极速模式打开网站不是兼容模式

公司所作的页面在360下打开都会遇到在360下自动跳到360兼容模式引发许多兼容问题&#xff0c;摸索了好久终于在网上找到了怎么解决的方法&#xff0c;详情如下: 其实360给网站开发者设计了一种选择的方法&#xff0c;只要加入一段Meta标签代码就可以解决。 以下信息摘自360官方…

个人博客一|抓取崔庆才个人博客网站前端源码

1、准备 工具&#xff1a;仿站小工具V9.0 工具获取方式一&#xff1a; 关注微信公众号 微信公众号『stormsha』&#xff0c;后台回复『仿站工具』获取工具 工具获取方式二&#xff1a; 仿站小工具官网 https://smalltool.github.io/崔庆才博客 https://cuiqingcai.com/从网站源…

美联邦调查局 FBI 网站被黑,数千特工信息泄露

百度智能云 云生态狂欢季 热门云产品1折起>>> 近日 TechCrunch 等多家媒体报导&#xff0c;一个黑客组织黑了美国联邦调查局 FBI 的附属网站&#xff0c;并泄露了数千名联邦特工和执法人员的个人信息。 黑客攻击了与 FBI 培训学院 National Academy Association 相关…

网站显示该内容被禁止访问的解决办法

2019独角兽企业重金招聘Python工程师标准>>> 如果您的网站首页或者内页面突然出现“该内容被禁止访问”的提示&#xff0c;那么说明你的网站被黑了&#xff0c;被黑什么了&#xff1f;我找找找&#xff0c;也没找出什么问题&#xff0c;到底是怎么回事&#xff0c;最…

nginx搭建静态网站

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务,常用于负载均衡构架,以提高网站的并发量,概念不过多介绍,更多细节请自行百度, 本文是纯操作案例,假设你已经知道什么是nginx并且知道它用来干什么,那么你可以按照本文步骤来使用nginx搭建出一个静态网站 以此你可以对ngi…

国外10个最佳和最流行的酷站推荐网站

The FWA The FWA这个网站&#xff0c;相信不必多介绍了&#xff0c;这是许多国外Flash设计师梦寐以求的奖项的 优胜者通常通过显示The FWA徽章作为他们网站获奖的一个标志。 Best Web Gallery 访问Best Web Gallery您可能很长时间发现有没有更新&#xff0c;因为这个网站关注的…

Python | 7招教你识别一个网站是否是Django后台

目录&#xff1a;1. 利用Debug模式异常页面判断2. 通过CSRF Token验证3. Django Admin4. 通过HTTP头5. 拼凑细节6. 通过一些第三方模块的特点判断7. 分析静态文件最近事情有点多&#xff0c;一直没有时间写原创&#xff0c;而又一直想写点什么&#xff0c;今天早上正好空下来&a…

整理了一周的Python资料,包含各阶段所需网站、项目,收藏了慢慢来

这周应该有不少学校已经开学了&#xff0c;那么同学们都该动起来了&#xff0c;把家里面的那些懒习惯给扔掉了可以。 不知怎么的&#xff0c;最近不少关注我的读者都开始私信我怎么学好python&#xff1f;零基础转行是不是合适&#xff0c;还有希望吗&#xff1f;今年30了&…

【Git】GIT相关网站

GIT CHEAT SHEET 最后可以戳以下链接继续学习&#xff1a; https://git-scm.com/book/zh/v2 Git中文开发手册

要想知道自己在网上裸奔成啥样?这个网站一搜便知

很多网站都需要手机号注册&#xff0c;久而久之自己也不清楚注册了哪些网站。 有的网站可能注册过一次就再没用过&#xff0c;有的明明没有注册过但还是收到很多垃圾信息&#xff0c;可能是因为你手机号之前被别人用的时候&#xff0c;注册了你不知道的网站。 下面&#xff0…

你要的Python资料都在这里,包含各阶段所需学习网站、实战项目,收藏了慢慢来

不知怎么的&#xff0c;最近不少关注我的读者都开始私信我怎么学好python&#xff1f;零基础转行是不是合适&#xff0c;还有希望吗&#xff1f;今年30了&#xff0c;还能不能转IT&#xff1f; 其实关于零基础转型的&#xff0c;我以前写过一篇文章&#xff0c;没有看过的都可…