今天看到了一个视频,讲的是如何通过linux原生的命令,获取百度首页的html文件。下面开始进行操作讲解。
一 相关命令
1. exec
exec命令用于调用并执行指令的命令。exec命令通常用在shell脚本程序中,可以调用其他的命令。如果在当前终端中使用命令,则当指定的命令执行完毕后会立即退出终端。
2 $$
$$ is the process ID (PID) of the script itself.
$$代表着进程的自身PID。
exec命令实例
二 实际操作
先介绍一下prod目录:
在GUN/Linux操作系统中,/proc是一个位于内存中的伪文件系统(in-memory pseudo-file system)。该目录下保存的不是真正的文件和目录,而是一些“运行时”信息,如系统内存、磁盘io、设备挂载信息和硬件配置信息等。proc目录是一个控制中心,用户可以通过更改其中某些文件来改变内核的运行状态。proc目录也是内核提供给我们的查询中心,我们可以通过这些文件查看有关系统硬件及当前正在运行进程的信息。在Linux系统中,许多工具的数据来源正是proc目录中的内容。例如,lsmod命令就是cat /proc/modules命令的别名,lspci命令是cat /proc/pci命令的别名。
输入:cd /proc/$$/fd
使用ll命令得到:
总用量 0
lrwxrwxrwx 1 zilch None 0 7月 21 01:06 0 -> /dev/pty1
lrwxrwxrwx 1 zilch None 0 7月 21 01:06 1 -> /dev/pty1
lrwxrwxrwx 1 zilch None 0 7月 21 01:06 2 -> /dev/pty1
lrwxrwxrwx 1 zilch None 0 7月 21 01:06 31 -> /dev/pty1
可以看到当前shell打开的文件描述符 0 1 2 31 其中0 1 2 分别为标准输入,标准输出,标准错误。
之后通过exec命令打开文件描述符:
exec 3<> /dev/tcp/www.baidu.com/80
<>代表可读可写,>代表可写,
/dev/tcp是一个特殊的文件,打开这个文件就类似于发出了一个socket调用,建立一个socket连接
所以上述操作相当于在/dev/tcp文件中建立与www.baidu.com的80端口的连接。
之后进行echo操作
echo -e "GET / HTTP/1.0\n" 1>& 3
将这个get请求进行标准输出到文件描述符3,echo -e将\n转义为换行符。
cat 0
从文件描述符3中得到标准输入。
最后个关闭文件描述符:
先查看一下当前有哪些文件描述符占用:
总用量 0
lrwxrwxrwx 1 zilch None 0 7月 21 01:19 0 -> /dev/pty1
lrwxrwxrwx 1 zilch None 0 7月 21 01:19 1 -> /dev/pty1
lrwxrwxrwx 1 zilch None 0 7月 21 01:19 2 -> /dev/pty1
lrwxrwxrwx 1 zilch None 0 7月 21 01:19 3 -> socket:[3]
lrwxrwxrwx 1 zilch None 0 7月 21 01:19 31 -> /dev/pty1
最后关闭文件描述符:
exec 3
再次查看:已经关闭
总用量 0
lrwxrwxrwx 1 zilch None 0 7月 21 01:20 0 -> /dev/pty1
lrwxrwxrwx 1 zilch None 0 7月 21 01:20 1 -> /dev/pty1
lrwxrwxrwx 1 zilch None 0 7月 21 01:20 2 -> /dev/pty1
lrwxrwxrwx 1 zilch None 0 7月 21 01:20 31 -> /dev/pty1
额外的说明:echo -e
man echo:
DESCRIPTION
Echo the STRING(s) to standard output.
-n do not output the trailing newline
-e enable interpretation of backslash escapes(启用反斜杠转义)
-E disable interpretation of backslash escapes (default)
--help display this help and exit
--version
output version information and exit
If -e is in effect, the following sequences are recognized:
\\ backslash
\a alert (BEL)
\b backspace
\c produce no further output
\e escape
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab
\0NNN byte with octal value NNN (1 to 3 digits)
\xHH byte with hexadecimal value HH (1 to 2 digits)