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
.
.
这样就将本地的公钥,通过远程服务器的用户名与密码,发送到了远程服务器上了!!!
将来本机想要连接远程的服务器,只需要通过该命令就行了 ssh 'root@10.0.0.200'
.
.
本机敲该命令直接就连上远程的服务器了 ssh 'root@10.0.0.200'
就和在服务器的linux命令行里一样,直接敲命令就行了
.
.
.
.
补充
将来如果公司用 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服务了
.
.
.
.
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?