【翻译】利用 “cat” 隐藏文本

Linux 【翻译】利用 “cat” 隐藏文本 /usr/bin/cat 指令可以从一个地方读取数据并在另一个地方展示;大部分情况下,它被用来从文本文件中读取数据在标准输出中展示。cat 默认支持控制字符,类似于 \n,\f,\r 等。 这里有一小段 python 代码,我们来看看 \r 是如何隐藏部分指令的: cmd_h = "echo 'You forgot to check `cat -A`!' > oops" # hidden cmd_v = "echo 'Hello world!'" # visible with open("test.sh", "w") as f: output = "#!/bin/sh\n" output += cmd_h + ";" + cmd_v + " #\r" + cmd_v + " " * (len(cmd_h) + 3) + "\n" f.write(output) 打开一个文本文件,然后写入两个指令,再写入 #\r,再写入一个指令,并且在后面加了一些空格。 $ cat test.sh #!/bin/sh echo 'Hello world!' 可以看到,cat 的结果中缺失了很多,这是因为 cat 在接收到 \r 字符过后,自动回到了行首,然后用 echo 'Hello world!' 等内容替换前面的内容。 再之后,尝试手动执行下这个 test.sh。 $ ls test.sh $ sh -x test.sh + echo 'You forgot to check `cat -A`!' + echo 'Hello world!' Hello world! $ ls oops test.sh $ cat oops You forgot to check `cat -A`! 可以看到,虽然 cat 没看到内容,但是实际执行却会出现。 ...

【翻译】编写一个小型静态网站生成器

Python 【翻译】编写一个小型静态网站生成器 大概有一百多种用 Python 编写的静态站点生成器(甚至还有其他语言编写的静态站点生成器)。 所以我决定写我自己的。为什么?好吧,我只是想。我希望将自己的博客从Ghost移开,并且希望保持真正的简约性。我决定使用 GitHub Pages 托管,因为他们最近宣布支持 自定义域的SSL。 渲染内容 每个静态网站生成器都需要采用某种源格式(例如 Markdown 或 ReStructuredText)并将其转换为 HTML。自从我离开 Ghost 以来,我决定坚持 Markdown。 自从我最近将 Github风格的Markdown渲染 集成到 Warehouse 中以来,我决定使用 cmarkgfm 。使用以下方式将 Markdown 渲染为 HTML: import cmarkgfm def render_markdown(content: str) -> str: content = cmarkgfm.markdown_to_html_with_extensions( content, extensions=['table', 'autolink', 'strikethrough']) return content cmarkgfm 确实有一个名为 github_flavored_markdown_to_html 的便捷方法,但是它使用 GitHub 的 tagfilter 扩展名,当我要将脚本和内容嵌入到帖子中时,这是不希望的。因此,我只是选择了我想使用的扩展。 收集资源(所有文档) 好的,我们有一种渲染 Markdown 的方法,但是我们还需要一种收集所有源文件的方法。我决定将所有来源存储在 ./src。我们可以pathlib用来收集它们: import pathlib from typing import Iterator def get_sources() -> Iterator[pathlib.Path]: return pathlib.Path('.').glob('srcs/*.md') 头部元数据 许多静态网站生成器都有 “前题” 的概念-一种为每个源文件设置元数据等的方法。我想支持 frontmatter,让我为每个帖子设置日期和标题。看起来像这样: --- title: Post time date: 2018-05-11 --- # Markdown content here. 对于 frontmatter 有一个非常好的和简单的现有库,称为 python-frontmatter。我可以用它来提取前题和原始内容: ...

【转载】curl的简介和使用

[[Linux]] [[cURL]] 【转载】curl的简介和使用 本文转载自curl网站开发指南,做了很小的改动,遵从自由转载原则。 What’s curl used for? curl is used in command lines or scripts to transfer data. It is also used in cars, television sets, routers, printers, audio equipment, mobile phones, tablets, settop boxes, media players and is the internet transfer backbone for thousands of software applications affecting billions of humans daily. curl是一个被用在命令行或者脚本中,用来传输数据的工具。它还被运用于 🚗 上,📺 上,路由器上,🖨️ 上,音响设备上,📱 上,平板电脑上,机顶盒上,媒体播放器上,以及数以万计,影响着上百万年的人们日常生活的基于网络的软件。 curl 是一种命令行工具,作用是发出网络请求,然后得到和提取数据,显示在"标准输出"(stdout)上面。 它支持多种协议,下面举例讲解如何将它用于网站开发。 一、查看网页源码 直接在 curl 命令后加上网址,就可以看到网页源码。我们以网址 www.sina.com 为例(选择该网址,主要因为它的网页代码较短): $ curl www.sina.com ...

【转载】Linux Locale 设置

Linux 【转载】Linux Locale 设置 说明: Locale是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。 如果 Linux 机器上出现字符乱码的问题,可以优先确定是否因为 Locale 设置不对而导致的,其次再去排查文件本身编码问题。 Locale 分类 - LC_CTYPE:语言符号及其分类 - LC_NUMERIC:数字 - LC_COLLATE:比较和排序习惯 - LC_TIME:时间显示格式 - LC_MONETARY:货币单位 - LC_MESSAGES:信息主要是提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等 - LC_NAME:姓名书写方式 - LC_ADDRESS:地址书写方式 - LC_TELEPHONE:电话号码书写方式 - LC_MEASUREMENT:度量衡表达方式 - LC_PAPER:默认纸张尺寸大小 - LC_IDENTIFICATION:Locale 对自身包含信息的概述 $ locale LANG=en_US.UTF-8 LC_CTYPE="en_US.UTF- 8" #用户所使用的语言符号及其分类 LC_NUMERIC="en_US.UTF- 8" #数字 LC_TIME="en_US.UTF-8" #时间显示格式 LC_COLLATE="en_US.UTF-8" #比较和排序习惯 LC_MONETARY="en_US.UTF-8" #LC_MONETARY LC_MESSAGES="en_US.UTF- 8" #信息主要是提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等 LC_PAPER="en_US.UTF- 8" #默认纸张尺寸大小 LC_NAME="en_US.UTF-8" #姓名书写方式 LC_ADDRESS="en_US.UTF-8" #地址书写方式 LC_TELEPHONE="en_US.UTF-8" #电话号码书写方式 LC_MEASUREMENT="en_US.UTF-8" #度量衡表达方式 LC_IDENTIFICATION="en_US.UTF-8" #对自身包含信息的概述 LC_ALL= Locale 文件位置 Locale 定义文件在 /usr/share/i18n/locales Locale 用户定义文件在 /usr/lib/locale/ Locale 设定的优先级关系 设定 Locale 就是设定 12 大类的 Locale 分类属性,即12个LC_*。 ...

【转载】Linux Useradd 命令基本用法

Linux 【转载】Linux Useradd 命令基本用法 在 Linux 中 useradd 是个很基本的命令,但是使用起来却很不直观。以至于在 Ubuntu 中居然添加了一个 adduser 命令来简化添加用户的操作。本文主要描述笔者在学习使用 useradd 命令时的一些测试结果。 说明:本文中的所有试验都是在 Ubuntu14.04 上完成。 功能 在 Linux 中 useradd 命令用来创建或更新用户信息。 useradd 命令属于比较难用的命令 (low level utility for adding users),所以 Debian 系的发行版中建议管理员使用 adduser 命令。其实 adduser 命令只是一个调用了 useradd 命令的脚本文件。 本文将详细分析群组和家目录相关的选项。并且以实例的方式介绍常用的 useradd 命令写法。 语法和基本选项 注意:本文并不是一个完整的文档,所以仅列出部分常用的选项进行说明。 useradd [option] username [option]: -d, --home-dir HOME_DIR 指定用户登入时的目录 -g, --gid GROUP 设置初始群组 -G, --groups GROUPS 添加用户到已有群组 -m, --create-home 自动创建用户的家目录 -M, --no-create-home 不要创建用户的家目录 -N, --no-user-group 不要创建以用户名称为名的群组 -s, --shell SHELL 指定用户登入后所使用的shell -u, --uid UID 指定用户ID -p, --password PASSWORD 设置密码 细说用户组 首先我们要搞清楚,什么是初始群组?简单来说在 /etc/passwd 文件中,每行的第四个字段指定的就是用户的初始群组。用户登录后立即就拥有了初始群组中的权限。 ...

【转载】Linux 中 apt 与 apt-get 命令的区别与解释

Linux 【转载】Linux 中 apt 与 apt-get 命令的区别与解释 Ubuntu 16.04 发布时,一个引人注目的新特性便是 apt 命令的引入。其实早在 2014 年,apt 命令就已经发布了第一个稳定版,只是直到 2016 年的 Ubuntu 16.04 系统发布时才开始引人关注。 随着 apt install package 命令的使用频率和普遍性逐步超过 apt-get install package,越来越多的其它 Linux 发行版也开始遵循 Ubuntu 的脚步,开始鼓励用户使用 apt 而不是 apt-get。 那么,apt-get 与 apt 命令之间到底有什么区别呢?如果它们有类似的命令结构,为什么还需要新的 apt 命令呢?是否 apt 真的比 apt-get 更好?普通用户应该使用新的 apt 命令还是坚持旧有习惯继续使用 apt-get 呢? apt 与 apt-get 在开始对比 apt 与 apt-get 命令的区别之前,我们先来看看这两个命令的背景,以及它们要试图达到的目的。 Debian 作为 Ubuntu、Linux Mint 和 elementary OS 等 Linux 操作系统的母板,其具有强健的「包管理」系统,它的每个组件和应用程序都内置在系统中安装的软件包中。Debian 使用一套名为 Advanced Packaging Tool(APT)的工具来管理这种包系统,不过请不要把它与 apt 命令混淆,它们之间是其实不是同一个东西。 ...

【转载】Linux 之三剑客,awk、sed、grep的用法

Linux #【转载】Linux 之三剑客,awk、sed、grep的用法 例如要在 Linux 的进程中找到和 python 有关的进程,那么最简单的方法就是 ps -aux|grep python|grep -v grep,例如只想打印所有信息的 USER PID COMMAND这三项,那么就可以用 awk 实现 ps -aux|grep python|grep -v grep| awk '{print $1,$2,$NF}'。sed 用的不多,这三者可以合称为 Linux 字符处理三剑客。 awk awk 是一种优良的文本处理工具,Linux 及 Unix 环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言的最大功能取决于一个人所拥有的知识。awk 命名:Alfred-Aho、Peter-Weinberger 和brian-kernighan 三个人的姓的缩写。 最简单地说, awk 是一种用于处理文本的编程语言工具。 任何 awk 语句都是由模式和动作组成,一个 awk 脚本可以有多个语句。模式决定动作语句的触发条件和触发时间。 语法结构 # BEGIN 语句设置计数和打印头部信息,在任何动作之前进行 # END 语句输出统计结果,在完成动作之后执行 awk 'BEGIN{ print "start" } ‘pattern{ commands }’ END{ print "end" }' file awk 内置变量(预定义变量) $n 当前记录的第 n 个字段,比如 n 为1表示第一个字段,n 为2表示第二个字段 $0 这个变量包含执行过程中当前行的文本内容 -FILENAME 当前输入文件的名 FS 字段分隔符(默认是任何空格) NF 表示字段数,在执行过程中对应于当前的字段数 NR 表示记录数,在执行过程中对应于当前的行号 OFS 输出字段分隔符(默认值是一个空格) ORS 输出记录分隔符(默认值是一个换行符) RS 记录分隔符(默认是一个换行符) ...

【转载】Linux 防火墙:关于 iptables 和 firewalld 的那些事

Linux [[iptables]] 【转载】Linux 防火墙:关于 iptables 和 firewalld 的那些事 作者: David Clinton 译者: LCTT heguangzhi 2018-10-03 17:18 以下是如何使用 iptables 和 firewalld 工具来管理 Linux 防火墙规则。 这篇文章摘自我的书《Linux in Action》,尚未发布的第二个曼宁出版项目。 防火墙 防火墙是一组规则。当数据包进出受保护的网络区域时,进出内容(特别是关于其来源、目标和使用的协议等信息)会根据防火墙规则进行检测,以确定是否允许其通过。防火墙可以根据协议或基于目标的规则过滤请求。 一方面, iptables 是 Linux 机器上管理防火墙规则的工具。 另一方面,firewalld 也是 Linux 机器上管理防火墙规则的工具。 你有什么问题吗?如果我告诉你还有另外一种工具,叫做 nftables,这会不会糟蹋你的美好一天呢? 好吧,我承认整件事确实有点好笑,所以让我来解释一下。这一切都从 Netfilter 开始,它在 Linux 内核模块级别控制访问网络栈。几十年来,管理 Netfilter 钩子的主要命令行工具是 iptables 规则集。 因为调用这些规则所需的语法看起来有点晦涩难懂,所以各种用户友好的实现方式,如 ufw 和 firewalld 被引入,作为更高级别的 Netfilter 解释器。然而,ufw 和 firewalld 主要是为解决单独的计算机所面临的各种问题而设计的。构建全方面的网络解决方案通常需要 iptables,或者从 2014 年起,它的替代品 nftables (nft 命令行工具)。 iptables 没有消失,仍然被广泛使用着。事实上,在未来的许多年里,作为一名管理员,你应该会使用 iptables 来保护的网络。但是 nftables 通过操作经典的 Netfilter 工具集带来了一些重要的崭新的功能。 从现在开始,我将通过示例展示 firewalld 和 iptables 如何解决简单的连接问题。 ...

【转载】Linux(Ubuntu)网络流量实时监控(iftop)

Linux Network Monitoring 【转载】Linux(Ubuntu)网络流量实时监控(iftop) 在类 Unix 系统中可以使用 top 查看系统资源,进程,内存占用等信息。查看网络状态可以使用netstat、nmap 等工具。 若要查看实时的网络流量,监控 TCP/IP 连接,反向解析 IP,显示端口信息等,则可以使用 iftop。 1、安装 $ sudo apt-get install iftop 2、命令说明 语法: iftop -h | [-npblNBP] [-i interface] [-f filter code] [-F net/mask] [-G net6/mask6] -h 显示本帮助(Help)信息 -n 不进行主机名(hostName)查找 -N 不将端口号(port Number)转换成对应的服务 to services -p 混合(Promiscuous)模式(显示网络相关的其他主机信息) -b 不显示流量图形条(Bar) -B 以字节(Byte)为单位,显示带宽(Bandwidth);默认以比特(bit)显示的 -i interface 监控的网卡接口(interface) -f filter code 包统计时,使用过滤码;默认:无,只统计IP包 -F net/mask 显示特定IPv4网段的进出流量(Flow);如# iftop -F 10.10.1.0/24 -G net6/mask6 显示特定IPv6网段的进出流量(Flow) -l 显示并统计IPv6本地(Local)链接的流量(默认:关) -P 显示端口(Port) -m limit 设置显示界面上侧的带宽刻度(liMit) -c config file 指定配置(Config)文件 -t 使用不带窗口菜单的文本(text)接口 排序: -o 2s Sort by first column (2s traffic average) -o 10s Sort by second column (10s traffic average) [default] -o 40s Sort by third column (40s traffic average) -o source Sort by source address -o destination Sort by destination address The following options are only available in combination with -t -s num print one single text output afer num seconds, then quit -L num number of lines to print 3、界面说明 204Mb 407Mb 611Mb 814Mb 0.99Gb └─────────────────────────┴─────────────────────────┴──────────────────────────┴─────────────────────────┴────────────────────────── bond-test => 192.168.1.103 1.44Mb 1.38Mb 0.99Mb <= 336Mb 327Mb 315Mb bond-test => 192.168.1.101 0b 0b 0b <= 295Mb 218Mb 244Mb bond-test => 192.168.1.140 10.1Kb 11.0Kb 10.8Kb <= 0b 0b 0b bond-test => 192.168.1.102 0b 0b 703Kb <= 0b 0b 0b bond-test => xxxxxxxxx 0b 0b 31b <= 0b 0b 31b ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── TX: cum: 12.3MB peak: 2.87Mb rates: 1.45Mb 1.39Mb 1.68Mb RX: 3.52GB 692Mb 631Mb 545Mb 560Mb TOTAL: 3.53GB 694Mb 632Mb 546Mb 561Mb 界面上面显示的是类似刻度尺的刻度范围,为显示流量图形的长条作标尺用的。 ...

【转载】Linux文件描述符

Linux 【转载】Linux 文件描述符 1、概述 在 Linux 系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行 I/O 操作的系统调用都通过文件描述符。程序刚刚启动的时候,0 是标准输入,1 是标准输出,2 是标准错误。如果此时去打开一个新的文件,它的文件描述符会是 3。POSIX 标准要求每次打开文件时(含 socket)必须使用当前进程中最小可用的文件描述符号码,因此,在网络通信过程中稍不注意就有可能造成串话。 标准文件描述符图如下: 文件描述与打开的文件对应模型如下图: 2、文件描述限制 在编写文件操作的或者网络通信的软件时,初学者一般可能会遇到 “Too many open files” 的问题。这主要是因为文件描述符是系统的一个重要资源,虽然说系统内存有多少就可以打开多少的文件描述符,但是在实际实现过程中内核是会做相应的处理的,一般最大打开文件数会是系统内存的 10% (以KB来计算)(称之为系统级限制),查看系统级别的最大打开文件数可以使用 sysctl -a | grep fs.file-max 命令查看。与此同时,内核为了不让某一个进程消耗掉所有的文件资源,其也会对单个进程最大打开文件数做默认值处理(称之为用户级限制),默认值一般是 1024,使用 ulimit -n命令可以查看。在Web服务器中,通过更改系统默认值文件描述符的最大值来优化服务器是最常见的方式之一,具体优化方式请查看。 3、文件描述符合打开文件之间的关系 每一个文件描述符会与一个打开文件相对应,同时,不同的文件描述符也会指向同一个文件。相同的文件可以被不同的进程打开也可以在同一个进程中被多次打开。系统为每一个进程维护了一个文件描述符表,该表的值都是从0开始的,所以在不同的进程中你会看到相同的文件描述符,这种情况下相同文件描述符有可能指向同一个文件,也有可能指向不同的文件。具体情况要具体分析,要理解具体其概况如何,需要查看由内核维护的3个数据结构。 进程级的文件描述符表 系统级的打开文件描述符表 文件系统的 i-node 表 进程级的描述符表的每一条目记录了单个文件描述符的相关信息。 控制文件描述符操作的一组标志。(目前,此类标志仅定义了一个,即 close-on-exec 标志) 对打开文件句柄的引用 内核对所有打开的文件的文件维护有一个系统级的描述符表格(open file description table)。有时,也称之为打开文件表(open file table),并将表格中各条目称为打开文件句柄(open file handle)。一个打开文件句柄存储了与一个打开文件相关的全部信息,如下所示: 当前文件偏移量(调用 read() 和 write() 时更新,或使用 lseek() 直接修改) 打开文件时所使用的状态标识(即,open() 的 flags 参数) 文件访问模式(如调用 open() 时所设置的只读模式、只写模式或读写模式) 与信号驱动相关的设置 对该文件 i-node 对象的引用 文件类型(例如:常规文件、套接字或 FIFO)和访问权限 一个指针,指向该文件所持有的锁列表 文件的各种属性,包括文件大小以及与不同类型操作相关的时间戳 下图展示了文件描述符、打开的文件句柄以及 i-node 之间的关系,图中,两个进程拥有诸多打开的文件描述符。 ...