1. TL;DR
此脚本能在现代主流Linux发行版中正常工作:
#! /bin/bashif [ -f /etc/os-release ]; then # 最后一个tr是为了防止可能出现的双引号or引号 cat /etc/os-release | grep "^ID=" | tr -d 'ID=' | tr -d "'\""else # 文件不存在,不能正常工作 echo "Unknown distribution! Please offer /etc/os-release file"fi
2. 如何断定脚本能在大多数主流Linux上正常工作的
任何运行systemd的发行版都会拥有os-release文件。因为systemd强制要求必须包含此文件。
systemd在现代Linux上使用的有多广泛,这不必多说了吧。
3. 相关资料
man os-release
systemd作者,关于os-release文件的论述
想要修改,输入sudo命令后出现的提示语(有中英两个版本)以及其出现次数:
图片来自另外一篇文章(懒得再截图了,但是那篇文章方法有问题
背景
最近想要修改sudo默认的提示语,但是根据中文互联网上的资料,需要我们重新对sudo重新编译才能更改提示语内容。
然而实际上是完全没有必要的,我们只需要更改/etc/sudoers配置文件即可。
同时更改sudoer配置文件也可以顺便实现控制提示语出现的条件。
默认提示语是只出现一次(ubuntu发行版默认不编译提示语,因此即使开启提示语,也没有信息输出)
我们也可以通过更改配置文件实现,永远不提示
每次都提示
TL;DR
1. 修改提示语内容
假设我们想要输入的提示语内容为:
We trust you have received the usual lecture from the local system administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think be ...
先放一张效果图:
实现效果图中的效果,我们大量使用了命令tput,这篇文章中我们会详细介绍tput命令。
什么是 tput?
man手册这么说道:
tput 命令将通过 terminfo 数据库对您的终端会话进行初始化和操作。通过使用 tput,您可以更改几项终端功能,如移动或更改光标、更改文本属性,以及清除终端屏幕的特定区域。
什么是 terminfo 数据库?
man手册这么说道:
UNIX 系统上的 terminfo 数据库用于定义终端和打印机的属性及功能,包括各设备(例如,终端和打印机)的行数和列数以及要发送至该设备的文本的属性。UNIX 中的几个常用程序都依赖 terminfo 数据库提供这些属性以及许多其他内容,其中包括 vi 和 emacs 编辑器以及 curses 和 man 程序。
tput 命令行简介
与 UNIX 中的大多数命令一样,tput 命令既可以用在 shell 命令行中也可以用在 shell 脚本中。
tput最常用也是最简单的用法为:Usage: tput capname
其中capname为对终端要进行的各种操作,具体有哪些capna ...
今天学习Linux的储存相关知识的时候,意外翻到了个很有意思的求助问题:求助者其有个30TB大的未分区的硬盘,本来是给Linux用的。这时他想让在这个Linux系统上的KVM虚拟机的Windows也能识别这个盘,但却不知道如何操作。
不过作者自己倒是折腾出来了,还写了个博客。巧了!这种问题我也不会,然而这种问题,又是在各种奇怪需求中可能会邂逅的问题,遇到了吧,还不好立马找到资料,于是翻译了下原文,给自己留个底。
原文:Heinous uses for Device Mapper (jiphex.github.io)
正文:
最近我遇到一个奇怪的情况,然而这个情况却让我领会到了Linux Device Mapper有趣性。虽然这可能永远不会用于生产环境,但是新奇的展示了Linux在块设备上到底是有多灵活。
总结一下在ServerFault(译者注:这个linux - Can Windows read an unpartitioned NTFS volume? (Single large partition) - Server Fault)的贴文,问题是这样的:
你有一个十分大的Li ...
题目
2180. 统计各位数字之和为偶数的整数个数
难度:简单
给你一个正整数 num ,请你统计并返回 小于或等于 num 且各位数字之和为 偶数 的正整数的数目。
正整数的 各位数字之和 是其所有位上的对应数字相加的结果。
示例 1:
输入: num = 4
输出: 2
解释:
只有 2 和 4 满足小于等于 4 且各位数字之和为偶数。
示例 2:
输入: num = 30
输出: 14
解释:
只有 14 个整数满足小于等于 30 且各位数字之和为偶数,分别是:
2、4、6、8、11、13、15、17、19、20、22、24、26 和 28 。
思路
没想到啊,官方解竟然是暴力解。。。。。。怪不得是简单题
1. 暴力枚举
暴力枚举,没啥好说的,从1到num枚举,检查每个是否满足各位加起来等于偶数。。。。
2. 数学方法
我们观察发现,在 [0...x][0...x][0...x] 的所有数中,每 10个数中,就有 55 个数的各位数字之和为偶数。例如,在 [0...9][0...9][0...9] 中,每 10个数中,就有 5个数的各位数字之和为偶数,分别是 0,2,4 ...
今天的每日一题,纯纯数学题啊!可惜我算了半天,最后自己写的算法超时了。事后看了看官方的解决方案,发现我就差一点了,我是最大值从1逐渐递增,而官方是从maSum往下递减,然后采用了对分查找减少次数。这次题解就直接用官方的好了。
题目
1802. 有界数组中指定下标处的最大值
难度:中等
给你三个正整数 n、index 和 maxSum 。你需要构造一个同时满足下述所有条件的数组 nums(下标 从 0 开始 计数):
nums.length == n
nums[i] 是 正整数 ,其中 0 <= i < n
abs(nums[i] - nums[i+1]) <= 1 ,其中 0 <= i < n-1
nums 中所有元素之和不超过 maxSum
nums[index] 的值被 最大化
返回你所构造的数组中的 nums[index] 。
注意:abs(x) 等于 x 的前提是 x >= 0 ;否则,abs(x) 等于 -x 。
示例 1:
输入:n = 4, index = 2, maxSum = 6
输出:2
解释:数组 [1,1,2,1] ...
目的
自tls 1.1起,为了同一个服务器能够运行多个不同的服务,并可以对不同的服务返回对应的证书,诞生了SNI(Server Name Indication)来进行区分不同服务。启用了SNI功能的客户端会在https的握手阶段,首先向服务端发出的clientHello包中的拓展头的SNI的位置标明当前服务的域名,现代浏览器默认都会开启SNI功能。
curl在其7.18.1版本中也对SNI功能进行了支持。经查询7.18.1版本在2008年就已发行,因此市面上的curl版本应该是都支持这个功能了。但是curl并没有提供选项,来让我们自行修改SNI字段的值。其只会把要访问的url中的host部分截取下来,放在SNI字段中。
然而很多开发情况下,会出现本地部署了多个https服务,需要依靠SNI来区分不同的服务,已发送给不同的后端服务,如nginx和frp等。我们希望能直接curl localhost,通过控制SNI字段中的值,以实现访问不同服务的功能。
实现
虽然没有直接实现的方式,但是我们可以间接实现。
我们可以利用resolve或connect-to这两个选项来实现类似功能。首先这 ...
一、frp相关概念
frp是什么?
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
frp https的配置
frp实现https穿透的方式,是在server端开启一个监听端口,可以使用vhost_https_port来指定, 这个端口接收到的所有流量,会根据客户端通过custom_domains设置的域名和客户端信息转发到对应的client端,再由client端把数据转发到任意的服务去。
二、文章背景
此文章诞生于作者使用frp搭配nginx实现https流量穿透的时候,使用curl命令的curl -H "Host: example.com" https://loalhost:frp的vhost_https_port,结果curl一直报错https连接错误,经查询frp在GitHub的issue,有人也遇到了这样的问题,但是都是讲的解决方法。
有人猜测是frp只会看url中域名的host,而不遵循规范查看Host。但作 ...
目标实现访问如pb.example.com,浏览器能自动下载公钥文件。
这样以后让别人加自己ssh就容易了。
直接给配置文件,对应有注释:
server { listen 80; listen [::]:80; listen 443 ssl; # https配置 listen [::]:443 ssl; # https配置 server_name pb.example.com; #填写你域名 ssl_certificate /etc/nginx/cert/pub.example.com/crt.pem; # ssl公钥证书 ssl_certificate_key /etc/nginx/cert/pub.example.com/crt.key; # ssl私钥证书位置位置 ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; # https配置 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:E ...
AES有多种加密方式和填充方式。
加密方式
分组密码加密方式主要有7种:ECB,CBC,CFB,OFB和CTR,这五种方式将在下面一一讲解。
0. 初始化向量 / IV
在讲加密模式之前首先得要了解一个概念:初始化向量 (IV)
在除ECB以外的所有加密方式中,都需要用到IV对加密结果进行随机化。在使用同一种加密同一个密钥时不应该使用相同的IV,否则会失去一定甚至全部的安全性。如果到这里还不明白的话没关系,后面还会继续讲到。
1. 电子密码本 / ECB
这里CIPH指AES加密算法,CIPH^{-1}指AES解密算法。
这个很好理解:将明文简单的按照128bit为一个分块进行切割,把每个分块分别进行AES加密,然后再将得到的密文简单的拼接一下即可。
注意到AES加密只能加密128bit的分块,那问题就产生了:如果明文的长度不是128bit的倍数,就会存在一个分块不足128bit,那如何对这个分块进行加密?
别慌,你想到的问题别人早就想到了。为了解决这个问题,我们发明了一种叫做填充的东西,这将会在后面具体讲解。OFB和CTR不需要填充!
ECB模式有一个显著的安全问题:如果使用相 ...