学会在终端中进行命令查询
「命令」 --help
man 「命令」
info 「命令」
whatis 「命令」
「命令」
可以是 「命令」+「指令」,如:docker info
。阅读英文文档时,英文水平是痛点,跳着看容易看不懂……
可阅读:bash-guide。
time 「命令」
# e.g. time ls
type 命令
-
ping
向域名或IP(没有
协议头、端口、路径)传出一个ICMP的请求回显数据包,并等待接收回显回应数据包。判断网络是否畅通、查看连接速度信息。发送的ICMP请求是一个固定的协议,不能设定端口号,因此也不能用
ping
来检测某端口是否可访问。若目标IP不返回ICMP数据包,则也无法ping通。ping 「域名或IP」
-
curl
发起HTTP请求,查看返回信息(HTTP响应)。
curl 「URL」 # 返回HTTP响应消息主体 -i # 返回完整HTTP响应(响应头+响应消息主体) -H 「'一个请求头'」 # 设置请求头的请求 -X 「请求方法,如:POST」 # 设置请求方法的请求 -g # 关闭解析`{}`、`[]` -x 「protocol://host:port」 # 通过代理访问,如:http://127.0.0.1:8899
-
telnet
可测试IP+端口是否可连接(不可以填写
域名)。互联网远程登录服务的标准协议和主要方式。telnet 「IP」 「端口」 # 若连通则会有进一步操作;若不连通则trying或退出
-
nslookup
查询DNS的记录,查看域名解析是否正常,在网络故障的时候用来诊断网络问题。
-
dig
从DNS域名服务器查询主机地址信息。
-
ab
压力测试工具。
nslookup -type=AAAA 「域名」
dig 「域名」 AAAA
# ping6 「域名」
# ping -6 「域名」
# curl -6 「URI」
ssh 「用户名@地址」 -p 「端口号,默认:22」
-
若某远程主机识别已更改,则需删除保存在本机的此IP所有秘钥(删除
known_hosts
保存某ip的秘钥;或直接暴力整个删除文件)ssh-keygen -R 「地址」
scp -P 「端口号,默认:22」 「来源文件」 「目标路径」
-
远程 -> 本地
scp 「远程用户名@远程地址」:「远程文件」 「本地存放路径」
-
本地 -> 远程
scp 「本地文件」 「远程用户名@远程地址」:「远程存放路径」
注意:本机和远程主机的目录权限、文件权限。
rsync 「来源文件」 「目标文件」
仅传输有差异内容,性能更好,参数更复杂。
图形界面文件上传/下载(lrzsz)
rz
sz 「文件路径」
macOS的iTerm2配置使用。
安装
brew install lrzsz
命令配置
cd /usr/local/bin
在目录下创建2个文件
vi iterm2-recv-zmodem.sh
#!/bin/bash # Author: Matt Mastracci (matthew@mastracci.com) # AppleScript from http://stackoverflow.com/questions/4309087/cancel-button-on-osascript-in-a-bash-script # licensed under cc-wiki with attribution required # Remainder of script public domain osascript -e 'tell application "iTerm2" to version' > /dev/null 2>&1 && NAME=iTerm2 || NAME=iTerm if [[ $NAME = "iTerm" ]]; then FILE=`osascript -e 'tell application "iTerm" to activate' -e 'tell application "iTerm" to set thefile to choose folder with prompt "Choose a folder to place received files in"' -e "do shell script (\"echo \"&(quoted form of POSIX path of thefile as Unicode text)&\"\")"` else FILE=`osascript -e 'tell application "iTerm2" to activate' -e 'tell application "iTerm2" to set thefile to choose folder with prompt "Choose a folder to place received files in"' -e "do shell script (\"echo \"&(quoted form of POSIX path of thefile as Unicode text)&\"\")"` fi if [[ $FILE = "" ]]; then echo Cancelled. # Send ZModem cancel echo -e \\x18\\x18\\x18\\x18\\x18 sleep 1 echo echo \# Cancelled transfer else cd "$FILE" /usr/local/bin/rz -E -e -b sleep 1 echo echo echo \# Sent \-\> $FILE fi
vi iterm2-send-zmodem.sh
#!/bin/bash # Author: Matt Mastracci (matthew@mastracci.com) # AppleScript from http://stackoverflow.com/questions/4309087/cancel-button-on-osascript-in-a-bash-script # licensed under cc-wiki with attribution required # Remainder of script public domain osascript -e 'tell application "iTerm2" to version' > /dev/null 2>&1 && NAME=iTerm2 || NAME=iTerm if [[ $NAME = "iTerm" ]]; then FILE=`osascript -e 'tell application "iTerm" to activate' -e 'tell application "iTerm" to set thefile to choose file with prompt "Choose a file to send"' -e "do shell script (\"echo \"&(quoted form of POSIX path of thefile as Unicode text)&\"\")"` else FILE=`osascript -e 'tell application "iTerm2" to activate' -e 'tell application "iTerm2" to set thefile to choose file with prompt "Choose a file to send"' -e "do shell script (\"echo \"&(quoted form of POSIX path of thefile as Unicode text)&\"\")"` fi if [[ $FILE = "" ]]; then echo Cancelled. # Send ZModem cancel echo -e \\x18\\x18\\x18\\x18\\x18 sleep 1 echo echo \# Cancelled transfer else /usr/local/bin/sz "$FILE" -e -b sleep 1 echo echo \# Received $FILE fi
chmod 777 iterm2-*
iTerm2 -> Preferences -> Profiles -> Advanced -> Triggers Edit
Regular expression: rz waiting to receive.\*\*B0100 Action: Run Silent Coprocess Parameters: /usr/local/bin/iterm2-send-zmodem.sh Regular expression: \*\*B00000000000000 Action: Run Silent Coprocess Parameters: /usr/local/bin/iterm2-recv-zmodem.sh
在iTerm2中使用
rz
、sz
passwd
which 「指令」
-
macOS、Linux
/etc/hosts
-
Windows
C:\Windows\System32\drivers\etc\hosts
-
MD5
# macOS md5 「文件」 md5 -s 「字符串」 # 或`echo -n 「字符串」 | md5` # Linux md5sum 「文件」 echo -n 「字符串」 | md5sum # Windows md5sum.exe 「文件」 echo -n 「字符串」 | md5sum.exe
-
Node.js
const crypto = require('node:crypto'); const md5 = crypto.createHash('md5'); md5.update('字符串').digest('hex');
-
-
SHA
# macOS、Linux shasum 「文件」 echo -n 「字符串」 | shasum # 使用特定算法:`-a, --algorithm 1 (default), 224, 256, 384, 512, 512224, 512256` # Linux额外还可以使用特定算法:`sha224sum sha256sum sha384sum sha512sum` # Windows sha1sum.exe 「文件」 echo -n 「字符串」 | sha1sum.exe # 使用特定算法:`sha224sum.exe sha256sum.exe sha384sum.exe sha512sum.exe`
-
base64
# 编码 echo -n "字符串" | base64 base64 -i 「文件」 # 解码 echo "5a2X56ym5LiyCg==" | base64 -d base64 -d -i 「文件」
-
Node.js
Buffer.from('字符串'', 'utf-8').toString('base64') btoa('字符串') // 浏览器也支持
-
# macOS、Linux
ifconfig # 查看`en0`的`inet`(IPv4)或`inet6`(IPv6)
# Windows
ipconfig # 查看`以太网适配器 本地连接 的 IPv4 地址`
要对路径名/文件名中的
标点
和空格
进行\
转义。
./「文件名」.sh
. 「路径名/文件名」.sh
-
查看系统安装的所有shell
cat /etc/shells
-
查看系统使用的shell
echo $SHELL
-
修改系统使用的shell
chsh -s 「shell路径,如:/bin/zsh 或 /bin/bash 等」
# macOS、Linux
vi ~/.bash_profile # bash
vi ~/.zshrc # zsh
# 如:可以把定义环境变量放在里面`export NODE_ENV=development`
# source 脚本 # 当前运行一遍
-
所有端口占用、网络连接情况(Linux)
# Linux netstat -antp
-
某端口占用
# macOS、Linux netstat -ant | grep 「端口号」 # 用于显示各种网络相关信息,如:网络连接,路由表,接口状态 # sudo su lsof -i :「端口号」 # (列出打开文件,lists open files)展示用户权限下能看到的进程信息(进程名、pid、所有者、文件描述符、文件类型、磁盘名、文件大小、索引节点、文件名 或 主机名:服务名) -n # 不将IP地址转换为主机名 -P # 不将端口号转换为服务名
-
查看进程并杀死
ps -ef # ps -efc # command改成进程名展示 ps -ef | grep '「命令关键字」' | grep -v grep # 搜索「命令关键字」、排除grep # 杀死进程 kill -9 「PID」 # 杀死具体PID的进程 kill $(ps -ef | grep '「命令关键字」' | grep -v grep | awk '{print $2}') # 杀死所有关键字相关的进程(排除grep) # 杀死所有同名进程(慎) killall 「名称」
当macOS手势突然失效,尝试
killall Dock
。
-
macOS、Linux
lsof -i :「端口号」 -n -P # sudo su kill -9 「PID」 # macOS的「活动监视器」也可以查到「PID」并关闭进程
-
Windows(需要在cmd.exe进行)
netstat -aon | findstr 「端口号」 # 获得某端口号的任务PID tasklist | findstr 「PID」 # 获得某PID的任务名 # 获得任务名之后可以再用`tasklist | findstr 「任务名」`确认是否有多个子任务 taskkill /F /T /PID 「PID」 # 需要杀死主进程,否则仅杀死的子进程会被主进程再次创建 # 或`taskkill /F /T /IM 「任务名」` # 或去任务管理器结束进程(打开进程->查看->选择列的PID)
-
以磁盘分区为单位查看文件系统的磁盘空间情况
df -h
-
指定的目录或文件所占用的磁盘空间
# macOS du -h -d1 「路径」 # Linux du -h --max-depth=1 「路径」
-
查找超过10M的文件
find 「路径」 -size +10M
-
touch 「文件名」
若文件已存在,则更新文件时间为当前系统时间。
-
vi 「文件名」
编辑文件。若文件不存在,则先创建后编辑。
-
echo "「内容」" > 「文件名」
若文件已存在,则替换文件内容。
less/more/cat 「已存在文件」 > 「文件名」
,cd >/>> 「文件名」
-
cat
、nl
-
tac
颠倒输出 -
more
、less
一页一页输出 -
tail
查看文件尾部tail -n 「行数」 「文件名」 tail -f 「文件名」 # 流式输出(文件改动后重新输出)
-
head
查看文件头部 -
od
以二进制方式输出
-
查看文件属性
ls -lh 「文件名」
-
文件大小为0
: > 「文件名」 > 「文件名」 true > 「文件名」
-
文件大小为1
echo '' > 「文件名」 echo > 「文件名」
-
查看所有组
cat /etc/group # 返回的每一条是一个组的信息:`组名:密码:组id:组内用户列表`
-
查看所有用户
cat /etc/passwd # 返回的每一条是一个用户的信息:`用户名:密码:用户id:所在组id:备注:用户的home目录:shell命令所在目录`
-
groups
groups # 返回当前用户所在的组名 groups 「用户名」 # 返回「用户名」所在的组名
# 只能为命令定义别名,无法为其他部分(比如很长的路径)定义别名
alias # 查看已设置的内容
alias 「自定义命令名」='「执行命令1」; 「执行命令2」' # 新增 别名=执行命令
alias 「自定义命令名」 # 打印设置的执行命令
# 别名也可以接受参数,参数会直接传入原始命令
unalias 「自定义命令名」 # 删除 别名
e.g.
alias sync-public='sync-public(){curl --request PUT https://registry-direct.npmmirror.com/-/package/$1/syncs};sync-public'
,sync-public fabric-demo
-
查看已连接的设备(尝试连接手机)
adb devices -l # List of devices attached # 「序列号」 device usb:「???」 product:「手机型号」 model:「手机型号」 device:「手机型号」 transport_id:「数字」
-
系统消息输出
adb logcat # 或 adb shell # 启动交互式Unix shell对设备发起命令 logcat | grep 「筛选内容」
-
端口转发
-
手机访问「手机端口号」的流量都会转发到PC的「PC端口号」:
adb reverse --list # 打印所有 手机->PC 的映射端口哦连接列表 adb reverse tcp:「手机端口号」 tcp:「PC端口号」 # 新增一个端口映射 adb reverse --remove tcp:「手机端口号」 # 删除一个端口映射 adb reverse --remove-all # 删除所有端口映射
-
PC访问「PC端口号」的流量都会转发到手机的「手机端口号」:
adb forward --list # 打印所有 PC->手机 的映射端口哦连接列表 adb forward tcp:「PC端口号」 tcp:「手机端口号」 # 新增一个端口映射 adb forward --remove tcp:「PC端口号」 # 删除一个端口映射 adb forward --remove-all # 删除所有端口映射
可以混合配置使用,如:手机端口号A -> PC端口号B > 手机端口号C。
-
-
查看手机中所有安装的包
adb shell pm list packages # package:「包名」 # e.g. com.tencent.mtt.hippy.example:com.tencent.mtt.hippy.example
-
查看界面性能数据
来自:测试界面性能。
# 需要打开了「GPU呈现模式分析」为「在adb shell dumpsys gfxinfo中」 adb shell dumpsys gfxinfo 「PACKAGE_NAME」 adb shell dumpsys gfxinfo 「PACKAGE_NAME」 framestats
-
安装本地包
adb install 「包地址」
sleep 「秒数」 # 延迟一段时间,再向下继续执行命令
将标准输入转为命令行参数。
echo 1.txt 2.txt 3.txt | xargs touch
find ./ -name "文件名" -exec rm -rf {} \;
-
连接mysql
mysql -h 「IP」 -P 「端口号」 -u 「用户名」 -p「密码(-p与密码没有空格)」 -D 「数据库名」 --default-character-set=utf8
-
进入mysql后命令行
;
作为结束输入的标志。-
查看
# 查看所有数据库 show databases; # 访问某数据库 use 「数据库名」; # 查看某数据库的所有表 show tables; # 查看某表的所有字段信息 describe 「表名」; # 等价于:`show columns from 「表名」;` # 查看某表的所有字段信息(+full 包括所有额外信息) show [full] columns from 「表名」; # 查看用户 select user from mysql.user; # 展示使用权限 show grants;
-
修改数据库
# 新建数据库 create database 「数据库名」; # 删除数据库 drop database 「数据库名」; # 修改数据库的配置参数 alter database 「表名」 「内容」;
-
修改表
# 新建表 create table 「表名」(「字段」 「类型」); # 删除表 drop table 「表名」; # 修改表名 rename table 「原表名」 to 「新表名」; # 修改表字段信息 alter table 「表名」 「内容」;
-
授权
grant 「权限。如:`all`,`select, update`」 on 「库名 或 *」.「表名 或 *」 to '「用户名」'@'「ip」' identified by '「用户密码」';
-
撤销
revoke 「权限。如:`all`,`select, update`」 on 「库名 或 *」.「表名 或 *」 from '「用户名」'@'「ip」';
-
-
增删改查 数据
select/delete/update/insert
、from 「表名」
、order by 「字段名」
、where
、or
、and
、like
-
# 用户输入到变量名(默认以空格作为输入结果分隔,以 IFS 变量决定)。若没有变量名,则默认输入到 REPLY 变量
read 「n个变量名(以空格分隔),默认REPLY」
-t 「数字,默认 TMOUT 变量值」 # 输入超时时间(秒)
-p 「提示信息」
-a 「变量名」 # 赋值给数组(以0开始)
-n 「数字」 # 截取字符数
-e # 自动补全
-d 「用户输入结束符」
-r # raw 模式,表示不把用户输入的反斜杠字符解释为转义字符
-s # 使得用户的输入不显示在屏幕上,这常常用于输入密码或保密信息
-u 「文件描述符」 # 使用文件描述符作为输入
-
读取文件到变量
#!/bin/bash filename='「文件绝对地址」' while read myline do echo "$myline" done < $filename
sed默认读取整个文件并对每一行进行修改。
-
修改原文件
# macOS sed -i "「原文件备份文件的后缀,若为空则不添加备份文件。参数为必须」" "s/「匹配内容」/「修改内容」/g" 「原文件」 # 修改原文件,可选生成原文件的备份文件 # Linux sed -i "s/「匹配内容」/「修改内容」/g" 「原文件」 # 修改原文件 sed "s/「匹配内容」/「修改内容」/g" 「原文件」 > 「新文件」 # 原文件不变,替换后内容保存在新文件 # 若替换的内容有`/`,则用`#`替换`/`作为分割符 # e.g. sed "s#abc/def#${变量名}#g" 文件名1 > 文件名2
ln 「源文件」 「目标文件」 # 硬链接,会在 目标文件 上生成一个与 源文件 大小相同的文件(不能是文件夹)
ln -s 「源文件/目录」 「目标文件/目录」 # 软链接,会在 目标位置 上生成一个 源文件/目录 的镜像,不占用磁盘空间(类似Windows的快捷方式)
# 硬链接、软链接 区别:https://www.cnblogs.com/liujiaq/p/5850471.html
-
:set nu
设置行号 -
:行号,$s/内容1/内容2
从「行号」开始到最后一行中,每行的第一个「内容1」替换成「内容2」:行号,$s/内容1/内容2/g
从「行号」开始到最后一行中,每行的所有「内容1」替换成「内容2」
-
修改当前Shell环境的运行参数(不会继承到子Shell),即定制环境
-
set
+ 配置项e.g.
set -u
-
bash
(或其他Shell) + 配置项 + 脚本会完全脚本的忽略Shebang行(Shebang行加的运行参数也会被忽略)。
e.g.
bash -u ./脚本
-
脚本Shebang行 + 配置项
e.g.
#!/bin/sh -u
-
# 运行参数的配置项:
-u # 若遇到不存在的变量,则报错并停止执行。或:`-o nounset`
+u # 默认。取消`-u`的效果。或:`+o nounset`
-x # 运行结果之前,先输出执行的那一行命令(用`+ 指令内容`的方式输出,环境变量`PS4`的值决定输出符号)。或:`-o xtrace`
+x # 默认。取消`-x`的效果。或:`+o xtrace`
-e # 脚本只要发生错误,就终止执行(管道)。或:`-o errexit`
+e # 默认。取消`-e`的效果。`+o errexit`
# 管道命令,是多个子命令通过管道运算符`|`组合成为一个大的命令。Bash会把最后一个子命令的退出码,作为整个命令的退出码
-o pipefail # 只要一个子命令失败,整个管道命令就失败,脚本就会终止执行
+o pipefail # 默认。取消`-o pipefail`效果
-E # 一旦设置了`-e`参数,会导致函数内的错误不会被`trap`命令捕获。`-E`参数可以纠正这个行为,使得函数也能继承trap命令
+E # 默认。取消`-E`的效果
-n # 不运行命令,只检查语法是否正确。或:`-o noexec`
-f # 不对通配符进行文件名扩展。或:`-o noglob`
+f # 默认。取消`-f`的效果。`+o noglob`
-v # 打印Shell接收到的每一行输入。。或:`-o verbose`
+v # 默认。取消`-v`的效果。`+o verbose`
-
压缩文件夹
zip 「名.zip」 「文件」 zip -r 「x.zip」 「源文件夹」 -e # 加密码
-
解压缩
unzip 「x.zip」
brew update && brew upgrade && brew upgrade --cask
# 更新用brew安装的软件,也更新brew自身
brew cask可以安装大部分软件,使用
brew search 「软件名」
进行搜索(建议对非App Store安装的应用,都尝试用brew cask安装)。
open 「路径/文件」
-t # Opens with default text editor
安装duti(brew install duti),可为各种文档设置默认应用程序。如:设置纯文本的默认应用程序为Sublime
duti -s com.sublimetext.4 public.plain-text all
、设置纯文本的默认应用程序为TextEditduti -s com.apple.TextEdit public.plain-text all
。
钥匙串
应用可以查看本机保存的密码(大部分应用都会把密码保存在钥匙串)。
-
进入恢复模式
-
进入描述文件的文件夹,删掉所有文件后新建空文件夹、文件
# Macintosh HD 是目标的启动卷 cd /Volumes/Macintosh HD/private/var/db/ConfigurationProfiles rm -rf * mkdir Settings touch Settings/.profilesAreInstalled
-
重启
为什么删了描述文件,还是可以连上公司的Wifi?