软考网络工程师实验指南(三)Windows Server 2003打印服务器配置详解
【实验说明】打印服务器是Windows Server 2003中常用的服务之一。本文将涉及到如下内容,本地打印机的安装、网络接口打印机的安装、打印池的配置、打印机的优先级设置以及通过网络管理打印机。在客户端将介绍如何安装网络打印机。
【所需软件】
1、VMware Workstation 6.5 英文正式版
2、Windows Server 2003 SP2 企业版原版光盘镜像
【实验步骤】
一、本地打印机的安装
1)单击开始-控制面板-打印机和传真-添加打印机,出现添加打印机欢迎窗口,点击下一步继续
2)选择链接到此计算机的本地打印机,去掉自动检测的复选框中的勾,以便自己选择型号。(提示:现在我们常见的打印机驱动安装方式为执行附带光盘中的安装程序,然后会自动将驱动复制到系统中,这样带我们接入打印机后,系统会自动检测并安装驱动,我们只需要简单的按照提示操作即可)
3)选择正确的打印机端口
4)选择打印机型号,如果列表中不存在您的打印机型号,请点击从磁盘安装,手动选择打印机驱动,这里我们以EPSON DLQ-1000K为例
5)设置打印机名称
6)设置共享名。当然也可以不设置,安装完成以后再设置也可以
7)设置相关信息说明
8)打印测试页,测试打印机是否正常工作
9)完成打印机的安装。注意,这里点击完成后会复制驱动程序,可能需要提供Windows Server 2003的系统安装盘
10)成功安装本地打印机,EPSON DLQ-1000K就是我们所安装的打印机,下面有个小手意味着正在共享
二、网络接口打印机的安装
这种打印机自带网卡接口,并且可以配置IP,接入网络中使用。
1)请参考安装本地打印机的第一步
2)请参考安装本地打印机的第二步
3)选择创建新端口,端口类型处选择Standard TCP/IP Port
4)添加标准TCP/IP打印机端口向导
5)输入打印机的IP地址,请确保本地与网络接口打印机可以正常通信
6)选择打印机接口的设备类型
7)完成向导,进入打印型号的选择
8)余下的步骤请参考本地打印机的安装第四步到第九步
9)完成网络接口打印机的安装
三、打印池的设置
打印池既将多个同种型号的打印机组合在一起,成为一个集合。当服务器接收到打印任务时,自动分配给限制的打印机进行工作,类似服务器的负载均衡。
1)由于打印池中的打印机都是同种型号,所以不需要重复安装打印机驱动,只需要选择端口即可。右键单击EPSON DLQ-1000K选择属性,在端口选项卡下启用打印池,并选择连接打印机的端口
四、打印机的优先级设置
打印机的优先级顾名思义就是优先为谁服务,实现方法就是重复安装同一个打印机,这样就会出现多个打印机,然后为每个打印机设置不同的优先级,同时分配不同权限,然后在客户端设置相应的打印机,即可实现打印机的优先级分配。
1)重复添加本地打印机,步骤参考安装本地打印机的步骤
2)为打印机重命名加以区分
3)设置manager的优先级为99最高,同时设置权限只有“小五”可以使用。右键单击manager选择属性
4)设置user打印机优先级为1最低,并设置为everyone的权限为打印
5)最后只需要为不同的用户添加不同的网路打印机即可,具体步骤请参考第六步为客户机安装网络打印机
五、通过网络管理打印
我们可以通过web界面对远程打印机进行管理,此时需要安装IIS服务中的一个internat打印服务,同时也需要安装iis服务,具体安装如下
1)安装IIS和internat打印服务。单击开始-控制面板-添加或删除程序,单击左侧添加或删除windows组件,如图。安装过程中可能会提示插入Windows Server 2003系统盘。
2)安装完成后,只需要在地址栏中输入服务器的IP地址+Printers就可以访问了。访问后会提示输入管理员账号密码
3)网络打印机管理界面
五、为客户端安装网络打印机
1)请参考安装本地打印机的第一步
2)选择第二项,网络打印机或链接到其它计算机的打印机
3)输入打印机的UNC地址,点击下一步,系统会自动安装网络打印。
4)安装完成
5)成功的为客户端配置了网络打印机
本文转自 Jhuster 51CTO博客,原文链接:http://blog.51cto.com/xwnet/138817,如需转载请自行联系原作者
2. 加入k8s集群
加入k8s集群
在使用kubeadm安装k8s中介绍了如何安装k8s主节点,这篇文章我们来介绍如何加入k8s集群。
环境要求
同上一篇的环境要求
首先,从我们的镜像服务器获取docker镜像
获取镜像shell脚本
然后,获取加入k8s集群的授权码
在上篇文章中,当执行kubeadm init命令成功后,会打印加入k8s集群需要的命令,如下:
kubeadm join 194.168.1.15:6443 --token ninsl0.hgnutou2p9f9u8d4 --discovery-token-ca-cert-hash sha256:ba73076c46a143260ba876d09174f558deb1941794621591cbc104d63c50adaa
将这条命令复制到子节点,执行,以便加入k8s集群(如果发现docker版本错误的提示,可以忽略,或者去官网查找如何忽略版本检查)。
执行命令后,等待节点启动
在master节点上执行kubectl get nodes查看各节点的status,直到所有的状态均为Ready。
在子节点上执行kubectl命令
默认情况下,子节点执行kubectl命令几乎是不可用的,为了使kubectl命令正常,需要将master节点上的/etc/kubernetes/admin.conf文件复制到本地,命令如下:
//复制文件命令
scp user@master-ip:/etc/kubernetes/admin.conf .
//vi .profile编辑改文件,加入环境变量
export KUBECONFIG=/root/admin.conf
//是配置生效
source .profile
此时就可以在该节点执行kubectl命令,执行kubectl get nodes命令查看效果。
浅谈139/445与入侵2K主机
原创文章,转载请保留以下信息
作者:ipist (ipist#126.com)
来源:[url]http://www.xfocus.net[/url]
SMB(Server Message Block),Windows协议族,用于文件和打印共享服务。在Win9X/NT中SMB基于NBT实现,NBT(NetBIOS over TCP/IP)使用137, 138 (UDP) and 139 (TCP)来实现基于TCP/IP的NETBIOS网际互联;而在Win2K以后,SMB除了基于NBT的实现,还可以直接运行在TCP/IP上,而没有额外的NBT层,使用TCP445端口。
当Win9X/NT(允许NBT)作为client来连接SMB服务器时,由于设计时并没有考虑到445端口因此只会连接服务器的139端口;而当Win2K/XP(允许NBT)作为client来连接SMB服务器时,它会同时尝试连接139和445端口,如果445端口有响应,那么就发送RST包给139端口断开连接,以455端口通讯来继续.当445端口无响应时,才使用139端口。
假如我们的扫描结果显示对方打开了TCP139或445,这无疑方便了我们今后对它的文件传输和管理,使用NET命令对服务器进行远程管理操作,还有像NTCMD、Enum、Letmein、SMBCrack之类的工具都要基于这些端口来完成任务。但是要想成功利用这些端口,本地作为client还要满足一定的要求。
如果对方只有139,要想利用它,本机必须“网络连接/属性/TCPIP协议/属性/高级/WINS”中设置启用NBT(NetBIOS over TCP/IP),将你的本地防火墙设置为允许这3个端口的通信,否则将无法与对方建立连接。使用普通拨号上网的用户就需要在拨号连接的网络属性里面通过选中“Microsoft 网络客户端”和“Microsoft 网络的文件和打印机共享”这两个组件来启用NBT,否则如果本地为Win9X/WinNT则直接显示无法连接,如果本地为Win2K/XP则直接尝试连接对方的445而跳过连接NBT,结果连接失败。
如果对方只有445,本机要是Win2K以后的系统就可以直接连接,但如果本机是Win9X/WinNT,由于Win9X/WinNT所实现的SMB只能基于NBT,因而此时本机只会尝试139而不能和445建立连接,此时本机就无法使用基于SMB的工具。所以说入侵NT/2000最好还是使用Win2K。
要是2个端口都开了,那就最好了,只要满足其中任一个连接要求就可以。
本文转自ipist 51CTO博客,原文链接:http://blog.51cto.com/ipist/11117,如需转载请自行联系原作者
TCP状态
TCP连接中包含不同的状态,如何通过状态来判断程序问题尤为重要。
三次握手
图中的connection部分为三次握手。
四次握手
图中的close部分为四次握手。
CLOSE_WAIT
服务器接受到FIN关闭请求后为CLOSE_WAIT状态。
默认情况下,CLOSE_WAIT状态会至少维持2小时的状态。
由于CLOSE_WAIT状态后应该发送ACK请求,状态会变为LAST_ACK,但如果由太多的CLOSE_WAIT状态,则服务器出现错误。
TIME_WAIT
客户端在接受到服务器的FIN关闭请求后为TIME_WAIT状态,最后会自动切换到CLOSE状态。
当服务器主动关闭链接时形成TIME_WAIT状态,会持续2个MSL(Max Segment Lifetime),默认为4分钟。
TIME_WAIT状态下的socket不能被回收使用,具体现象是对于一个处理大量短连接的服务器,如果由于服务器主动关闭客户端的连接,将导致服务器产生大量处于TIME_WAIT状态的socket,严重影响服务器的处理能力。
AWK和NETSTAT命令
# -n表示-net
netstat -n
# -v用于定义参数
netstat -net | awk -v i=0,j=0 '{if ($6=="ESTABLISHED") {i++}; if ($6 == "CLOSE_WAIT") {j++}; print i, j, prit $6}'
# 最佳用法如下:
# 1. 使用正则/xxx/来匹配行
# 2. $NF代表最后一列的数据,命令中定义了一个字典,最后一列数据作为key
# 3. 每次匹配都会让value递增
# 4. END表示结束
# 5. 最后的{}用来打印key,value
netstat -n | awk '/^tcp/ {++S[$NF]} END {for (a in S) print a, S[a]}'
那么,如何对结果进行排序呢?
# 利用管道
netstat -n | awk '/^tcp/ {++S[$NF]} END {for (a in S) print a, S[a] | "sort -r -n -k2"}'
# 其中,sort为外部命令,-r代表从大到小(倒序),-n代表按照数字排序,-k2代表按照第2行排序。
此外,也可以使用asort来实现结果排序。
本文转自cococo点点博客园博客,原文链接:http://www.cnblogs.com/coder2012/p/5199333.html,如需转载请自行联系原作者
TCP状态
TCP连接中包含不同的状态,如何通过状态来判断程序问题尤为重要。
三次握手
图中的connection部分为三次握手。
四次握手
图中的close部分为四次握手。
CLOSE_WAIT
服务器接受到FIN关闭请求后为CLOSE_WAIT状态。
默认情况下,CLOSE_WAIT状态会至少维持2小时的状态。
由于CLOSE_WAIT状态后应该发送ACK请求,状态会变为LAST_ACK,但如果由太多的CLOSE_WAIT状态,则服务器出现错误。
TIME_WAIT
客户端在接受到服务器的FIN关闭请求后为TIME_WAIT状态,最后会自动切换到CLOSE状态。
当服务器主动关闭链接时形成TIME_WAIT状态,会持续2个MSL(Max Segment Lifetime),默认为4分钟。
TIME_WAIT状态下的socket不能被回收使用,具体现象是对于一个处理大量短连接的服务器,如果由于服务器主动关闭客户端的连接,将导致服务器产生大量处于TIME_WAIT状态的socket,严重影响服务器的处理能力。
AWK和NETSTAT命令
# -n表示-net
netstat -n
# -v用于定义参数
netstat -net | awk -v i=0,j=0 '{if ($6=="ESTABLISHED") {i++}; if ($6 == "CLOSE_WAIT") {j++}; print i, j, prit $6}'
# 最佳用法如下:
# 1. 使用正则/xxx/来匹配行
# 2. $NF代表最后一列的数据,命令中定义了一个字典,最后一列数据作为key
# 3. 每次匹配都会让value递增
# 4. END表示结束
# 5. 最后的{}用来打印key,value
netstat -n | awk '/^tcp/ {++S[$NF]} END {for (a in S) print a, S[a]}'
那么,如何对结果进行排序呢?
# 利用管道
netstat -n | awk '/^tcp/ {++S[$NF]} END {for (a in S) print a, S[a] | "sort -r -n -k2"}'
# 其中,sort为外部命令,-r代表从大到小(倒序),-n代表按照数字排序,-k2代表按照第2行排序。
此外,也可以使用asort来实现结果排序。
```
本文 由 cococo点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012
查看服务器系统资源(cpu,内容)利用率前几位的进程的方法
在日常运维工作中,我们经常需要了解服务器上的系统资源的使用情况,要清楚知道一些重要进程所占的资源比例。这就需要熟练掌握下面几个命令的使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1)查看占用CPU最高的5个进程
# ps aux | sort -k3rn | head -5
或者
# top (然后按下P,注意大写,CPU使用率降序)
2)查看占用内存最高的5个进程
# ps aux | sort -k4rn | head -5
或者
# top (然后按下M,注意大写,内存使用率降序)
3)查看所有信息使用命令
# ps aux
------------------------------
sort|uniq 排序去重
sort|uniq -c 打印重复的次数
sort|uniq -d 打印交集的部分
sort|uniq -u 打印去掉交集的部分
sort -rn 降序
sort -k3rn 按照第三列降序
举例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
[root@bastion-IDC ~]# cat a
sdfasasdf
2
3
4
asdfasf
asdfsdfasdfasdf
[root@bastion-IDC ~]# cat b
adfasf1231
2
3
sdf435
4
[root@bastion-IDC ~]# cat a b|sort|uniq
2
3
4
adfasf1231
asdfasf
asdfsdfasdfasdf
sdf435
sdfasasdf
[root@bastion-IDC ~]# cat a b|sort|uniq -c
2 2
2 3
2 4
1 adfasf1231
1 asdfasf
1 asdfsdfasdfasdf
1 sdf435
1 sdfasasdf
[root@bastion-IDC ~]# cat a b|sort|uniq -d
2
3
4
[root@bastion-IDC ~]# cat a b|sort|uniq -u
adfasf1231
asdfasf
asdfsdfasdfasdf
sdf435
sdfasasdf
***************当你发现自己的才华撑不起野心时,就请安静下来学习吧***************
分类: 常规运维实录
本文转自散尽浮华博客园博客,原文链接:http://www.cnblogs.com/kevingrace/p/5884416.html,如需转载请自行联系原作者
打印机安装脚本说明
打印机安装脚本说明
打印机DOS命令行
用法: rundll32 printui.dll,PrintUIEntry [options] [@commandfile]
/a[file] 二进制文件名
/b[name] 基本打印机名
/c[name] 如果操作在远程机器上,unc 机器名
/dl 删除本地打印机
/dn 删除网络打印机连接
/dd 删除打印机驱动程序
/e 显示打印首选项
/f[file] inf 文件或输出文件
/F[file] 使用 /f 指定的 INF 文件可能依赖的 INF 文件的位置
/ga 添加每个机器打印机连接(用户登录时此连接将传播到用户)
/ge 枚举每个机器打印机连接
/gd 删除每个机器打印机连接(用户登录时此连接将被删除)
/h[arch] 驱动程序体系结构,为下列之一: x86 或 x64 或 Itanium
/ia 用 INF 文件安装打印机驱动程序
/id 用添加打印机驱动程序向导安装打印机驱动程序
/if 用 INF 文件安装打印机
/ii 用带 INF 文件的添加打印机向导安装打印机
/il 用添加打印机向导安装打印机
/in 添加网络打印机连接
/ip 使用网络打印机安装向导安装打印机
/j[provider] 打印提供程序名称
/k 将测试页打印到指定的打印机,不能安装打印机时的命令组合
/l[path] 打印机驱动程序源路径
/m[model] 打印机驱动程序型号名
/n[name] 打印机名
/o 显示打印机队列查看
/p 显示打印机属性
/q 安静模式,不显示错误信息
/r[port] 端口名
/s 显示服务器属性
/Ss 将打印机设置存到一个文件
/Sr 从一个文件还原打印机设置
储存或还原必须放在命令结尾的打印机设置选项标志:
2 PRINTER_INFO_2
7 PRINTER_INFO_7
c 颜色配置文件
d 打印机数据
s 安全描述符
g 全局 DevMode
m 最低设置
u 用户 DevMode
r 解决名称冲突
f 强制使用名称
p 解析端口
i 驱动程序名称冲突
/u 如果已安装,则使用现有的打印机驱动程序
/t[#] 起始的以零为基础的索引页
/v[version] 驱动程序版本,为下列之一:“类型 2 - 内核模式”或“类型 3 - 用户模式”
/w 如果在 INF 中找不到指定的驱动程序,则提示用户
/y 将打印机设置为默认打印机
/Xg 获得打印机设置
/Xs 设定打印机设置
/z 不要自动共享这台打印机
/Z 不要自动生成打印机名
/K 更改 /h 的含义,使其接受 2、3、4 分别代表 x86、x64 或 Itanium,并更改 /v 的含义,使其接受 3 作为“类型 3 - 用户模式”
/Z 共享这台打印机,只能跟 /if 选项一起使用
/? 帮助信息
@[file] 命令行参数文件
/Mw[message] 确认命令之前显示警告消息
/Mq[message] 确认命令之前显示确认消息
/W[flags] 指定向导(APW 和 APDW)的标志和切换
r 使向导可以从上一页重新启动
/G[flags] 指定全局标志和切换
w 抑制安装程序驱动程序警告 UI (超级静声模式)
/R 将强制所选驱动程序替换现有驱动程序
例如:
运行服务器属性:
rundll32 printui.dll,PrintUIEntry /s /t1 /c\\machine
运行打印机属性:
rundll32 printui.dll,PrintUIEntry /p /n\\machine\printer
本地运行添加打印机向导:
rundll32 printui.dll,PrintUIEntry /il
在 \\machine:
rundll32 printui.dll,PrintUIEntry /il /c\\machine 运行添加打印机向导
运行队列查看:
rundll32 printui.dll,PrintUIEntry /o /n\\machine\printer
运行 INF 安装:
rundll32 printui.dll,PrintUIEntry /if /b "Test Printer" /f c:\infpath\infFile.inf /r "lpt1:" /m "Brother DCP-128C"
运行 INF 安装(具有 INF 依赖关系)。在此示例中,prnbr002.inf 依赖于 ntprint.inf
rundll32 printui.dll, PrintUIEntry /ia /m "Brother DCP-128C" /K /h x64 /v 3 /f "c:\infpath\prnbr002.inf" /F "c:\infpath\ntprint.inf"
使用 INF 运行添加打印机向导:
rundll32 printui.dll,PrintUIEntry /ii /f c:\infpath\infFile.inf
使用内置打印机驱动程序添加打印机:
rundll32 printui.dll,PrintUIEntry /if /b "Test Printer" /r "lpt1:" /m "Brother DCP-128C"
添加每个机器打印机连接(用户登录时此连接将传播到用户):
rundll32 printui.dll,PrintUIEntry /ga /c\\machine /n\\machine\printer /j"LanMan Print Services"
删除每个机器打印机连接(用户登录时此连接将被删除):
rundll32 printui.dll,PrintUIEntry /gd /c\\machine /n\\machine\printer
枚举每个机器打印机连接:
rundll32 printui.dll,PrintUIEntry /ge /c\\machine
使用 INF 添加打印机驱动程序:
rundll32 printui.dll,PrintUIEntry /ia /c\\machine /m "Brother DCP-128C" /h "x86" /v "Type 3 - User Mode" /f c:\infpath\infFile.inf
使用 INF 添加打印机驱动程序:
rundll32 printui.dll,PrintUIEntry /ia /K /c\\machine /m "Brother DCP-128C" /h "x86" /v 3
添加内置打印机驱动程序:
rundll32 printui.dll,PrintUIEntry /ia /c\\machine /m "Brother DCP-128C" /h "Intel" /v "Type 3 - Kernel Mode"
删除打印机驱动程序:
rundll32 printui.dll,PrintUIEntry /dd /c\\machine /m "Brother DCP-128C" /h "x86" /v "Type 3 - User Mode"
删除打印机驱动程序:
rundll32 printui.dll,PrintUIEntry /dd /K /c\\machine /m "Brother DCP-128C" /h "x86" /v 3
将打印机设置为默认打印机:
rundll32 printui.dll,PrintUIEntry /y /n "printer"
设置打印机注解:
rundll32 printui.dll,PrintUIEntry /Xs /n "printer" comment "My Cool Printer"
取得打印机设置:
rundll32 printui.dll,PrintUIEntry /Xg /n "printer"
取得文件中的打印机设置保存结果:
rundll32 printui.dll,PrintUIEntry /f "results.txt" /Xg /n "printer"
设置打印机设置命令使用:
rundll32 printui.dll,PrintUIEntry /Xs /n "printer" ?
将所有打印机设置存入一个文件:
rundll32 printui.dll,PrintUIEntry /Xs /n "printer" ?
从一个文件还原所有打印机设置:
rundll32 printui.dll,PrintUIEntry /Sr /n "printer" /a "file.dat"
将二级打印机信息存入一个文件:
rundll32 printui.dll,PrintUIEntry /Ss /n "printer" /a "file.dat" 2
从一个文件还原打印机安全描述符:
rundll32 printui.dll,PrintUIEntry /Sr /n "printer" /a "file.dat" s
从一个文件还原打印机全局 devmode 和打印机数据:
rundll32 printui.dll,PrintUIEntry /Sr /n "printer" /a "file.dat" g d
从文件最少设置还原并分析端口名:
rundll32 printui.dll,PrintUIEntry /Sr /n "printer" /a "file.dat" m p
启用打印机的客户端呈现:
rundll32 printui.dll,PrintUIEntry /Xs /n"printer" ClientSideRender enabled
禁用打印机的客户端呈现:
rundll32 printui.dll,PrintUIEntry /Xs /n"printer" ClientSideRender disabled
本文转自 bilinyee博客,原文链接: http://blog.51cto.com/ericfu/1890051 如需转载请自行联系原作者
打印机安装脚本说明
为k8s里运行的容器配置时区
需求背景我们经常会用一些诸如emqx,nats等第三方中间件,这些中间件往往默认时区就是UTC时区,这其实也没关系,但是打印出来的日志,就会与我们的上海时区差8小时,为了解决这个问题,我的简单解决办法,就是把服务器的时区通过可读的方式挂载进去。操作步骤1、把服务器的时区设置成上海时区。ubuntu18系统时区设置方法如下:timedatectl set-timezone Asia/Shanghai2、修改emqx的StatefulSet.yaml 。注意挂载服务器的/etc/localtime到容器中,一定要设置readOnly: true,避免被误修改服务器的时区# Source: emqx/templates/statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app: lzw-emqx
name: lzw-emqx
spec:
serviceName: lzw-emqx
replicas: 1
updateStrategy:
type: RollingUpdate
selector:
matchLabels:
app: lzw-emqx
template:
metadata:
labels:
app: lzw-emqx
spec:
containers:
- image: emqx/emqx:4.2.4-alpine-amd64
imagePullPolicy: IfNotPresent
name: lzw-emqx
envFrom:
- configMapRef:
name: lzw-emqx
volumeMounts:
- name: lzw-emqx-log
mountPath: /opt/emqx/log
- name: sfere-time-zone
mountPath: /etc/localtime
readOnly: true
readinessProbe:
httpGet:
path: /status
port: 8081
initialDelaySeconds: 15
periodSeconds: 2
restartPolicy: Always
volumes:
- name: lzw-emqx-log
emptyDir: {}
- name: sfere-time-zone
hostPath:
path: /etc/localtime
python加密模块-hashlib模块
hashlib模块
用于加密相关的操作,3.X里代替了md5模块和sha模块,主要提供SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法
(sha比md5 更复杂、md5 不能反解)
具体应用:用于网站防篡改。具体方法:监控网站被篡改,定时的去wget 去下载,然后md5比对 ,检查网站是否被篡改。
如何验证md5 呢, 就是在生成一次md5值 比较是否相同。
具体使用方法:
#导入模块
import hashlib
生成一个加密的对象并复制给变量
m = hashlib.md5()
给对象输入加密bytes字符类型
m.update(b"hello")
m.update(b"it's me")
打印加密后的md5值,输出二进制hash
print(m.digest())
打印加密后的md5值,输出十六进制格式hash
print(m.hexdigest())
查看十六进制格式hash的长度为32
print(len(m.hexdigest()))
以下是六种加密方法一一示例:
# SHA1加密
sha = hashlib.sha1()
sha.update("管理员".encode(encoding="utf-8"))
print(sha.hexdigest())
# SHA224加密
sha224 = hashlib.sha224()
sha224.update(b"admin")
print(sha224.hexdigest())
# SHA256加密
sha256 = hashlib.sha256()
sha256.update(b"admin")
print(sha256.hexdigest())
# SHA384加密
sha384 = hashlib.sha384()
sha384.update(b"admin")
print(sha384.hexdigest())
# SHA512加密
sha512 = hashlib.sha512()
sha512.update(b"admin")
print(sha512.hexdigest())
# MD5加密
md5 = hashlib.md5()
md5.update(b"admin")
print(md5.hexdigest())
hmac模块
python还有一个hmac模块,它内部对我们创建key和内容 再进行处理 再加密!
散列消息鉴别码,简称HMAC,是一种基于消息鉴别码MAC(Message Authentication Code)的鉴别机制。使用HMAC时,消息通讯的双方,通过验证消息中加入的鉴别密钥K来鉴别消息的真伪;
一般用于网络通信中消息加密,前提是双方先要约定好key,就像接头暗号一样,然后消息发送,用key把消息加密,接收方用key + 消息明文再加密,拿加密后的值 跟 发送者的相对比是否相等,这样就能验证消息的真实性,及发送者的合法性了。
算法表示:
算法公式 : HMAC(K,M)=H(K⊕opad∣H(K⊕ipad∣M))[1]
H 代表所采用的HASH算法(如SHA-256)
K 代表认证密码
Ko 代表HASH算法的密文
M 代表一个消息输入
B 代表H中所处理的块大小,这个大小是处理块大小,而不是输出hash的大小
如,SHA-1和SHA-256 B = 64
SHA-384和SHA-512 B = 128
L 表示hash的大小
Opad 用0x5c重复B次
Ipad 用0x36重复B次
Apad 用0x878FE1F3重复(L/4)次
认证流程
(1) 先由客户端向服务器发出一个验证请求。
(2) 服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为挑战)。
(3) 客户端将收到的随机数提供给ePass,由ePass使用该随机数与存储在ePass中的密钥进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。
(4) 与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户。
具体使用方法:
#导入模块import#设置密码和消息 进行加密new"哈哈哈""utf-8""你好""utf-8"#打印加密后的字符print//,如需转载请自行联系原作者
C# 热敏打印机 小票打印机 打印图片
这两天一直在研究热敏小票打印机打印图片的问题,在经过痛苦的找资料过程后,终于实验成功了。经过一番测试和修改,代码终于出炉了,这次打印条形码、二维码、Logo就方便多了。
这个代码在爱普生EPSON的代码上更改的,在思普瑞特(SPRT)SP-POS58III的热敏小票打印机上实验成功,吉成GS-58系列上没有实验成功。唯拓VT-58G、佳博GP-80XXX等,由于暂时没有这些打印机,所以没及时测试。吉成GS-58系列上的问题暂时不知道什么问题。所以如果你是吉成的小票机,或许你可以参考参考代码,但不保证可用。
这份代码是通过Socket连接到网络打印机进行打印的,本地的暂时没有测试,所以没有发。PrintLine方法是打印字符的,而PrintPic方法,则是打印图片的。初始化的时候,要给定网络打印机的ip。
经过测试,二维码的图片最好用200x200的,条形码则可以用300x200的。
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace POSPrinter
{
/// <summary>
/// POSPrinter的摘要说明。
/// 此类处理网络打印,使用了IP端口.
/// </summary>
public class NetPOSPrinter
{
string ipPort = "127.0.0.1";
public NetPOSPrinter()
{
}
public NetPOSPrinter(string IpPort)
{
this.ipPort = IpPort;//打印机端口
}
/// <summary>
/// 输出文字到打印机
/// </summary>
/// <param name= "str "> 要打印的内容 </param>
public void PrintLine(string str)
{
//建立连接
IPAddress ipa = IPAddress.Parse(ipPort);
IPEndPoint ipe = new IPEndPoint(ipa, 9100);//9100为小票打印机指定端口
Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
soc.Connect(ipe);
//string str= "hello,123456789,大家好! ";
byte[] b = System.Text.Encoding.GetEncoding("GB2312").GetBytes(str);
soc.Send(b);
soc.Close();
}
public void PrintPic(Bitmap bmp)
{
//把ip和端口转化为IPEndPoint实例
IPEndPoint ip_endpoint = new IPEndPoint(IPAddress.Parse(ipPort), 9100);
//创建一个Socket
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接到服务器
socket.Connect(ip_endpoint);
//应对同步Connect超时过长的办法,猜测应该是先用异步方式建立以个连接然后,
//确认连接是否可用,然后报错或者关闭后,重新建立一个同步连接
//socket.SendTimeout = 1000;
//初始化打印机,并打印
Byte[] byte_send = Encoding.GetEncoding("gb18030").GetBytes("\x1b\x40");
//发送测试信息
socket.Send(byte_send, byte_send.Length, 0);
byte[] data = new byte[] { 0x1B, 0x33, 0x00 };
socket.Send(data, data.Length, 0);
data[0] = (byte)'\x00';
data[1] = (byte)'\x00';
data[2] = (byte)'\x00'; // Clear to Zero.
Color pixelColor;
// ESC * m nL nH 点阵图
byte[] escBmp = new byte[] { 0x1B, 0x2A, 0x00, 0x00, 0x00 };
escBmp[2] = (byte)'\x21';
//nL, nH
escBmp[3] = (byte)(bmp.Width % 256);
escBmp[4] = (byte)(bmp.Width / 256);
// data
for (int i = 0; i < (bmp.Height / 24) + 1; i++)
{
socket.Send(escBmp, escBmp.Length, 0);
for (int j = 0; j < bmp.Width; j++)
{
for (int k = 0; k < 24; k++)
{
if (((i * 24) + k) < bmp.Height) // if within the BMP size
{
pixelColor = bmp.GetPixel(j, (i * 24) + k);
if (pixelColor.R == 0)
{
data[k / 8] += (byte)(128 >> (k % 8));
}
}
}
socket.Send(data, 3, 0);
data[0] = (byte)'\x00';
data[1] = (byte)'\x00';
data[2] = (byte)'\x00'; // Clear to Zero.
}
byte_send = Encoding.GetEncoding("gb18030").GetBytes("\n");
//发送测试信息
socket.Send(byte_send, byte_send.Length, 0);
} // data
byte_send = Encoding.GetEncoding("gb18030").GetBytes("\n");
//发送测试信息
socket.Send(byte_send, byte_send.Length, 0);
socket.Close();
}
/// <summary>
/// 打开钱箱
/// </summary>
public void OpenCashBox()
{
IPAddress ipa = IPAddress.Parse(ipPort);
IPEndPoint ipe = new IPEndPoint(ipa, 9100);//9100为小票打印机指定端口
Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
soc.Connect(ipe);
char[] c = { Convert.ToChar(27), 'p', Convert.ToChar(0), Convert.ToChar(60), Convert.ToChar(255) };
byte[] b = System.Text.Encoding.GetEncoding("GB2312").GetBytes(c);
soc.Send(b);
soc.Close();
}
}
}
(如果代码中提示Bitmap 不能识别,则要添加System.Windows.Forms和System.Drawing的引用。)
调用方法:
NetPOSPrinter posPrinter = new NetPOSPrinter(txtIP.Text);
posPrinter.PrintPic(new Bitmap(pictureBox1.Image));
并口打印的例子可以参见小蒋的博文《C#并口热敏小票打印机打印位图》。
网口热敏打印机机和并口热敏打印机打印图片的实例均可以在
这里 下载。