【翻译】利用 “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 没看到内容,但是实际执行却会出现。 ...

译-终结一个进程和它的所有后代

Linux [译]终结一个进程和它的所有后代 终结一个类UNIX系统的进程可能比预期要复杂。上周我正在调试一个信号量停止工作导致的奇怪问题。更具体地说,涉及终结作业中正在运行的进程的问题。以下是我学到的内容的亮点: 类 UNIX 操作系统有很复杂的进程关系。父子进程、进程组、会话和会话负责人。但是,Linux 和 macOSX 等操作系统的细节并不统一。符合 POSIX 标准的操作系统支持向具有负 PID 编号的进程组发送信号。 在会话中向所有进程发送信号对于系统调用来说并不简单。 使用 exec 启动的子进程可以继承父进程的信号量信息。 杀死父进程不会杀死子进程 每个进程都有一个父进程,我们可以通过 pstree 或 ps 程序观察到这一点。 # start two dummy processes $ sleep 100 & $ sleep 101 & $ pstree -p init(1)-+ |-bash(29051)-+-pstree(29251) |-sleep(28919) `-sleep(28964) $ ps j -A PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 0 1 1 1 ? -1 Ss 0 0:03 /sbin/init 29051 1470 1470 29051 pts/2 2386 SN 1000 0:00 sleep 100 29051 1538 1538 29051 pts/2 2386 SN 1000 0:00 sleep 101 29051 2386 2386 29051 pts/2 2386 R+ 1000 0:00 ps j -A 1 29051 29051 29051 pts/2 2386 Ss 1000 0:00 -bash ps 命令显示 PID (进程的 ID)和 PPID (进程的父 ID)。 ...