文件管理
stat
- 显示文件的详细信息,包括时间戳
stat filename
touch
主要用于更新文件的访问时间和修改时间(时间戳)。如果指定的文件不存在,touch
命令会创建一个新的空文件。
touch newfile
参数
-t 更新文件的修改时间为特地的值,也会一起更新访问时间,和修改时间相等
-a 仅更新文件的访问时间
-r 使用参考文件的时间戳更新目标文件
-m 仅更新修改时间
- 创建多个新文件:
touch file1.txt file2.txt
- 更新文件的修改时间为特定时间:
touch -t 202310121530 file.txt
- 使用参考文件的时间戳更新目标文件:
touch -r referencefile.txt targetfile.txt
- 仅更新文件的访问时间:
touch -a file.txt
- 仅更新文件的修改时间:
touch -m file.txt
- 使用自然语言描述的日期和时间:
touch -d "yesterday 12:00" file.txt
访问时间和修改时间设置为昨天中午12点
rm
rm newfile
删除多个文件
rm 1.txt 2.txt
删除目录
rm -r newdir 递归删除所有文件目录及其内容
rm -rf newdir 递归强制删除所有目录及其内容
mkdir
mkdir newdir
mkdir adir bdir 创建多个目录
mkdir -p path/to/directory 递归创建多级目录。如果中间的某个目录不存在,mkdir会自动创建这些目录
-v 显示详细信息
-vp 递归创建显示详细信息
设置目录权限
mkdir -m 755 mydir
创建一个名为 mydir
的目录,并将其权限设置为 755
(即所有者有读、写、执行权限,组用户和其他用户有读和执行权限)。
rmdir
与 rm
命令不同,rmdir
只能删除空目录,不能删除包含文件或子目录的目录
rmdir newdir
rmdir dir1 dir2 dir3 删除多个目录
rmdir -p path/to/directory 递归删除多级空目录。如果父目录变为空,也会被删除
mv
用于移动文件和目录,也可以用来重命名文件和目录
mv file1.txt file2.txt
这条命令将当前目录下的 file1.txt
重命名为 file2.txt
。如果 file2.txt
已经存在,它会被覆盖
- 不覆盖模式移动文件:
mv -n file1.txt file2.txt
如果 file2.txt
已经存在,不会覆盖,也不会提示。
2. 强制移动文件:
mv -f file1.txt file2.txt
即使 file2.txt
已经存在,也会直接覆盖,不会提示确认。
2. 更新模式移动文件:
mv -u file1.txt file2.txt
只有当 file1.txt
比 file2.txt
新或 file2.txt
不存在时,才会移动。
参数
-i
: 交互模式,如果目标文件或目录已经存在,会提示确认是否覆盖
-v
: 显示详细信息,显示移动或重命名的每个文件或目录
cp
cp file.txt newwdir.txt
cp [选项]... 源文件 目标文件
cp [选项]... 源文件... 目录
参数
-i
或--interactive
:在覆盖已存在的文件之前提示用户。-r
,-R
,--recursive
:递归地复制目录及其子目录下的所有文件。如果目标是一个目录,则会将源目录下的所有内容复制到该目录下。-u
,--update
:仅当目标文件比源文件旧,或目标文件不存在时才进行复制。-v
,--verbose
:显示详细的处理信息,比如复制了哪些文件。-a
,--archive
:归档模式,等同于-dR --preserve=all
,用于保持原始文件的所有属性(如权限、时间戳等)。-f
,--force
:如果目标文件无法打开或写入,则删除它并尝试再次复制。-p
:保留源文件或目录的属性(如修改时间、访问时间和权限)。
- 复制多个文件到一个目录:
cp file1.txt file2.txt /path/to/destination/
这里,file1.txt
和 file2.txt
都会被复制到 /path/to/destination/
目录下。
- 递归复制目录:
cp -r directory/ newdirectory/
这个命令将 directory/
及其所有内容复制到新的 newdirectory/
中。
- 更新模式复制:
cp -u source.txt destination.txt
只有当 source.txt
比 destination.txt
新或 destination.txt
不存在时,才会执行复制操作。
ln
链接分为两种类型:硬链接(hard link)和符号链接(symbolic link,也称软链接)。下面详细介绍 ln
命令的用法和选项。
基本语法
ln [选项]... 源文件 目标文件
ln [选项]... 源文件... 目标目录
参数
-s
,--symbolic
:创建符号链接(软链接)而不是硬链接。-f
,--force
:如果目标文件已经存在,则删除目标文件后创建链接。-i
,--interactive
:在覆盖已存在的文件之前提示用户。-v
,--verbose
:显示详细的处理信息。-n
,--no-dereference
:当目标是一个符号链接时,不会跟随符号链接的目标,而是直接替换符号链接本身。
链接类型
-
硬链接:
- 硬链接是指向同一个 inode(索引节点)的多个文件名。每个硬链接都是一个独立的文件名,但它们共享相同的数据。
- 硬链接不能跨文件系统创建,也不能指向目录。
-
符号链接(软链接):
-软连接是一个特殊的文件,它包含了一个路径,指向另一个文件或目录。
-软连接可以跨文件系统创建,并且可以指向目录。
软连接
ln -s original.txt symlink.txt
注意事项
- 软连接可以跨文件系统创建。
- 软连接可以指向目录。
- 删除源文件会使符号链接失效(成为“断链”)。
硬链接
ln ~/offsec123.txt hardlink.txt
~/offsec123.txt
:源文件的路径。~
表示当前用户的主目录。hardlink.txt
:创建的硬链接的名称。
主要事项
- 硬链接不能跨文件系统创建。
- 硬链接不能指向目录。
- 删除源文件不会影响硬链接,因为它们共享同一个 inode。
示例
- 创建硬链接:
ln file.txt hardlink.txt
这条命令将在当前目录下创建一个名为 hardlink.txt
的硬链接,指向 file.txt
。
- 创建符号链接:
ln -s /path/to/file.txt symlink.txt
这条命令将在当前目录下创建一个名为 symlink.txt
的符号链接,指向 /path/to/file.txt
。
3. 强制创建符号链接:
ln -sf /path/to/file.txt existing_symlink.txt
如果 existing_symlink.txt
已经存在,这条命令会先删除它,然后创建一个新的符号链接。
4. 在目录中创建多个链接:
ln file1.txt file2.txt /path/to/directory/
这条命令将在 /path/to/directory/
目录下创建 file1.txt
和 file2.txt
的硬链接。
- 创建指向目录的符号链接:
ln -s /path/to/source_directory /path/to/link_directory
- 连接文件夹需要自己创建
这条命令将在/path/to/link_directory
创建一个符号链接,指向/path/to/source_directory
。
文件读取
cat
首先是最常见的,那就是cat了,用于连接文件并打印到标准输出设备上,用法为:
cat /f*
不需要完整文件名
tac
用于将文件以行为单位的反序输出,用法为:
tac /f*
不需要完整文件名
more/bzmore
类似cat命令,会以一页一页的显示,方便使用者逐页阅读,用法为
more /f*
bzmore /f*
不需要完整文件名
less/bzless
作用与more类似,都用来浏览文本文件中的内容,不同之处在于,使用 more 命令浏览文件内容时,只能不断向后翻看,而使用 less 命令浏览,既可以向后翻看,也可以向前看。用法为:
less /f*
bzless /f*
不需要完整文件名
head
head 命令可用于查看文件的开头部分的内容,有一个常用的参数 -n 用于显示行数,默认为 10,即显示 10 行的内容。用法为:
head /f*
不需要完整文件名
tail
作用和head相似,但它默认显示最后 10 行。用法为:
tail /f*
不需要完整文件名
nl
可以为输出列加上编号。用法为:
nl /f*
不需要完整文件名
sed
Sed 代表流编辑器Stream Editor,常用于 Linux 中基本的文本处理.用法为:
sed p /f*
不需要完整文件名
sort
用于将文本文件内容加以排序。用法为:
sort /f*
不需要完整文件名
uniq
删除文件中的连续重复行 如果你在不使用任何参数的情况下使用 uniq 命令,它将删除所有连续的重复行,只显示唯一的行。用法为:
uniq /f*
不需要完整文件名
rev
反转一个或多个文件的行。用法为
rev /f*
不需要完整文件名,获得的是逆序的flag
当然,我们可以使用rev /f* | rev获得正序的flag:
od
od(Octal Dump)命令用于将指定文件内容以八进制、十进制、十六进制、浮点格式或 ASCII 编码字符方式显示,系统默认的显示方式是八进制。用法为:
od -c /f*
不需要完整文件名
你可能会奇怪中间那个0000020是啥,我们可以看到这个命令在linux里的运行结果:
左边一列其实是它的地址,记得把地址0000020删了就是文件内容了,当然直接f12也可以看到linux里那样的运行结果:
vim/vi
这俩都是Linux里的文件编辑器,我们在网页直接用system(“vim /f*”);虽然不会进入编辑模式但还是可以看到里面的内容。用法为:
vim /f*
vi /f*
不需要完整文件名
man
man 命令是 Linux 下的帮助指令,通过 man 指令可以查看 Linux 中的指令帮助、配置文件帮助和编程帮助等信息,类似于vim/vi,直接对文本运行可以看到文本内容。用法为:
man /f*
不需要完整文件名
paste
使用paste命令可以将每个指定文件里的每一行整合到对应一行里写到标准输出,之间用制表符分隔。用法为:
paste /f*
不需要完整文件名
grep
查找文件里符合条件的字符串。用法为:
grep { /f*
不需要完整文件名
file
查看文件信息或类型。用法为:
file -f /f*
不需要完整文件名
dd
用于读取、转换并输出数据。用法为:
dd if=/flag
需要完整文件名
date
使用指定格式显示时间,或者设置系统时间,有时用于suid提权。用法为:
date -f /f*
不需要完整文件名。但他本质上是一种报错读取,直接system传值是没回显的,我们要读取报错才行:
a=$(date -f /f* 2>&1);echo $a;
然后再编一下码:
a%3D%24(date%20-f%20%2Ff*%202%3E%261)%3Becho%20%24a%3B
报错读取
linux里可以用点号执行shell脚本,同样,我们也可以用这种方法报错读取文件内容,前提是你的用户组有读取文件的权限
a=$(. /f* 2>&1);echo $a; #a%3D%24(.%20%2Ff*%202%3E%261)%3Becho%20%24a%3B
如果你的用户组有执行文件的权限,你可以直接/f*获得文件内容:
a=$(/f* 2>&1);echo $a; #a%3D%24(%2Ff*%202%3E%261)%3Becho%20%24a%3B
diff
用于比较文件的内容,我们可以把想读取的文件内容和一个已知的文件进行比较,获得差集也就是我们想要的内容了,如:
diff /f* /etc/passwd
不需要完整文件名