文件相关信息,时间相关操作,定时任务,paramiko模块

文件相关信息

查看文件大小

# 查看普通⽂件⼤⼩⽅法
 [root@jason /tmp]# ls -lh /etc/services

# 查看⽬录⽂件⼤⼩⽅法
 du 显示⽬录中的数据真实占⽤磁盘空间⼤⼩
 du -sh /etc/
   -s 将⽬录下⾯的数据信息⼤⼩进⾏统计
   -h 以⼈类可读⽅式显示

企业案例:

   磁盘空间不够使⽤了删除⽐较⼤的⽂件

 01. 确认磁盘空间是否不够⽤了
     df -h
 02. 确认⽐较⼤的⽂件数据信息
     du -sh /usr/*
 03. 没有⽤的⽂件(检查⼤⼩会不会有变化)
     ⽂件⼤⼩产⽣变化的⽂件如何处理:备份 清空⽂件中的数据>⽂件信息
   ⽂件⼤⼩不会产⽣变化的⽂件:备份 直接进⾏删除
 04. 进⾏磁盘空间利⽤率确认

 文件索引信息

inode(index node)
    概念说明:书⽬录 索引指向信息 指向数据真实存储在磁盘的位置
  如何查看inode信息:
  [root@jason /tmp]# ls -hi /etc/hosts

# block
 概念说明: ⽤于真实存储数据信息
 如何查看block信息: 
 [root@jason /tmp]# ls -l /etc/hosts
 block默认⼤⼩4k,可以调整, 但建议⼀定要在格式化分区时调整

问题: block是调整⼤⼀些10M,还是调整⼩⼀些10k?
 情况⼀: 存储数据量⽐较⼤的时候
     正确答案: 是选择⼤的block更好 
     可以减少block消耗, 节省磁盘IO
 情况⼆: 存储数据量⽐较⼩的时候
     正确答案: 选择⼩的block会更好
     可以节省磁盘空间, 可以让更多数据进⾏存储

文件链接信息

硬链接:直接指向硬盘中真正的数据所在位置
    硬链接各自不影响数据的访问
软链接:相当于是windows中的快捷方式
    软链接的出处一旦删除,所有软连接都会失效
 
# 硬链接
 概念说明:相当于复制了一份,并且更新其中一份,另外一份也同步更新 
   磁盘(超市--数据) 有⻔进⼊超市 cat /etc/hosts
   多⻔进⼊超市 cat
    /oldboy/hosts 
 只能对⽂件做硬链接,不能对⽬录做硬链接
 作⽤说明:
   01. 可以⽤于查看数据信息
   02. 可以⽤于作为备份
   03. 当所有硬链接都被删除, 等价于数据将会被删除
 区别说明:
   01. 对于源⽂件关注程度
     源⽂件删除, 不会对硬链接⽂件产⽣影响
   02. 对于链接⽂件关注程度
     不会有影响, 对于源⽂件硬链接数会减少

# 软链接
 概念说明:相当于创建一个快捷方式,源文件删除,软链接失效。
既可以对文件做软链接,又可以对目录做软链接。
 作⽤说明:
   01. 使复杂路径操作更加⽅便
   02. 使不同软件程序版本调⽤更加⽅便
 区别说明:
   01. 对于源⽂件关注程度
     源⽂件被删除, 会影响软链接⽂件系统时间
   02. 对于链接⽂件关注程度毫⽆影响

"""详细操作"""
1.硬链接
 ln /etc/hosts /oldboy/hard_link_hosts.txt    # 通过后面的文件路径也可以访问到前面路径中的文件内容
   cat /etc/hosts  # 查看前面文件的内容 
   cat /oldboy/hard_link_hosts.txt  # 查看后面文件的内容

# 给其中一个链接追加一部分内容,通过另外一个链接访问到的内容也随着变化,删除源文件,通过另外一个接口依然可以访问 echo oldboyinfo >> /etc/hosts # 将oldboyinfo的内容追加到前面的文件   cat /etc/hosts   cat /oldboy/hard_link_hosts.txt # 通过两个链接访问到的内容是一样的
2.软连接 ln -s /etc/sysconfig/network-scripts/ifcfg-eth0 /oldboy/soft_link_eth0
  # 给前面文件的内容制作一个软链接,删除源文件,软链接失效

时间相关操作

系统时间

1.电脑时间如何实现实时同步
    电脑断电时,电脑中的电容会给电脑中的时间模块进行供电,类似于电子手表,此时的时间会有误差,一旦连网,会立刻发送网络请求,实时更新时间。
2.系统时间如何查看
   date
# 按照⾃定义需求, 显示时间信息
   date +年-⽉-
     date +%y-%m-%d 
     date +%F

   date +年-⽉-⽇ ⼩时:分钟:秒
    date +"%y-%m-%d %H:%M:%S"
# 显示过去的时间信息 显示未来的时间信息
 显示过去的时间
   date +%F -d "-3 day"/date +%F -d "-3day"
   date +%F -d "+3 day ago"
   date +%F -d "-3 year"
 
 显示未来的时间
 date +%F -d "+3 day"/date +%F -d "+3day"
 
# 设置系统时间⽅法
 date -s "2022-11-11 11:11:11"
 
'''时间同步服务centos6为ntp centos7位chrony'''

机器克隆

  • 相当于按照之前设好的配置克隆一台一模一样的虚拟机。

方法

  虚拟机——管理——克隆(必须先关闭虚拟机才可以)

链接克隆与完整克隆的区别
  链接克隆一旦主体挂掉,另外一台也跟着挂掉。链接克隆所占内存小。
  完整克隆其中一台挂掉不影响另外一台。完整克隆所占内存大。
注意:克隆出来的机器一定要修改ip地址
  1. 进入编辑页vim /etc/sysconfig/network-scripts/ifcfg-eth0(ens33)
  2. i——进入编辑状态,修改IP:IPADDR=10.0.0.201
  3. Esc退出编辑状态
  4. :qw保存
  5. 重启网卡:systemctl restart network

主机名称也可以进行修改:
hostnamectl set-hostname alexNB
            bash

定时任务

'''三种实现⽅式'''
定时任务软件:cronie
     rpm -qa cronie
定时任务软件:atd
     定时任务只执⾏⼀次(淘汰)
定时任务软件:anacron
     只适合⾮24⼩时运⾏的服务器(淘汰)
    
# 自己设置定时任务——crontab命令(自己百度搜索)
  参考:https://www.runoob.com/w3cnote/linux-crontab-tasks.html

paramiko模块

功能:通过python代码连接服务器并执行相关操作
    并且支持用户名密码连接和公钥私钥连接
    
pip install paramiko

基本使用(用户名密码登录)
import paramiko

# 用户名和密码的方式
# 创建SSH对象(固定)
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机(固定)
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='10.0.0.200', port=22, username='root', password='123')
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
"""
stdin 支持传额外的命令
stdout 命令正确的执行结果
stderr 命令错误的执行结果
"""
# 获取命令结果  还可以利用stdin继续传值 eg:-y确认
result = stdout.read()
print(result.decode('utf8'))
# 关闭连接
ssh.close()

公钥私钥

主要的目的是为了避免使用用户名密码的时候信息泄露造成安全性问题。

简单的理解

  1.每台计算机都可以拥有自己的公钥和私钥

  2.你只需要将公钥交给别人以后,通过比对私钥就可以证明你的身份

详细的理解—— 鲍勃的公钥私钥

如何产生公钥私钥

  • mac电脑>>>:终端可以直接产生并发送给服务端
  • windows电脑>>>:只支持产生不支持发送(可以利用一些第三方软件加强)

git软件

下载官网:https://git-scm.com/

查看git安装是否成功:桌面空白区域鼠标右键出现——Git GUI Here     Git Bash Here

公钥私钥的产生:
点击Git Bash Here,启动git 

1. 输入命令:ssh-keygen -t rsa

  连续按三下回车即可

 

2.拷贝公钥到远程服务器

   ssh-copy-id -i 公钥文件绝对路径 用户名@服务器ip地址 

 

paramiko模块公钥私钥连接

  # 公钥和私钥(先将公钥保存到服务器上)
    import paramiko

    # 读取本地私钥
    private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')  # 红色部分根据存放私钥的绝对路径进行修改

    # 创建SSH对象
    ssh = paramiko.SSHClient()
    # 允许连接不在know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 连接服务器
    ssh.connect(hostname='123.206.16.61', port=22, username='root', pkey=private_key)  # hostname改为自己的ip地址

    # 执行命令
    stdin, stdout, stderr = ssh.exec_command('df')
    # 获取命令结果
    result = stdout.read()
    print(result.decode('utf-8'))
    # 关闭连接
    ssh.close()

paramiko其他操作

往远程服务器中上传或者下载文件

1. 直接通过用户名密码的方式
import
paramiko # 用户名和密码 transport = paramiko.Transport(('123.206.16.61', 22)) transport.connect(username='root', password='123') sftp = paramiko.SFTPClient.from_transport(transport) # 上传文件 sftp.put("本地文件路径", '远程服务器路径') # 注意上传文件到远程某个文件下 文件必须存在 # 下载文件 sftp.get('远程服务器文件路径', '本地文件路径') # 将远程文件下载到本地并重新命令 transport.close() 2. 公钥和私钥的方式 import paramiko private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') transport = paramiko.Transport(('hostname', 22)) transport.connect(username='jason', pkey=private_key) sftp = paramiko.SFTPClient.from_transport(transport) # 将location.py 上传至服务器 /tmp/test.py sftp.put('/tmp/location.py', '/tmp/test.py') # 将remove_path 下载到本地 local_path sftp.get('remove_path', 'local_path') transport.close()

paramiko代码封装

如果paramiko要频繁使用的话,可以将其封装为一个面向对象的版本。

# 以下代码不用死记硬背 知道原理会用即可
import paramiko

class SSHProxy(object):
    def __init__(self, hostname, port, username, password):
        self.hostname = hostname
        self.port = port
        self.username = username
        self.password = password
        self.transport = None

    def open(self):  # 给对象赋值一个上传下载文件对象连接
        self.transport = paramiko.Transport((self.hostname, self.port))
        self.transport.connect(username=self.username, password=self.password)

    def command(self, cmd):  # 正常执行命令的连接  至此对象内容就既有执行命令的连接又有上传下载链接
        ssh = paramiko.SSHClient()
        ssh._transport = self.transport

        stdin, stdout, stderr = ssh.exec_command(cmd)
        result = stdout.read()
        return result

    def upload(self, local_path, remote_path):
        sftp = paramiko.SFTPClient.from_transport(self.transport)
        sftp.put(local_path, remote_path)
        sftp.close()
        
    
    # 步骤2:下面的先别拷贝
    def close(self):
        self.transport.close()

    def __enter__(self):  # 对象执行with上下文会自动触发
        self.open()
        return self  # 这里发挥上面with语法内的as后面拿到的就是什么 

    def __exit__(self, exc_type, exc_val, exc_tb):  # with执行结束自动触发
        self.close()

封装之后的使用

使用方法:
"""
推导步骤:
1.初次封装 
    只有init、open、command、upload、close方法
    这个时候要想执行和上传下载都支持必须先执行open方法,所有操作完毕之后执行close方法
    obj = SSHProxy(...)    # 先产生一个对象,括号里面传需要的参数
    obj.open()     # 功能开启(连接服务器,上传下载功能)
    obj.command()    # 执行命令
    obj.upload()    # 上传下载文件
    ...
    obj.close()    # 关闭资源
2.进阶升华
    每次都需要先open最后再close 这种操作跟我们之前python基础问文件操作有点类似
    文件操作最后利用with上下玩完成简便写法,但是paramiko模块产生的对象默认是不支持with语法的
    obj = SSHProxy(...)
    with obj  报错 但是报错信息里面有提示,说对象里面没有__enter__方法,也就是说with会自动触发对象__enter__方法
"""      
if __name__ == '__main__':
    with SSHProxy(hostname='10.0.0.200',port=22,username='root',password='123') as obj:
      res1 = obj.command('de')
      print(res1.decode('urt8'))
      res2 = obj.command('ip a')
      print(res2.decode('utf8'))
      obj.upload('c.txt','/ccc.txt')

面试题回忆

# 面试题 

# 请在Context类中添加代码完成该类的实现
class Context:
    pass
with Context() as ctx:
    ctx.do_something()

 

posted @ 2023-01-14 17:41  莫~慌  阅读(94)  评论(0编辑  收藏  举报