Mac和Linux下一些常用的命令 - command tips
git branch 不要分页
设置git branch不分页显示
1 | git config --global pager.branch false |
使用git合并特定的commit
比如要在master分支上合并其他分支的commit,commit id是37c89cc, 则命令是:
1 | git checkout master |
本地同步远端已删除分支
参考: https://stackoverflow.com/questions/5751582/fetch-from-origin-with-deleted-remote-branches
使用git fetch -p来同步远端已经删除的分支。-p就是--prune修剪的意思。
Github中clone私有仓库
Github中,对于私有仓库如果直接git clone, 会提示fatal: repository 'https://github.com/xxxxxx/yyyyyy.git/' not found
有两个方法可以用于克隆Github上的私有仓库
- 使用ssh key方式
- 使用显式的用户名密码的https方式
Github中使用账号密码方式clone私有仓库
在git clone命令的url中,添加上github的用户名和密码即可。
1 | git clone https://username:password@github.com/xxxxxx/yyyyyy.git |
Github中使用ssh key方式clone私有仓库
在~/.ssh/config中配置github中使用的key, 类似如下
1 | Host "github.com" |
接下来就可以clone代码了
1 | git clone https://github.com/xxxxxx/yyyyyy.git |
Reference
查看git中所有分支的日志
使用命令git log --all来查看所有分支的提交日志
在所有的branch中搜索
方法一
使用命令git grep "search-words" $(git rev-list --all) 来在所有的branch的commit中进行搜索。
该方法有一个问题,当git rev-list --all列出的commit很多时,可能会报-bash: /usr/bin/git: Argument list too long的错误
方法二
使用命令git rev-list --all | xargs git grep <expression> 来搜索,则不会有Argument list too long的问题
搜索限制在某个目录下的方法
以目录lib/util为例:
1 | git grep <regexp> $(git rev-list --all -- lib/util) -- lib/util |
两个命令中都带了lib/util,因为rev-list只是将有lib/util变更的revisions全部找出来,所以还需要在git grep中添加-- lib/util将搜索限定在找出来的revisions中的路径lib/util下。
其他用法
还有一些其他的搜索方法,参考How to grep (search) committed code in the Git history
git diff 不要分页
使用命令git --no-pager diff设置git diff时不要分页。
查找git中文件是否被ignore以及是被哪个配置文件ignore的
使用git check-ignore *来查找目录下是否有被ignore的文件。
使用git check-ignore -v *来查找目录下ignore的文件,以及是被哪个配置文件ignore的
例子:
1 | $ git check-ignore * |
例子中可以看到当前目录node_modules是被git ignore的,是被当前目录下的.gitignore文件的37行的配置/node_modules给ignore的。
如果要检查单个文件或者目录是否被ignore了,那么将上述命令的*换为对应的文件即可, 如:
1 | $ git check-ignore -v node_modules/ Gemfile |
可见Gemfile没有被ignore, node_modules/被文件.gitignore设置为ignore了。
参考:
git命令获取当前分支
使用git symbolic-ref --short -q HEAD来获取当前分支
参考:
- How to programmatically determine the current checked out Git branch
- Bash script to get the current git branch and last commit
获取git仓库中所有的branch
命令:
1 | git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done |
一个完整的clone所有分支的例子
1 | git clone ssh://user_name@git.xxxx.com/git/repository.git && cd repository && git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done && git fetch --all && git pull --all && cd .. |
参考:
查找文件记录(包含已删除的文件)
如下命令可以用来查找文件的提交记录,即使文件已经被删除了。
指定具体文件路径查找,适用于还记得文件路径的情况
1
git log --all --full-history -- <path-to-file>
只显示最后一个和文件相关的commit
1
git log --all --full-history -1 -- <path-to-file>
模糊查找,适用于只记得部分文件名的情况
1
git log --all --full-history -- "**/thefile.*"
使用git log查找出文件所对应的commit后,使用git show显示具体commit情况
1
git show <SHA> -- <path-to-file>
如果想要具体的文件,那么git checkout
<SHA>临时切到指定分支查看对应的文件,1
git checkout <SHA> -- <path-to-file>
如果是查找删除的文件,那么
<SHA>后面需要还有一个脱字符^使用
<SHA>^, 因为当前<SHA>中的文件已经被删除了, 需要切换到前一个版本1
git checkout <SHA>^ -- <path-to-file>
Git从远端分支checkout
如果只有一个remote, 直接git checkout branch_name就行。
如果有多个remote,则需要显示指定remote
1 | git checkout -b fix-failing-tests origin/fix-failing-tests |
参考:
Macos下tree显示中文
1 | # 安装tree |
CentoOS 7 最小化安装后可能需要的一些命令
1 | yum install wget curl |
CentOS 7 中命令行UI编辑网口信息的命令
1 | $ yum install NetworkManager-tui |
CentOS 7中命令行安装GUI组件
1 | # 安装组件 |
MacOS ffplay只有声音没有图像
如果rtmp地址加了单引号,ffplay会偶尔抽风只播放声音而没有视频, 去掉单引号或者使用双引号代替
1 | # 可能会抽风,没有图像,只能解析音频信号 |
grep 中将binary file当做文本
grep加上-a参数,就可以将binary file当做text来对待.man grep
1 | -a, --text |
grep 搜索非ASCII字符
命令如下,可用于搜索中文等
1 | grep --color='auto' -P -n '[^\x00-\x7F]' filename |
其中-P是以perl模式执行grep
grep 搜索控制字符和非可打印字符
搜索控制字符,比如^M,``^H等,其中^M需要通过ctrl + v + m`来输出。
1 | grep '[[:cntrl:]]' filename |
搜索非可打印字符的命令如下:
1 | grep '[^[:print:]]' filename |
grep 只列出匹配的文件名
使用参数-l
解释如下:
1 | -L, --files-without-match |
grep搜索排除目录
使用--exclude-dir参数,如果有多个目录要排除,那么可以添加多个--exclude-dir参数:
1 | $ grep -nri 'nginx' ./ --exclude-dir=02_codes --exclude-dir=04_tickets |
grep 搜索隐藏目录
使用grep -r search * .*来搜索所有的目录,包含隐藏目录和隐藏文件。
grep 如何同时搜索软连接目录内的内容
grep中遍历目录进行搜索,之前一直习惯使用-r来进行搜索,但如果搜索的目录中,有子目录是链接,则-r参数不会搜索这些链接的子目录。
如果想要搜索这些链接子目录,则需要使用-R参数。
GNU grep中,对-r和-R两个参数的说明。
1 | -r, --recursive |
参考: Terminal: grep recursive - don’t search in symlink contents
MacOS下Betterzip quicklook不起作用
BetterZipQL被集成到BetterZip中了,因此brew在pull request 41954中删除了BetterZipQL。
需要使用brew cask install betterzip来安装BetterZip。BetterZip是收费软件,30天免费试用。但官网上说Quick Look功能在试用期结束后,还是可以免费使用。
如果安装完成后,发现quicklook功能没起作用,记得需要先在Application中打开一次BetterZip,别问我是怎么知道的。
MacOS下QuickLook的路径
全局目录: /Library/QuickLook/
用户目录: ~/Library/QuickLook/
CentOS 7下安装lspci
1 | # 安装lspci |
rsync命令
1 | # 密码方式 |
CentOS中启用epel repository
1 | yum -y install epel-release |
CentOS中systemctl常用命令小结
1 | # 启动服务 |
Split切割文件
1 | # 按行切割 |
Gem切换源
Gem 切换为RubyChina https://gems.ruby-china.com/
ruby环境
1 | $ gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/ |
Gemfile和Bundle情况, 修改Gemfile
1 | source 'https://rubygems.org/' |
rvm切换ruby安装源
1 | # 用户级别 |
gitignore例子
1 | # Ignore Mac DS_Store files |
测试NTP服务器
1 | ntpdate -q 1.cn.pool.ntp.org |
CentOS下安装nslookup
1 | yum install bind-utils |
列出Linux下目录的文件数
1 | find DIR_NAME -type f | wc -l |
find排除指定目录
使用参数-not -path "./xxx/*"来排除目录xxx下的文件
find列出某个目录下文件列表和大小
1 | find ./ -type f -exec du -b {} + | awk '{print $2 "\t" $1}' | sort -k1 |
列出目录下不包含xxx目录的文件列表和大小
1 | find ./ -not -path "./xxx/*" -type f -exec du -b {} + | awk '{print $2 "\t" $1}' | sort -k1 |
按照文件修改日期查找文件
find命令可使用参数-mtime来搜索某个时间段的文件。
man中的解释如下:
1 | -mtime n |
n可以带正负号,-n指n天以内,+n指n天以前
以4天为例,用下图来讲解不带符号,正号和负号的用法:
1 | 4 |
其中:
- +4代表大于等于5天前的文件
- -4代表小于等于4天内的文件
- 4代表4~5那一天的文件
参考:
Linux下几个获取出口公网IP的命令
1 | curl ipinfo.io |
获取磁盘和CPU使用率的命令
1 | ## 获取CPU使用率 |
top -b参数是有bug的,第一次显示的cpu数据是错误的, 要用第二次的输出来获取CPU的实际使用率。
top的bug说明: https://askubuntu.com/a/399966以及Bug 174619 - top reports wrong values for CPU(s) in batch mode
解决停止操作后SSH连接断开的办法
在ssh命令中添加-o ServerAliveInterval=10参数,每隔10s向服务器发送心跳包。
1 | ssh -o ServerAliveInterval=10 user@remote-ssh-server-ip |
本地转义HTML的几个命令
1 | Perl 版本 |
来自stackoverflow Bash script to convert from HTML entities to characters
EB手动打包时包含隐藏目录
进入源文件所在目录中工作
1 | $ zip ../myapp.zip -r * .[^.]* |
使用Git打包
1 | # 创建当前分支上最新 Git 提交的 ZIP 存档 |
Linux下mail如何添加多个附件
mailx 命令中使用多个-a选项
1 | $ mailx -s 'Few files attached' -a file1.txt -a file2.txt someone@some.com |
https://stackoverflow.com/questions/14473732/attaching-more-than-2-files-in-mail-in-unix
top命令
指定刷新频率可以用-d参数
1 | top -d 1 |
更改top显示排列方式的办法
You can interactively choose which column to sort on
- press
Shift+fto enter the interactive menu - press the
upordownarrow until the%MEMchoice is highlighted - press
sto select%MEMchoice - press
enterto save your selection - press
qto exit the interactive menu
按进程的CPU使用率排序
运行top命令后,键入大写P
按进程的内存使用率排序
运行top命令后,键入大写M。
使用ssh-keygen从私钥中获取公钥
命令如下:
1 | ssh-keygen -y -f id_rsa_for_passphrase |
获取key的fingerprint
命令为ssh-keygen -lf keyfile, 例子如下:
1 | $ ssh-keygen -lf xxx.pub |
设置ssh tunnel
使用ssh 设置转发tunnel
1 | # -N 不执行远程命令 |
awk
awk中去除字段的前后空格
1 | echo " 300173226 | news-icon " | awk -F '|' '{ print "src is ["$1"]["$2"]"}; {gsub(/^[ \t]+/,"",$2);gsub(/[ \t]+$/,"",$2);gsub(/^[ \t]+/,"",$1);gsub(/[ \t]+$/,"",$1); print "processed result is ["$1"]["$2"]"};' |
awk中输出单引号, 使用\x27
1 | awk '{print "\x27" $2 "\x27"}' |
awk 3.x支持Interval expressions {n,m}
awk 3.x中默认不支持Interval expressions,如果需要开启,需要添加--re-interval参数, 4.0以上版本默认是开启的。
1 | awk --re-interval -f xxx.awk |
参考:
- awk repetition {n} is not working
- Awk regular expression syntax with number of repetition - different handling between gawk 3 and gawk 4
awk执行命令并获取返回
使用system()可以执行命令,但是没法获取返回值。要获取命令的返回值,可以使用cmd | getline的方式来。
1 | awk 'BEGIN { |
参考:
CentOS下获取内存使用率
1 | free | grep 'buffers/cache' | awk '{printf "%.2f", $3/($3+$4)*100}' |
nginx一些常见配置选项
X-Frame-Options配置
1 | # 允许某些domain引用 |
CSP: frame-ancestors
1 | # 设置可被iframe嵌入的网址,如有多个源,使用空格隔开 |
使用script切换当前目录
使用bash执行shell script时,会启动一个子shell来执行该脚本。因此在脚本中的目录变换不会影响到父进程。
使用source script.sh的方式,可以在当前进程中执行script.sh的内容,以此来切换当前目录等。
使用ssh-copy-id拷贝公钥
将id_rsa.pub的公钥拷贝到目标主机对应账号的~/.ssh/authorized_keys中, 如果目录和文件不存在,会自动创建,并设置正确的权限。
1 | ssh-copy-id -i ./id_rsa root@192.168.187.172 |
虚拟机中ssh登录慢
虚拟机中ssh登录Linux有时会慢,解决办法:
把文件/etc/ssh/sshd_config中的#UseDNS yes改为UseDNS no.
再重启sshd服务:systemctl restart sshd。
Linux Watch重复运行命令
watch是Linux下周期性执行某个命令的程序。以全屏模式来显示执行结果。-n可以设置显示间隔。
参数:
-n:指定指令执行的间隔时间(秒);
-d:高亮显示指令输出信息不同之处;
-t:不显示标题。
1 | # 每隔一秒高亮显示网络链接数的变化情况 |
passenger获取passenger_root和passenger_ruby
获取passenger_root的值
1 | # passenger-config --root |
获取passenger_ruby的值
1 | # passenger-config --ruby-command |
Reference:
Rvm 相关小命令
1 | # 清理rvm缓存文件 |
CentOS 7中显示和修改时区
显示当前系统时区命令timedatectl status
设置当前时区为北京时间timedatectl set-timezone Asia/Shanghai
列出所有支持的时区timedatectl list-timezones
修改CentOS 7中主机名字
修改主机名命令: hostnamectl set-hostname newname
CentOS 7中安装node 10.x
CentOS 7中base源的node版本是6.x,但很多新nmp包都需要8.x以上版本,所以base中的node有点老旧了。
下面记录在CentOS 7中从NodeSource安装node 10.x的步骤
1 | $ curl –sL https://rpm.nodesource.com/setup_10.x | sudo bash - |
安装完毕后,可使用node -v和npm -v查看node和npm的版本
CentOS 7中安装yarn
1 | $ curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo |
让终端走代理的方法
设置http,https代理
1 | export http_proxy="http://proxyAddress:port"; export HTTP_PROXY="http://proxyAddress:port"; export https_proxy="http://proxyAddress:port"; export HTTPS_PROXY="http://proxyAddress:port" |
设置socks5代理:
1 | export ALL_PROXY=socks5://proxyAddress:port |
openssl查看证书的几个命令
1 | # 查看KEY信息 |
crontab中如何设置奇数天和偶数天运行
1 | # Will only run on odd days: |
Reference: How can I tell cron to run a command every other day (odd/even)
Shell大小写转换
1 | echo $name | tr '[:lower:]' '[:upper:]' |
或者
1 | echo $name | tr '[a-z]' '[A-Z]' |
du统计隐藏目录的大小
du 统计目录大小的一些用法。
1 | # 统计非隐藏文件/目录的大小 |
du排除某些目录的用法
使用--exclude参数来排除某些目录
1 | du -sh ./* --exclude=sql_dump |
CentOS下网络使用工具
1 | yum install iftop |
如果yum源中没有, 就先安装epel源yum -y install epel-release
mysql dump数据库
mysql dump数据库命令
1 | mysqldump -uusername --databases databasename -p > databasename_`date +%Y%m%d_%H%M%S`.sql |
mysql 恢复命令
1 | mysql -uusername databasename -p < databasename.sql |
mysql dump全部表结构和索引
1 | mysqldump -uusername -d databasename --compact --no-data -p > databasename.sql |
mysql小命令
手动设置表的AUTO_INCREMENT
1 | mysql> alter table table_name AUTO_INCREMENT = 100; |
统计每个数据库的大小的sql
1 | SELECT table_schema "DB Name", |
mysql将值转换为float
使用mysql的DECIMAL[(M[,D])]方法, 可将值转为小数类型,转换对象可以是数值,可以是字符串
例子:
1 | mysql> select CAST(12345 AS DECIMAL(10,2)) as '12345', CAST('56789' AS DECIMAL(10,2)) as '\"56789\"', CAST('4.5s' AS DECIMAL(10,2)) as '\"4.5s\"', CAST('s4.5' AS DECIMAL(10,2)) as '\"s4.5\"'; |
给Mysql数据库添加unique key的步骤
对已经有数据的表添加unique key的步骤
检查数据库中字段是否有重复的值
1
2
3
4
5-- Script 1
select fooColumn, count(*) as cnt
from barTable
group by fooColumn
having count(*) > 1如果有重复的值,需要选出重复的值,进行处理
1
2
3
4
5-- Script 2 - 选出有重复值的记录
select * from barTable where fooColumn = <the selected non unique value>
-- Script 3 - 处理重复记录的值
update barTable set fooColumn = <a new unique value> where barTableId = <an existing unique value>;创建新的unique key
1
create unique index idx_unique_fooColumn on barTable(fooColumn);
如果原来字段有单独的索引的话,删除旧的索引
1
drop index idx_old_fooColumn on barTable;
参考: How do you change a non-unique index to a unique index?
CentOS 7上安装mysql的简要步骤
步骤如下:
1 | # 安装mysql |
CentOS 7删除老旧的mysql并重新安装的步骤
- 删除老旧的mysql
1
yum remove mysql mysql-server
- 移除mysql的数据目录
1
mv /var/lib/mysql /var/lib/mysql.bak
- 重新安装mysql
1
yum install mysql mysql-server
tar排除固定目录
使用--exclude=参数来排除目录,如果有多个目录需要排除,就使用多个--exclude=。
记住目录后面不能加/, 否则目录还是会被tar打包
例子:
1 | $ tar czvf ~/tmp/info.tar.gz --exclude=test_on_20180827 ./ |
不解压查看tar.gz中的文件列表
1 | tar -tvf xxx.tar.gz |
tar解压文件owner属性
关于解压出的文件的拥有者(owner)属性,有两个参数
1 | --no-same-owner |
对超级用户来说,默认是--same-owner模式,tar包中原文件是什么解压出来就是什么。
对普通用户来说,默认是--no-same-owner模式,解压出来的文件的所有者默认是当前用户。
例子:
1 | tar --no-same-owner -xzvf dist_ondeck.tar.gz |
tar解压到指定目录
使用-C来指定解压目录, -C参数说明:
1 | -C, --directory=DIR |
例子:
1 | # 将dist_ondeck.tar.gz中的文件解压至./ondeck目录中 |
不解压查看zip中的文件列表
只要使用less 文件名即可,less原生就支持zip文件的查看
1 | less filename |
Linux下查看网卡速率
使用ethtool命令查看网速信息。Supported link modes中表示网卡支持的速率。
1 | # ethtool em1 |
vim中查看识别的文件类型
命令如下:
1 | :verbose set filetype? |
markdown文件显示如下:
1 | filetype=markdown |
vim中ESC失效问题
不知道装的哪个插件,有时候会导致ESC失效,按ESC会输出^M
此时可以先Ctrl + c, 然后就可以正常使用了。
vim中文本tab转空格
.vimrc中配置tab设置
1 | set tabstop=4 " tabstop 表示一个 tab 显示出来是多少个空格的长度,默认8 |
在’:’冒号模式下输入如下命令,即可将tab转为空格。
1 | :%retab |
vim中快速产生递增数列
在vim命令行模式下(普通模式下按:进入),输入下面这条命令
1 | r !seq m n |
注意:默认是从文件最后一行往下递增!
1 | m:起始序号 |
iTerm2 分屏快捷键
新建tab: command + t
新建window: command + n
tab间切换: command + 数字键(9表示左右一个tab)
tab间切换: command + 方向键
同一tab垂直分屏: command + d
同一tab水平分屏: comamnd + shift + d
最近使用的分屏间切换: comamnd + ]和command + [
tab间切换: command + option + 方向键
iTerm2 如何发送命令到所有窗口
iTerms给多个Tab同时发送命令。Command+Shift+i,之后输入命令,enter
Macos下安装OpenJDK
使用brew安装openJDK
1 | $ brew reinstall openjdk |
设置系统java来使用openJDK
1 | sudo ln -sfn /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk |
Linux shell中打印有颜色的字体
参考自: Printing a colored output
输出带颜色的字
Colors for text are represented by color codes, including, reset = 0, black = 30, red = 31, green = 32, yellow = 33, blue = 34, magenta = 35, cyan = 36, and white = 37.
1 | # 打印红色字体, 其中\e[1;31m是设置红色,\e[0m是还原颜色 |
输出带颜色背景的字
For a colored background, reset = 0, black = 40, red = 41, green = 42, yellow = 43, blue = 44, magenta = 45, cyan = 46, and white=47, are the commonly used color codes.
1 | # 打印红色背景的字体, |
Mac下貌似不起作用。Mac下原生的echo太原始了。
统计代码的小工具
cloc是用于统计代码的一个小工具。
命令的安装方法
1 | npm install -g cloc # https://www.npmjs.com/package/cloc |
Docker方式运行
1 | docker run --rm -v $PWD:/tmp aldanial/cloc -- cloc /tmp |
FFMPEG从HLS流转换为MP4
来自: FFMPEG mp4 from http live streaming m3u8 file?
1 | ffmpeg -i http://.../playlist.m3u8 -c copy -bsf:a aac_adtstoasc output.mp4 |
FFMPEG 将gif转为mp4
使用ffmpeg将gif转为mp4, 方便查看中间的内容。
1 | ffmpeg -f gif -i input.gif output.mp4 |
you-get如何使用cookie
you-get使用-c可以指定cookie文件,来下载登录视频。
MacOS下可以使用firefox的cookie, 命令如下:
1 | you-get -c ~/Library/Application\ Support/Firefox/Profiles/xxxxxxxx.default/cookies.sqlite 'https://v.qq.com/x/cover/divl44zx7b2h40k/k00261fum7u.html' |
判断某个PID是否存在
使用ps -p来判断进程id是否存在。
1 | output=$(ps -p "$pid") |
yum 命令小结
1 | # 安装yum-config-manager |
nc命令检查服务器端口是否开放
使用nc -vz -w 10 IP Port来检查服务器某个端口是否开启。
其中
-v: 设置输出模式-z: 不交互输入/输出, 仅仅报告链接状态-w <time>: 设置超时时间1
2
3
4
5
6
7
8
9
10
11$ nc -vz -w 10 www.baidu.com 443
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 180.101.49.12:443.
Ncat: 0 bytes sent, 0 bytes received in 0.03 seconds.
$
$ nc -vz -w 10 www.baidu.com 440
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connection to 180.101.49.12 failed: Connection timed out.
Ncat: Trying next address...
Ncat: Connection timed out.
$
CentOS 7查看和更新密码有效期
账户密码失效后,运行crontab任务会在/var/log/cron中报告如下出错信息,并且禁止crontab任务的运行
1 | Feb 3 12:32:01 wjds-food-new crond[31367]: (deployer) PAM ERROR (Authentication token is no longer valid; new one required) |
可使用chage -l username来查看密码有效期设定
1 | # chage -l deployer |
可以通过更新密码来重置Password expires时间,也可以使用如下两个命令,直接设置密码永久不需要重置。
1 | passwd -x -1 username |
获取yum变量$arch,$basearch和$releasever的小命令
可以使用如下python命令来获取yum的变量
1 | python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)' |
下面是该命令在Aliyun Linux 2,Amazon Linux 2和CentOS 7.6上的输出。
** Aliyun Linux 2的结果 **
1 | $ python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)' |
** Amazon Linux 2上的运行结果 **
1 | $ python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)' |
** CentOS 7.6上的运行结果 **
1 | $ python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)' |
各系统redhat-release的信息
命令rpm -q --whatprovides redhat-release在各个系统Aliyun Linux 2,Amazon Linux 2和CentOS 7.6上的输出。
** Aliyun Linux 2的结果 **
1 | $ rpm -q --whatprovides redhat-release |
** Amazon Linux 2上的运行结果 **
1 | $ rpm -q --whatprovides redhat-release |
** CentOS 7.6上的运行结果 **
1 | $ rpm -q --whatprovides redhat-release |
Linux下cat EOF变量展开情形
变量展开
正常情况下,cat会获取变量值展开。
如:
1 | cat >> ./cat_with_variable.txt << EOF |
那么文件./cat_with_variable.txt中的内容是
1 | echo /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin |
变量不展开
如果需要保留变量名的形式,输出到文件中的是echo $PATH的字串,那么需要将EOF的形式变换一下。变成如下两种形式之一皆可保留变量的形式。
- 形式一: 将第一个
EOF变为\EOF, 即1
2
3cat >> ./cat_with_variable.txt << \EOF
echo $PATH
EOF - 形式二: 将第一个
EOF用单引号括起来,变为'EOF', 即1
2
3cat >> ./cat_with_variable.txt << 'EOF'
echo $PATH
EOF
此时,文件中的内容为:
1 | echo $PATH |
参考: How to cat EOF a file containing code?
Mac下清除DNS缓存
清除DNS缓存命令
1 | sudo dscacheutil -flushcache |
Mac下brew安装组件但不更新自己的方法
在brew install之前添加HOMEBREW_NO_AUTO_UPDATE=1 , 如
1 | HOMEBREW_NO_AUTO_UPDATE=1 brew install jq |
Linux中使用logger命令写入syslog日志
将”hello world”写入local1.info中
1 | logger -it error -p local1.info "hello world" |
检查syslog配置
-N参数,可不运行服务来检查syslog配置是否正确。例子:
1 | sudo /usr/sbin/rsyslogd -f /etc/rsyslog.conf -N1 |
mongo数据库的各种查询语句示例
1 | 左边是mongodb查询语句,右边是sql语句。对照着用,挺方便。 |
参考: https://blog.csdn.net/qq_27093465/article/details/51700435
将mongo数据导出为csv文件
可以使用mongoexport加--type=csv,--out report.csv的方式来将mongo数据导出成csv文件。
通过数据库账号密码方式:
1 | mongoexport -h localhost -d databse -c collection --type=csv |
通过uri方式:
1 | mongoexport --uri=uri -c collection --type=csv |
筛选时间类型的方法:
1 | mongoexport --username user --password pass --host host --db dbName --collection coll --type=csv |
参考: Mongoexport -q ISODate query
dd创建指定大小的文件
1 | dd if=/dev/zero of=test_file count=20480 bs=1M |
- if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
- of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
- bs: 同时设置读入/输出的块大小为bytes个字节
- count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
更换pip源
国内阿里云镜像源: https://mirrors.aliyun.com/pypi/simple/
临时pip安装
可以在使用pip的时候在后面加上-i参数,指定pip源
1 | pip install scrapy -i https://mirrors.aliyun.com/pypi/simple/ |
永久修改
Linux下
修改$HOME/.config/pip/pip.conf文件,添加内容如下:
1 | [global] |
cp命令保持文件源属性
cp命令中的-p参数可以在拷贝文件时,保留文件的原属性,包含文件修改时间,访问时间以及文件属性等-p参数的解释:
1 | -p same as --preserve=mode,ownership,timestamps |
CentOS 7 本机进单用户模式
步骤:
- 开机选取Kernel页面时,按e进入编辑页面
- 定位到linux16那行,修改
ro为rw init=/sysroot/bin/sh, 修改后按Ctrl + x保存启动,即可进入单用户模式 - 进入后,依次输入如下命令:
chroot /sysroot/, 切换环境为chroot 监狱passwd root,修改root密码touch /.autorelabel,开启重启时的 SELinux 重新标记reboot -f重启系统。
参考:
alternatives/update-alternatives的简要用法
CVE-2021-4034 polkit pkexec 本地提权漏洞
POC代码:
1 | #include <stdio.h> |
编译后运行就可以得到root的shell了
1 | gcc poc.c |
原理参考:
- PwnKit: Local Privilege Escalation Vulnerability Discovered in polkit’s pkexec (CVE-2021-4034)
- RHSB-2022-001 Polkit Privilege Escalation - (CVE-2021-4034)
- CVE-2021-4034 pkexec 本地提权漏洞利用解析
- CVE-2021-4034 poc on github
CentOS 7下安装Mysql 需要导入PGP key
之前CentOS下安装mysql组件的步骤:
1 | wget https://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm |
现在安装时候, 会报错
1 | 获取 GPG 密钥失败:[Errno 14] curl#37 - "Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022" |
可以通过手动导入PGP key来解决
1 | rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 |
参考:
SELinux开启时修改mysql数据目录
mysql默认安装时,数据在/var/lib/mysql目录下, 在SELinux开启时,如果要迁移目录,需要将目标目录属性设为mysqld_db_t
mysql安装步骤:
1 | # 安装mysql |
SELinux禁止时,拷贝mysql的数据到目标目录的步骤如下:
1 | # 停下mysql |
当SELinux开启时,此时rsync后再systemctl start mysqld.service, 会报如下错误:
1 | [root@localhost ~]# systemctl start mysqld.service |
因为/opt/app/mysql下的文件没有mysqld_db_t的属性
1 | # ll -Z /var/lib/ | grep mysql |
此时需要修改/opt/app/mysql下文件的selinux权限才行
1 | # 安装semanage命令 |
参考:
- How to Fix ‘semanage command’ Not Found Error in CentOS/RHEL
- MySQL permission denied error even after setting security context for SELinux on VM
mysql创建用户
创建语句:
1 | # 创建不限制访问的用户 |
Linux下获取后台进程的运行命令路径
两个方法:
ls -alF /proc/<PID>/exereadlink -f /proc/<pid>/exe
原理: Linux下每个进程的信息会存放在/proc/<PID>的路径下, 其中exe会链接到实际运行的命令上。所以只要查看/proc/<PID>/exe就可以知道是哪边运行的命令。
例子:
一台机器上装有多个nginx,启动nginx的时候没有指定完整路径,查看ps命令输出只看到运行命令是./nginx, 无法知道运行的是哪个版本
1 | $ ps -ef | grep nginx | grep master |
此时就可以通过进程号来读取运行文件的完整路径。
1 | $ sudo ls -alF /proc/10077/exe |
参考:
Linux中sudo each 重定向到文件时Permission Denied
某个文件当前用户没有写入权限,当你尝试想用sudo echo 'something' > file的形式写入时,会发现虽然你有sudo权限,但还是会报Permission Denied的错误。
原因是重定向操作’>’和’>>’并不是被sudo echo来执行的,而还是以当前用户来执行的。
解决方法一,使用tee
1 | # 替换文件 |
解决方法二,使用sudo bash -c 显式运行命令
1 | sudo bash -c "echo 'something' > file.txt" |
参考:
iptable的简单用法
CentOS 7过后统一使用firewall来设置防火墙了,但CentOS 6中还是只能使用iptables来设置防火墙。如下是一些简单的防火墙的命令,做备忘。
正常的service启动/停止iptables服务
1 | service iptables start # 启动 iptables |
配置文件
1 | /etc/sysconfig/iptables |
匹配和执行规则:
- 从第一条规则开始顺序往下匹配,匹配到了就执行动作,并不再匹配接下来的规则**
- iptables命令设置的规则立马起效, 要注意千万不要把自己关在服务器以外
相关命令:
1 | service iptables save # 保存内存中的条目到配置文件/etc/sysconfig/iptables中 |
logrotate执行时没有备份旧文件
运行logrotate时,如果发现没有备份和切割旧文件。可能的原因就是配置文件编写有误。
可以使用参数-d来测试配置文件, 或使用-v来显示处理信息
一个例子:
执行logrotate时,没有生成备份文件,使用-v来输出处理信息。
1 | logrotate -v -f /etc/logrotate.d/test.conf |
命令输出中发现了错误信息:
1 | Ignoring /etc/logrotate.d/test.conf because of bad file mode. |
原因是文件权限为755, 修改为644后即可正常执行。
logrotate例子
文件/etc/logrotate.d/rails
1 | /var/log/rails/production.log |
Postman中如何设置和使用cookie
官方文档 - Using cookies https://learning.postman.com/docs/sending-requests/cookies/
Amazon Linux中如何安装g++
在Amazon Linux中安装g++的命令如下:
1 | sudo yum install -y gcc-c++ |
aws cli获取autoscaling configuration配置
使用aws autoscaling describe-launch-configurations来查看autoscaling的配置文件, 例:
1 | aws autoscaling describe-launch-configurations --launch-configuration-names AutoScaling-Test |
输出:
1 | { |
Linux下获取文件中指定行数的内容
获取指定行的内容:
1 | sed -n '开始行数,结束行数p' 待截取的文件 |
获取内容后写入新文件
1 | sed -n '开始行数,结束行数p' 待截取的文件 >> 新文件 |
指定端口运行Jenkins
指定http端口:
1 | java -jar jenkins.war --httpPort=9090 |
指定https端口:
1 | java -jar jenkins.war --httpsPort=9090 |
参考: How to start jenkins on different port rather than 8080 using command prompt in Windows?
Linux下修改系统时间
修改系统时间
修改时间: date -s 时间
如:设置当前时间为:2022年10月21日21点50分
1 | date -s '2022-10-21 21:50:00’ |
根据网络同步时间
使用ntp来使用网络时间同步本地时间:
1 | # 安装ntp |
日期的字符串形式和timestamp形式的转换
日期的字符串形式和timestamp形式的转换, Linux下可以使用date命令来进行转换。
date -d "@$TIMESTAMP"来将timestamp转换为字符串形式,
1 | $ date -d @1554688861 |
date -d 'YYYY-MM-DDTHH:MM:SS' +%s,将字符形式的日期转为timestamp。
1 | $ date -d '2019-04-08T02:01:01' +%s |
ImageMagick convert将彩色照片转为黑白照片
方式一:
1 | convert input.jpg -colorspace Gray input_gray.jpg |
方式二:
会生成3个不同灰度的图片,供选取
1 | convert input.jpg -separate input_gray.jpg |
参考: https://blog.csdn.net/weixin_30832983/article/details/97265181
查看debain系统版本的几个方法
- 使用
/etc/os-release系统大版本号,小版本号cat /etc/debian_version - 使用
cat /etc/issue命令,输出例子:Debian GNU/Linux 9 \n \l
MacOS下刷新DNS缓存
命令:
1 | sudo killall -HUP mDNSResponder;sudo killall mDNSResponderHelper;sudo dscacheutil -flushcache |
gzip查看压缩文件压缩信息
使用gzip -l可以查看压缩文件的压缩信息
1 | $ gzip -l package-lock.json.gz |
MacOS选择框中显示隐藏文件
在文件选择对话框中,键入Shift + Command + .就可以看到看到隐藏文件了。
zshrc ohmyzsh 不要共享命令记录
在~/.zshrc中添加设置:
1 | unsetopt share_history |
新启动的Terminal就不会再共享命令记录了。
zsh中禁止末尾自动添加百分号%
zsh中如果打印一串没有换行符的字符串,默认自动给没有换行符的字符串添加一个百分号%,同时另起一行显示新的提示符。
1 | ✗ printf nolinebreak |
在zshrc中使用如下配置将该功能关闭
1 | unsetopt prompt_cr prompt_sp |
参考: https://blog.csdn.net/weixin_44410537/article/details/109899049
MacOS下安装GNU的系列命令
安装方法:
1 | # gnu sed |
因为Mac中已经自带了sed, grep等命令,因此brew安装的时候会将对应的命令改名,叫做ggrep, gsed,具体各个命令参照brew安装的提示。
设置使用GNU命令:
在~/.bashrc或者~/.zshrc中添加alias
1 | alias grep='ggrep' |
另:
brew安装时也可以使用--with-default-names参数来指定命令为grep或sed,但并不推荐使用和Mac下原生命令一样的名字,防止影响一些系统脚本。
具体可以参照 - Macos下如何实现grep的非贪婪模式