目录

  • 文件相关信息
  • 文件索引信息
  • 链接信息
  • 系统时间
  • 机器克隆
  • 定时任务
  • paramiko模块
  • 公钥私钥
  • 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)
	概念说明:书⽬录 索引指向信息 指向数据真实存储在磁盘的位置

# 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
 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 +"%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'''


服务器集群时间同步策略
	回想电影里面飞虎队行动之前对表的操作
	以服务器集群中某一台计算机作为时间参考

机器克隆

1.链接克隆与完整克隆的区别
2.克隆出来的机器一定要修改ip地址

定时任务

'''三种实现⽅式'''
定时任务软件:cronie
 	rpm -qa cronie
定时任务软件:atd
 	定时任务只执⾏⼀次(淘汰)
定时任务软件:anacron
 	只适合⾮24⼩时运⾏的服务器(淘汰)
    
crontab命令

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软件
	桌面空白区域鼠标右键即可查看是否安装成功
	git bash here
    	"""
        1.生成
        ssh-keygen -t rsa  连续按三下回车即可
        2.拷贝公钥到远程服务器
        ssh-copy-id -i 公钥文件绝对路径  用户名@服务器ip地址
        """
	# 公钥和私钥(先讲公钥保存到服务器上)
    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)

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

paramiko其他操作

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()

# 公钥和私钥
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()

代码封装

# 以下代码不用死记硬背 知道原理会用即可
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("127.0.0.1",22,'root','jason123') as ssh:
        # 拿到改对象后就可以无限制的在一个链接内执行命令并上传下载文件
        ssh.command('df')
        ssh.command('df')
        ssh.upload(r'D:\jason\s10\day01\4.基于paramiko操作\xx', '/data/s27/xx')