首页 > 系统相关 >Linux day4:查看文件属性信息 inode和block 硬链接和软链接 inux系统时间 虚拟机克隆 linux定时任务 paramiko模块 公钥私钥

Linux day4:查看文件属性信息 inode和block 硬链接和软链接 inux系统时间 虚拟机克隆 linux定时任务 paramiko模块 公钥私钥

时间:2023-01-12 17:11:51浏览次数:61  
标签:公钥 私钥 文件属性 虚拟机 self ssh 链接 paramiko

目录

文件属性信息

# 查看普通⽂件⼤⼩⽅法
 [root@jason /tmp]# ls -lh /etc/services
# 查看⽬录⽂件⼤⼩⽅法
 du 显示⽬录中的数据真实占⽤磁盘空间⼤⼩
 du -sh /etc/
 -s 将⽬录下⾯的数据信息⼤⼩进⾏统计
 -h 以⼈类可读⽅式显示
# 企业案例: 磁盘空间不够使⽤了删除⽐较⼤的⽂件
⽂件索引属性信息
 01. 确认磁盘空间是否不够⽤了
 	df -h
 02. 确认⽐较⼤的⽂件数据信息
 	du -sh /usr/*
 03. 没有⽤的⽂件(检查⼤⼩会不会有变化)
 	⽂件⼤⼩产⽣变化的⽂件如何处理:备份 清空⽂件中的数据>⽂件信息
 ⽂件⼤⼩不会产⽣变化的⽂件:备份 直接进⾏删除
 04. 进⾏磁盘空间利⽤率确认

du -sh /etc:
image-20230112151316016

df -h:
image-20230112151207247

文件信息详述示意图:
image-20230112152155311

存储数据相关

inode

​ 概念说明:书⽬录 索引指向信息 指向数据真实存储在磁盘的位置 如果有索引查找数据的速度就会很快(联系Mysql索引)

inode是一串数字,相当于文件在硬盘中的具体地址,相当于python中的id值(变量的内存地址):

image-20230112154340665

image-20230112153501818

image-20230112153631261

block

硬盘在存储信息时,是有一个最小单位的。
这个最小单位就称之为block。比如你想存储的数据只有1k,但是操作系统会给你这个1k的数据分配一个4k的空间。
这4k的空间就只存了1k的数据,而这一块空间就称之为block。
磁头在硬盘上读取数据时,加载数据也是有最小单位的,一次最小读取一个block单元。
所以并不是你数据有多大,存储在硬盘上就占有多大空间,他是按照block块来划分的。

# block
 概念说明: ⽤于真实存储数据信息
 如何查看block信息: 
 [root@jason /tmp]# ls -l /etc/hosts
 block默认⼤⼩4k 可以调整, 但建议⼀定要在格式化分区时调整
# 问题: block是调整⼤⼀些10M,还是调整⼩⼀些10k
 情况⼀: 存储数据量⽐较⼤的时候
     正确答案: 是选择⼤的block更好 
     可以减少block消耗, 节省磁盘IO
 情况⼆: 存储数据量⽐较⼩的时候
     正确答案: 选择⼩的block会更好
    链接信息
     可以节省磁盘空间, 可以让更多数据进⾏存储

image-20230112154846546

案例:
image-20230112160819927

访问文件原理

image-20230112155025139

链接信息

硬链接:直接指向硬盘中真正的数据所在位置
    硬链接各自不影响数据的访问
软链接:相当于是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

硬链接

硬链接是直接指向某一块硬盘空间。
我们所谓的删除操作,实际是删除文件与硬盘数据的对应关系,也就是把数据标记成可占用态。
硬链接就相当于开设多个,某一块硬盘空间的访问接口。
可以存在D、E、F盘都可以访问某个资源的情况,也就是硬盘中的数据有多个接口可以访问。
删除某个硬链接,不影响其他硬链接的使用。

硬链接说明:
image-20230112153056263

软链接

软链接相当于快捷方式。软链接指向硬链接,硬链接指向某块硬盘空间。
当把硬链接删掉了,所有指向该硬链接的软链接都会失效。
硬链接是真正访问的接口,而软链接是在访问的接口之上再开设一个快捷方式。当真正的接口失效了,所有的快捷方式也就失效了。

软链接说明:
image-20230112153107914

扩展知识:
image-20230112153126917

linux系统时间

# 电脑时间如何实现实时同步
早期:断网时,电脑主板有电池、电容供电,运行系统时间相关模块。(有误差) 
现在:重新联网时,发送网络请求,获取时间信息。

# 系统时间如何查看
 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 
chrony模块可以做多台服务器的时间同步服务
'''

虚拟机克隆

1.链接克隆与完整克隆的区别
2.克隆出来的机器一定要修改ip地址(内存也要修改,电脑可能带不动)

虚拟机克隆:
image-20230112161423123

链接克隆和完整克隆

image-20230112161522681

链接克隆:速度快,本体挂了,所有克隆体都会挂掉。
完整克隆:真正的复制一份本体,本体挂掉克隆机不会挂。
注意:克隆出来的虚拟机,不要再进行克隆。

克隆之后的配置

克隆机和主机的ip地址是一样的,所以要修改:
image-20230112161947746

注意重启网卡。
克隆机也可以修改一下主机名,便于区分:

image-20230112162044847

linux定时任务

定时任务软件

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

定时任务的类型

image-20230112163546747

自定义定时任务 crontab

image-20230112163720555

image-20230112163851344

分时日月周:

image-20230112163048911

设置定时任务示例(菜鸟教程):

image-20230112163924679

连接服务器的三种方式

1. xshell连接
2. git连接 (git也有终端窗口)
3. paramiko模块 (python代码连接)

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 bash here
    	"""
        1.生成
        ssh-keygen -t rsa  连续按三下回车即可
        2.拷贝公钥到远程服务器
        ssh-copy-id -i 公钥文件绝对路径  用户名@服务器ip地址
        """

右键点击:
image-20230112165254541

git终端:(模拟linux终端)
image-20230112165343349

查看公钥私钥文件:
image-20230112165526467

具体内容:
image-20230112165945403

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)

    # 执行命令
    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()

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

上下文管理器相关魔法方法 面试题

# 面试题 
# 魔法方法:__enter__ __exit__
# 请在Context类中添加代码完成该类的实现
class Context:
    pass
with Context() as ctx:
    ctx.do_something()

标签:公钥,私钥,文件属性,虚拟机,self,ssh,链接,paramiko
From: https://www.cnblogs.com/passion2021/p/17047214.html

相关文章