linux第四课---(文件相关命令、索引、链接命令、时间命令、paramiko模块使用、连接远程电脑的方法、sftp上传下载文件、paramiko模块功能封装、SFTP和FTP 区别、内网穿透原理 )

昨日内容回顾

  • etc目录

    配置相关
    /etc/profile
    	环境变量文件
    /etc/motd
    	开机欢迎界面
    
  • usr目录

    程序相关
    四种安装软件的方式
    	1.yum安装		自动解决依赖性问题
    	2.rap安装		不会自动解决依赖性问题 主要用于查看
    	3.编译安装	  类似于windows中自定义安装程序
    	4.二进制包    就是一个程序文件打开即用
    
  • var目录

    日志相关
    	服务器运行相关的日志以及用户登录相关的日志
    ps:针对日志文件的优化处理
    
  • proc目录

    硬件软件详细信息 cpu 内存 硬盘
    ps:服务器资产管理系统
    
  • 优化相关

    系统优化
    	远程仓库的更换(yum仓库 epel仓库)
    安全优化
    	selinux默认情况下需要关闭 因为会影响管理员的操作
    	防火墙 firewalld
    		systemctl status 服务名
     		systemctl stop 服务名
    		systemctl disable 服务名
    
  • 上传下载

    1.直接下载工具lrzsz
    2.使用xshell提供的拖拽方式
    """
    more\less
    head\tail
    linux三剑客
    	grep
    	sed
    	awk
    """
    
  • 别名功能

    我们学习的很多目录其实都是缩写的形式(别名)
    别名相关的关键字>>>:alias
    
  • 文件属性信息

    文件类型
    文件索引
    用户与用户组
    文件权限	4   2   1  0
    
  • 文件操作命令

    find查找文件
    tar压缩相关
    	tar -zcvf	打包压缩
    	tar -zxvf   解压缩
    

今日内容概要

  • 文件相关信息

  • 时间相关操作

  • crontab定时任务

  • paramiko模块

    1.公钥私钥
    2.模块代码
    3.代码封装
    

今日内容详细

文件相关命令


# 查看普通⽂件⼤⼩⽅法
 [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命令

crontab -l  # 查看当前用户开始了哪些定时任务

crontab -e  # 就会进入编辑页面,分时年月周,设置一下,具体百度crontab 定时任务 学一下就会了
任务的具体时间 任务的具体命令

.
.
.
.
.

paramiko模块

功能: 通过python代码连接服务器并执行相关操作

基本使用(用户名密码的方式,连接远程服务器)


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

----------------------------------------------------
pip3.8 install paramiko

# 基本使用(用户名密码的方式,连接远程服务器)
import paramiko


ssh = paramiko.SSHClient()  # 创建SSH对象(固定)

# 当前机器的ip地址,不在要连接主机know_hosts文件中,也允许去连接对方主机   (固定)
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 连接服务器(参数就是 要连接的服务器的ip地址,端口不作特殊说明的情况下,默认22)
# 用户名与密码就是主机的管理员的用户名与密码
ssh.connect(hostname='10.0.0.200', port=22, username='root', password='tengyifan')

# 让被连接的主机执行命令     连接对象点exec_command(命令)
# 并有3个返回值
stdin, stdout, stderr = ssh.exec_command('df')

"""
stdin  能够在执行命令的过程中,添加一些额外的参数     还可以用stdin继续传值

stdout 执行命令后,正确的执行结果  也就是你在远程主机命令行里敲的命令,命令行显示的结果

stderr 命令错误的执行结果

"""

# 获取命令结果
result = stdout.read()  # 这样就实现 通过代码的方式与服务器做交互了!!!

print(result.decode('utf8'))


# 关闭连接
ssh.close()

-----------------------

# 但是该方法有个问题,就是管理员的用户名与密码,在py文件里面,不太安全

# 又想去连远程主机,又不想直接用要连接的主机的用户名与密码去连接,怎么办?

# 这时候就有另外一种验证要连接远程主机的用户身份的一种方式  公钥私钥方式

-----------------------

.
.
.
.
.
.
.

公钥私钥

----------------------------------------------

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

# 简单的理解
    1.每台计算机都可以拥有自己的公钥和私钥
    2.你只需要将公钥交给别人,以后你拿着你的私钥就可以证明你的身份
    3.公钥可以发给多个人,私钥只能保存在本机,


# 公钥私钥详细的理解可以看这篇文章: 鲍勃的公钥私钥

.
.
.
.

如何让计算机产生公钥私钥


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

----------------------------------------------
----------------------------------------------

# 安装git软件
	桌面空白区域鼠标右键即可查看是否安装成功
	git bash here
	# 进入终端,模拟了linux的终端,这个终端就可以帮你创建公钥私钥,并且发送到远程服务器

---------------------------

    # 1.生成公钥私钥:   ssh-keygen -t rsa        # 连续按三下回车即可,就已经产生了

    # 2.拷贝公钥到远程服务器
        ssh-copy-id -i 当前公钥文件的绝对路径  用户名@服务器ip地址
      # 比如:ssh-copy-id -i /c/Users/teng'jin'cheng/.ssh/id_rsa.pub root@10.0.0.200
      # 意思就是将当前电脑下的公钥文件,发送给对应ip地址的主机,
      # 然后以管理员的身份命令该远程服务器,接收该公钥,怎么证明你是远程主机的管理员?
      # 然后输入要连的远程主机的密码 tengyifan  证明你是远程主机的管理员
      # 但是由于我这个文件夹的名字teng'jin'cheng 有点奇怪 linux不能识别
      # 所以我把公钥私钥复制到了Users目录下了
      # 所以命令就变成了 ssh-copy-id -i /c/Users/id_rsa.pub root@10.0.0.200


# 公钥私钥自动存在该目录下   C:\Users\teng'jin'cheng\.ssh

# 将公钥发送到想要连接的远程服务器上

# 将来本机想要连接远程的服务器,只需要通过该命令就行了    ssh 'root@10.0.0.200'


# 而且有了公钥私钥,就算远程电脑的管理员密码变了,我本机这边的也不需要改公钥私钥!!!
# 还是可以直接通过私钥,连接远程电脑的!!!

-----------------------------------------

.
.

用私钥,连接远程服务器 (因为本地的公钥已经发送到要连接的远程服务器上了)


    import paramiko

    # 读取本地私钥   括号里放(私钥文件在本机的路径地址)
    private_key = paramiko.RSAKey.from_private_key_file('/c/Users/teng/.ssh/id_rsa')

    ssh = paramiko.SSHClient()  # 创建SSH对象

    # 允许连接不在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()


-----------------------------------------

公钥私钥自动存在该目录下 C:\Users\teng'jin'cheng.ssh
image
.
.
这样就将本地的公钥,通过远程服务器的用户名与密码,发送到了远程服务器上了!!!
将来本机想要连接远程的服务器,只需要通过该命令就行了 ssh 'root@10.0.0.200'
image
.
.
本机敲该命令直接就连上远程的服务器了 ssh 'root@10.0.0.200'
就和在服务器的linux命令行里一样,直接敲命令就行了
image
.
.
.
.

补充


将来如果公司用 gitlab 或者github 等,就需要把自己的公钥往公司的远程平台上提交一份,
以后你才有资格从平台上拉代码,与推代码

所以进公司,先用电脑产生公钥私钥,然后把公钥,往各个软件上发一份


.
.
.
.
.
.
.

paramiko模块的sftp操作

支持本地电脑与远程电脑之间的数据交互!!!

上传文件到远程 从远程下载文件到本地


import paramiko

# 用户名和密码的方式连接远程电脑,上传与下载文件
# sftp连接后,就可以实现本地上传文件到远程,或远程文件下载到本地

transport = paramiko.Transport(('10.0.0.200', 22))
transport.connect(username='root', password='tengyifan')
# 用远的账户与密码连接上远程电脑


sftp = paramiko.SFTPClient.from_transport(transport)  # 产生sftp对象(固定代码)


# 上传文件
# sftp.put("本地文件路径", '远程服务器路径')  # 注意上传文件到远程某个文件下 文件必须存在
sftp.put(r"D:\pythonProject\qqq\aaa.txt", r'/root/aaa.txt')


# 下载文件   将远程文件下载到本地   sftp.get('远程服务器路径',"本地文件路径")
sftp.get(r'/root/teng.txt', r'D:\pythonProject\qqq\teng.txt')


transport.close()


----------------------------------------------------
----------------------------------------------------

# 公钥和私钥 的方式连接远程电脑,上传与下载文件

import paramiko

private_key = paramiko.RSAKey.from_private_key_file(r'C:\Users\id_rsa')
transport = paramiko.Transport(('10.0.0.200', 22))
transport.connect(username='root', pkey=private_key)

sftp = paramiko.SFTPClient.from_transport(transport)

# 上传文件
sftp.put(r"D:\pythonProject\qqq\aaa.txt", r'/root/bbb.txt')


# 下载文件
sftp.get(r'/root/bbb.txt', r'D:\pythonProject\qqq\bbq.txt')
transport.close()

.
.
.
.

paramiko模块功能封装


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

class SSHProxy(object):

    # 所有需要的参数,封装到双下init里面去
    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对象(固定)
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

        ssh._transport = self.transport  # 这句话好像没啥用

        stdin, stdout, stderr = ssh.exec_command(cmd)
        result = stdout.read()
        result = result.decode('utf8')  # 可能不需要,具体看情况
        return result

    # 上传文件
    def upload(self, local_path, remote_path):
        sftp = paramiko.SFTPClient.from_transport(self.transport)
        sftp.put(local_path, remote_path)
        sftp.close()

    # 下载文件
    def download(self, local_path, remote_path)
        sftp = paramiko.SFTPClient.from_transport(self.transport)
        sftp.get(remote_path, local_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()

if __name__ == '__main__':
    with SSHProxy("10.0.0.200",22,'root','tengyifan') as ssh:

        # 拿到改对象后就可以无限制的在一个链接内执行命令,或者上传下载文件了
        res= ssh.command('df')
        print(res)

        ssh.command('ls')
        ssh.upload(r'D:\jason\s10\day01\4.基于paramiko操作\xx', '/data/s27/xx')



"""
推导步骤:

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__方法

"""

.
.
.
.

SFTP 和 FTP 区别:


sftp是一种数据流连接,提供文件访问、传输、管理功能的网络传输协议,
在计算机领域中它称为 SSH文件传输协议,英文是SSH File Transfer Protocol


ftp的英文名是 File Transfer Protocol,文件传输协议,
是一套用于网络文件传输的标准协议,它工作在osi模型的第七层,tcp模型的第四层,即应用层
使用 TCP 传输, 客户在和服务器建立连接前要经过一个“三次握手”的过程,
保证客户与服务器之间的连接是可靠的,并且,ftp允许用户以文件操作的方式与另一主机互相通信。
FTP传输模式分为主动模式和被动模式,它凭借自身独特的优势一直都是因特网中最重要、最广泛的服务之一。


ftp密码和数据以纯文本格式发送,大多数情况下是不加密的,安全性不高。
sftp会在发送之前加密数据,二进制的形式传递,是无法“按原样”阅读的,安全性较高。


SFTP 和 FTP 非常相似,都支持批量传输(一次传输多个文件),文件移动,文件夹或目录创建,文件删除等。
但还是存在着差异,SFTP 和 FTP 之间的区别:


# 链接方式不同:
FTP 使用 TCP 端口 21 上的控制连接建立连接。
而 SFTP 是在客户端和服务器之间通过 SSH 协议 (TCP 端口 22) 建立的安全连接来传输文件。

# 安全性不同:
SFTP 使用加密传输认证信息和传输的数据,所以使用 SFTP 相对于 FTP 是非常安全。

# 效率不同
SFTP 这种传输方式使用了加密解密技术,所以传输效率比普通的 FTP 要低得多。

# 使用的协议不同
FTP 使用 TCP / IP 协议。而,SFTP 是 SSH 协议的一部分,它是一种远程登录信息。

# 安全通道
FTP 不提供任何安全通道来在主机之间传输文件;
而 SFTP 协议提供了一个安全通道,用于在网络上的主机之间传输文件。


.
.
.
.

内网穿透原理


内网穿透的英文叫做 NAT traversal,又被称为内网映射
通过公网访问内网中的设备或服务, 比如在远程控制家里的电脑,控制家里的设备,远程控制公司的电脑

原理就是:把内网上的服务,映射到公网上,让公网用户可以访问到这些服务,
这个过程通常需要中转服务器来完成,中转服务器又叫穿透服务器,
穿透服务器提供一个公网地址,用户通过这个公网地址,访问穿透服务器,
穿透服务器再把请求转发到内网中的目标服务器上,
这样就实现了,公网用户访问内网服务的目的。

# 可以理解为路由器就是一个代理服务器
一般要实现内网穿透,必须要先有一个公网ip的穿透服务器或路由器,
这样用户通过公网ip访问到穿透服务器或路由器,再由穿透服务器或路由器把请求,
转发到内网中的目标服务器上

# 例如将内网中的80端口映射到公网ip的3000端口,用户只需要在公网上访问穿透服务器的ip地址和3000端口
# 就可以访问到内网的80端口监听的http服务了


.
.
.
.
.

posted @   tengyifan  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示