很多时候我们只是不知道/忘了有这么个东西!
这些都是我需要时从网上找的,从哪里来回哪里去。
-
echo不换行
echo -e
echo颜色echo -e \033[36m红色\033[0m
-
lsof
lsof -i tcp
lsof filename
lsof -u ubuntu
lsof -p pid
lsof -c programname
-
查看一个进程的环境变量
cat /proc/<pid>/environ | tr \\0 \\n
-
查看Linux发行版
uname -a
cat /etc/issue.net
lsb_release -a
-
apt候选
apt-cache
-
查看不可见字符
cat -A
比如查看 ANSI escape code -
top 分别按E,e切换内存单位 除此之外还有
htop atop iotop
top中java程序的内存解读:<链接> -
bash命令行删除相关 自己试
Ctrl + K
Ctrl + U
Ctrl + W
Ctrl + A
Ctrl +E
-
jcmd
jcmd pid VM.system_properties
jcmd pid VM.flags
-
当前java安装路径
java -verbose
-
iconv 编码转换
-
Linux目录介绍
man hier
-
16进制查看
cat xxx | hexdump -c
-
ls -altr 查看最近修改的文件
-
shopt
shell的配置,关闭shell的通配符以打开正则表达式:shopt -s extglob
,这样就可以用rm
删除时来排除某个文件了rm -rf * !(except)
help shopt
-
grep的或逻辑
grep -E 'A|B'
=egrep 'A|B'
=grep -e 'A’ -e 'B'
-
pkill pgrep killall pkill的优势是
pkill -f
可以匹配整个命令行
killall的优势是kilall -o/-y
可以根据程序启动时长杀掉程序 killall -y 1,2,3,4,5,6,7 即杀死启动时间短于1秒2分3小时4天5周6月7天的所有程序,killall只能匹配程序名
当然它们默认发送的信号是SIGTERM 即15. -
iostat
iotop
vmstat
nmon
关键的是如何解读所看到的数据<此处追加博文链接> -
xargs和find经常搭配使用 xargs -d即delimiter:分界符,默认是空格
默认分界符是空格,那么当遇到前一个输出必须含有空格时咋整?find . -name . '*.log -print0 | xargs -0 rm -f
-print0和-0分别你唱我和
比如在很多java文件中找main
方法:find . -name '*.java | xargs grep main
,即将find输出的文件名作为grep的输入了 -
shell中重定向
&>xxx
等价于某输出>xxx 2>&1
&>filename
意思是把标准输出和标准错误输出都重定向到文件filename中 -
date 输入微秒
date +'%Y-%m-%d %H:%M:%S.%N' | cut -b 1-25
毫秒:date +%s%3N
-
如何确定自己是否在docker容器中,
cat /proc/self/cgroup
中CPU是否有docker字样:https://stackoverflow.com/questions/20010199/how-to-determine-if-a-process-runs-inside-lxc-docker,或者检查是否存在文件/.dockerenv
-
使用SSH进行流量转发,机器A和B均安装有openSSH,内网机器A可以到有固定IP的机器B,但是B到不了A,,此时机器A登录机器B时可以使用
ssh -R8022:localhost:22 userOnB@IPB
,这时在机器B就可以ssh -p8022 userA@localhost
,这样B就可以登录A了; 在A上,不只可以转发自己的localhost:22,可以转发机器A可达的任何端口,来源superuser点我,ssh -L
是转发远程端口,此时机器A可以到机器B,机器B可以到机器C(或者服务C),机器A到不了机器C,ssh -L8022:IPC:PortC userB@IPB
, 在机器A就可以ssh -p8022 userC@localhost
到达C。所以-R是转发远程流量,-L是转发本地流量;R是在远程主机创建端口,L是在本地创建端口,在哪个主机创建端口(被动套接字) 就是目的是要通过已经建立的SSH会话转发哪个主机的流量,而去利用另一端的流量。
-R
在远程主机创建端口,远程主机就可以利用本机流量;-L
在本机创建端口,本机就可以利用远端流量。(此处本机是指调用了SSH命令的机器) 后来查到一个更厉害的-D,直接拿要去登录的主机做代理服务器,,,,还有个-X! -
Linux查看文件被哪个进程占用:
fuser
我用来看apt-get的锁被谁占用。 -
pidof
快速查看进程ID,让我想起了pkill
-
从docker中拷贝文件出来
docker cp <containerId>:/file/path/within/container /host/path/target
-
java默认的垃圾回收器
java -XX:+PrintCommandLineFlags -version
Java 7 - Parallel GC
Java 8 - Parallel GC
Java 9 - G1 GC
Java 10 - G1 GC
忽然记得Java性能调优这本书上说过,Server-class和Client-class machine -
Linux 内核级命令
ltrace (lib) strace
ltrace跟踪线程会导致整个进程退出,因为进程内存共享,trap的原因 网络nstat rtacct
-
ubuntu设置代理 需要环境变量 http_proxy=http://[username:password@]xxxx:80等,编辑
/etc/environment
或者profile
等配置
https://askubuntu.com/questions/158557/setting-proxy-for-apt-from-terminal[]
表示可选;同样https_proxy, ftp_proxy
命令行工具ftp,wget,curl,ssh,apt-get,yum
均收此影响,但是如果密码中含有@
怎么办?当密码中含有非字母时,要转成ASCII,@
对应为%40
https://www.shellhacks.com/linux-proxy-server-settings-set-proxy-command-line/ -
crontab的日志 https://askubuntu.com/questions/56683/where-is-the-cron-crontab-log
-
sudo 免密
visudo; USER_NAME ALL=(ALL) NOPASSWD:ALL
-
AWS EC2
curl http://169.254.169.254/latest/meta-data/public-ipv4
-
继
which
where
后,有知道一个命令:type
,type
好像更实用,tpye -p
。 -
OS的发行版
cat /etc/*release
lsb_release -a
-
把用户添加到一个组:
usermod -a -G some_group some_user
,同样还有adduser、useradd、addgroup、userdel等命令等你去用 -
grep查看保留表头
ps -ef | { head -1; grep XXX }
orps -ef | egrep PID|XXX
-
一个进程有几个线程
ps -efL
orps -o nlwp <pid>
orjconsole <javaPid>
-
查看某个JVM参数 比如线程栈大小
java -XX:+PrintFlagsFinal -version | grep ThreadStackSize
各种比率比如NewRatio
、MaxHeapFreeRatio
、MinHeapFreeRatio
:java -XX:+PrintFlagsFinal -version | grep -i MaxHeapSize
默认的最大堆内存:java -XX:+PrintFlagsFinal -version | grep -i MaxHeapSize
-
alternatives
的简单使用
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_191/bin/java 2 1967
sudo update-alternatives --config java
-
vim去掉换行符(计算MD5)
:set noendofline binary
-
ps输出中的多个空格
cut
无法处理ps -opid,ppid,cmd | tr -s " " | cut -d " " -f 2,3
-
下载某文件时是否支持断点续传
wget -S xxxx | grep Accept-Ranges
-
[MySQL] 表中某字段内容替换
UPDATE table SET field = REPLACE(field, 'string', 'anothervalue') WHERE field LIKE '%string%';
-
tcping
sudo apt install tcptraceroute -y && sudo wget http://www.vdberg.org/~richard/tcpping -O /usr/bin/tcping && sudo chmod 755 /usr/bin/tcping
-
安装terminal词典见我的软件安装博文
-
有的时候,需要让一个正在前台运行的程序,即使SSH断开也不要停止,要命的是执行程序前没有没有
nohup
,或者在tmux
orscreen
中执行。简单了解些Linux会话组就知道不让它停止而一直执行是有办法的。解决办法:reptyr
,当然引用自SOF了,如果你偷一个进程失败时,那就尝试用-T
参数偷过来所有进程,如果提示attach失败,那么需要修改内核参数,如下sudo bash -c 'echo 0 > /proc/sys/kernel/yama/ptrace_scope'
和sudo vim /etc/sysctl.d/10-ptrace.conf
;还有命令disown
-
Terminal实时流量监控,精确到IP.
iftop
-
scp两台远程主机 本主机上,在两台远程主机间拷贝文件.如果两台主机都使用密码的话那很好解决(这个也有个前提,就是曾经在远程源主机登录过远程目的主机,根本是需要保存远程主机指纹),
但是如果是私钥登录,
-i
只能指定一个私钥传递给ssh,就有问题了!SO上这篇回答:https://superuser.com/questions/686394/scp-between-two-remote-hosts-from-my-third-pc,需要在本机~/.ssh/config下指定两台远程主机的私钥;使用-3
开关,本机作为透明中转,就不需要远程主机A保存远程主机B的指纹。 如果两台远程主机密钥一样,一个-i
就ok -
top
f后可以选择依据哪列排序 <、>换页 -
/etc/systemd/system.conf
限制systemd
服务,ulimit
限制PAM认证? 学习cat /proc/<pid>/limits
-
glibc版本查询:
ldd --version
(ldd值得一man ldd值得一man ldd值得一man) 或者getconf GNU_LIBC_VERSION
参考自。同时也可以用来查询程序使用的动态链接库ldd ls
,也有另一中办法readelf -d $executable | grep 'NEEDED'
-
查看
pmap
命令内存块内容
gdp -pid [pid]
dump memory mem.bin 0x00007f8b00000000 0x00007f8b00000000+65512
cat mem.bin | strings
r w, x: execute s: shared p: private(copy on write) -
lsof
给文件把文件大小单位转换,lsof -p <pid> | awk '{$7=$7/1048576 "MB" } 1'
或者lsof -p <pid> | numfmt --field=7 --to=iec | head
后者不可靠,因为lsof
中SIZE/OFF
栏可能是0t0,0t表示offsize;对于lsof
中TYPE出现的REG、MEM,和FD出现的0u,1w,124r等可以一man
-
历史登录记录:
last
,所有用户上次登录记录,lastlogin
-
查看某个用户的ulimit,可以引申哦
su USER --shell /bin/bash --command "ulimit -n"
-
docker的几个命令
docker inspect xxx
可以探索很多东西docker network ls
列出一些"网络空间" 进而再使用 inspect来列出所有容器IP 还有个叫swarm的东西?查看哪个容器由docker-proxy监听了主机端口, docker ps | grep port 就行 -
检查swap分区在哪
swapon -s
分配swap分区时需要操作mkswap -c
先检查一下;关闭swap 一般不建议直接关闭,而是调小大小sudo vim /etc/sysctl.conf vm.swappiness=10
-
给java程序临时指定log4j的配置:
-log4j.configurationFile=file:/path/to/file
-
排查问题时的最先操作是检查主机资源,简洁脚本
echo "
#!/bin/bash
echo -e '\033[36mdf\033[0m'
df -h
echo -e '\033[36mfree\033[0m'
free -h
echo -e '\033[36mcpu\033[0m'
ps -a -o 'pid,%cpu,rss,%mem,cmd' --sort -c | head -11
echo -e '\033[36mmem\033[0m'
ps -a -o 'pid,%cpu,rss,%mem,cmd' --sort -rss | head -11
echo -e '\033[36mvmstat\033[0m'
vmstat " >/tmp/check && chmod 777 /tmp/check && . /tmp/check
-
两个新命令,查看硬件信息:
dmidecode
windows下的nbtstat
,协议统计 -
去重
sort -u
字符串长度echo -n 'test' | wc -m
或者echo '{#varible}'
-
时间戳转date
date -d @158xxx
逆操作date +%s
-
sed
去除一行的某些字符串,比如去除连续6个数字:sed -r -e s/[[:digit:]]{6}//g input_file_path
才知道POSIX正则表达式,分为BRE和ERE,sed的-r就是使用ERE,不同于Perl正则表示数字时的\d
,POSIX正则要表示数字得使用[[:digit:]]
但是.*?{}[]()”
啥的意义是一样的 这个链接和第一个链接有例子,中间的链接是中文博客。grep同样适用以上规则,并且注意POSIX正则表达式不支持非贪婪匹配的问号. -
xarg
主机上所有java程序强制gcjps | cut -d ' ' -f 1 | xargs -i jcmd {} GC.run
-
切换用户时保留环境变量
sudo env PATH=${PATH} su jenkins
-
没有想到Ubuntu自带了oui数据
,是通过ieee-data这个软件包里的数据/usr/share/ieee-data/oui.txt
,nmap也有/usr/share/nmap/nmap-mac-prefixes
,不过自带的太旧了18年2月的,最新的可以在这里得到https://linuxnet.ca/ieee/oui.txt
-
crontab
中运行脚本的问题 之前记得有个’%'问题,再来,默认的SHELL是sh,它不支持&>
缩略重定向;默认的PWD变量是Home目录,(想想为什么登录主机后会默认到/home/ubuntu/),bash中只有cd能改变它,Python的当前路径是通过系统调用getcwd获得,所以脚本要以当前脚本所在目录为基准而不是.
,同时chdir可以改变working directory -
某些情况下注释掉/etc/hosts后域名还是被劫持的,此时就需要安装nscd来清理缓存;同时发现,由于ubuntu18默认开启本地的dns(172.0.0.53#53),所以不同于Ubuntu14,nslookup也
经过识别了hosts劫其实我觉得是因为本机nameserver本身就是一个进程,它肯定依靠host);其实根本是某个进程在使用系统调用时解析域名的过程,(再次感谢stackoverflower)记得之前看过Windows的,不过不要忘了hosts文件是DNS之前的产物 ubuntu18上修改DNS的一种办法是关闭systemd-resolved
服务然后直接修改/etc/resolve.conf
这其实是一个链接文件;刚才找到了修改WIFI的dns的配置文件 目录/etc/NetworkManager/system-connections
另一个办法是修改netplan/etc/netplan/
-
如何完全清理terminal?
reset
reset will actually completely re-initialise the terminal, instead of just clearing the screen. However, it won’t re-instantiate the shell (bash). That means that bash’s state is the same as before, just as if you were merely clearing the screen.
reset是否可以完全清空屏幕,和模拟终端实现有关(Xshell4 可以清空,XShell5 就不行)printf "\033c"
实际上是terminal emulator,这个emulator非常关键,[因为以前的终端是个实物] (https://unix.stackexchange.com/questions/180943/terminal-vs-bash) SF链接2 Xshell的配置VT100有没有注意过? -
寻找某个类,在哪个jar中出现过? https://stackoverflow.com/questions/1342894/find-a-class-somewhere-inside-dozens-of-jar-files
a.for i in *.jar; do jar -tvf "$i" | grep -Hsi ClassName && echo $i ; done
b.find /some/path -name *.jar -exec grep -Hls ClassName {} \;
c.for i in $(locate "*.jar"); do echo "$i"; jar -tvf "$i" | grep -Hsi ClassName; done
-
shell中处理Json 安装jq,用
.
来索引,比如.name
-
find -exec
结束时必须跟\;
,;
表示结束\
即转义 那么怎么把一个文件夹下的文件批量操作?find some_path -type f -exec bash -c 'sed s/src/dst/ {} > {}' \;
搞了半天写不对,sed带了-i
,sed
替换第一行怎么写?sed '1ctarget
1表示第一行,c表示change 【问题来源于今天需要批量修改xml的版本为1.0】 -
file
判断文件类型 -
使用金山词霸API在线翻译
curl 'http://dict-co.iciba.com/api/dictionary.php?w='$1'&key=yourkey&type=json' 2>/dev/null | native2ascii -encoding UTF-8 -reverse | jq -Cr '.symbols[0].parts' | sed -r s:\\{\|\\}\|','::g | sed -r "s#' '*\x1b\\[1;39m\x1b\\[0m\x1b\\[1;39m##g"
注意 \x1b是转义字符 202007130030更新+1 shell中写正则不带引号锤死你!怪不得[
需要1三个\\\
转义, 带了引号就和普通正则一样处理
但是后来的JVM都不带native2ascii了,所以不能用了;native2ascii
就是把任何编码字符集转换成ascii或者unicode;而-reverse
就是反着的意思;我们原本的需求就是把unicode转换成字符,查的echo -e
也能完成该任务,但是echo
不接受标准输入,通过管道传输无效,于是只能定义变量;新命令为c=``curl 'http://dict-co.iciba.com/api/dictionary.php?w='$1'&key=yourkey&type=json' 2>/dev/null``; echo -e $c | jq -Cr '.symbols[0].parts' | sed -r s:\\{\|\\}\|','::g | sed -r "s#' '*\x1b\\[1;39m\x1b\\[0m\x1b\\[1;39m##g"
-
发现一个好东西可以让计算机读字
spd-say
say
espeak
espeak的中文完全包下载 https://stackoverflow.com/questions/28862807/os-and-spd-say-in-python -
通过脚本让计算机发出声音来:
echo ^G
powershell 中可以直接按 Ctrl+G shell 中先按 Ctrl + V 再按 Ctrl + G,然后又发现了window下各种表情包。。。当然感谢SF了 又看见一个命令tee
vim下:w !sudo tee %
,w
输出buffer到stdin how-does-the-vim-write-with-sudo-trick-work -
coredump的默认目录是
/var/log/
-
某主机上的pip包转移
pip freeze>requirements.txt; pip download -r requirements.txt -d path_to_the_folder
在新环境pip install -r requirements.txt --find-links=path_to_the_folder
问题就在于我的pip太旧了,没有download功能;apt 更新sudo apt-get install --only-upgrade
安装pip3sudo apt install python3-pip
-
安装完MySQL后初始化的一些问题,这种东西,很烦呢!最近安装了个最新版的5.7.31的mysql
mysql --help |grep Distrib
,root密码不知道,遂mysqld_safe --skip-grant-tables
却提示mysqld_safe Directory ‘/var/run/mysqld’ for UNIX socket file don’t exists当然SO:mkdir -p /var/run/mysqld; chown mysql:mysql /var/run/mysqld
然后再mysqld_safe命令就好,改root密码 注意:password变成了authentication_stringupdate user set authentication_string=password('123abc') where user='root';
看博文 注意还要把plugin改为mysql_native_password
,否则只能通过连接socket登录; 原来5.7中是把初始化密码打在了var log日志里,但是很可能找不到这个日志文件;原来简单sudo mysql -uroot
就能登录,安装后默认root用户验证就是通过auth_socket
,它和网上说的unix_socket
是一个东西,mysql会鉴别主机登录的用户和指定的user是不是一个用户,不是则拒绝,本次遇到用sudo mysql
也不能登录时因为不知怎么地起了两个mysql,全部关掉重启就好了;又有个命令sudo mysql_secure_installation
,用来修改任意用户安全配置以提升安全性 -
内存页大小
getconf PAGE_SIZE
-
IP table样板
sudo iptables -t mangle -A POSTROUTING -p tcp --tcp-flags RST,ACK RST,ACK -j DROP
Bingo,如何删除这条规则?
sudo iptables -L -t mangle --line-number
sudo iptables -t mangle --delete POSTROUTING 2
-
curl带客户端证书
curl -k -E path_crt.pem --key path_key.pem
或者在-E后的文件中同时包含CERTIFICATION和PRIVAITE_KEY. 客户端验证证书报错已经提示的很明显了:curl:(58): unable to use client certification (no key found or wrong pass phrase)
是说客户端证书没有key 对应的另一个:curl:(58) unbale to set private key file 'xxx.pem' type PEM
分别从p12文件中取出key和证书
openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys
openssl pkcs12 -in path.p12 -out newfile.key.pem -nocerts -nodes
注意:客户端
java导入证书, cer为PEM格式
keytool -importcert -file certificate.cer -keystore keystore.jks -alias "XXXalias" -storepass changeit
linux导入CA证书
放置到usr/local/share/ca-certificates
并且以.crt结尾 执行sudo update-ca-certificates
然后就会看到文件/etc/ssl/certs/ca-certificates.crt
里有了你的证书 superuser -
mysql下执行shell,
system ls
或者\! bash
, mysql下用户变量set @user_verirable ='abcdefg'
session和全局变量:SELECT @@SESSION.wait_timeout
SELECT @@GLOBAL.wait_timeout
经过修改session变量,测试得默认的@@wait_timeout
是session的变量 -
grep
使用Perl正则 -P, 非贪婪匹配就是?
bash
在处理链接文件时没有追踪链接文件,不管是tab补全还是cd -
delete no ASCII file in linux:
ls -i; rm -f ``ls -i | grep the_inode \``
-
ethtool
查看当前的配置项sudo ethtool -k enp5s0
,修改sudo ethtool -K enp5s0 tso off
-
杀死Java孤儿进程
ps -o pid,ppid,cmd -U ubuntu | grep java | awk -F" " '$2==1 {cmd="kill -9 "$1; system(cmd)}'
注意$1的位置与引号 -
iptables的规则,NAT状态查看
conntrak -L
,分当前活动连接 -
bash for循环和后台
for i in {1..200000}; do echo "curl https://github.com &" | bash ; done
实现访问github -
cut
中的 想要-d
tab 怎么敲? 首先,默认的分隔符就是tab,不用指定;若想指定Ctrl+V
然后按tab就能输入 SF -
markdown中的空格怎么敲? 全角
 
半角
-
- 如何探测远程主机的SSL证书? 可以使用OpenSSL, ubuntu20以下需要安装OpenSSL 1.1.1,所以需要更新;然后可以敲命令
echo | openssl s_client -tls1_3 -connect tls13.cloudflare.com:443
,
|是否支持某一个特定加密套件echo | openssl s_client -tls1_3 -ciphersuites 'TLS_AES_256_GCM_SHA384' -connect tls13.cloudflare.com:443
采集自博客:raymii.org
|查看域名证书:openssl s_client -showcerts -connect www.baidu.com:443
|查看某个域名的Pin SHA256的值:比如bilibiliopenssl s_client -servername www.bilibili.com -connect www.bilibili.com:443 | openssl x509 -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
从命令中可以看出Pin SHA256计算的是公钥的sha256的值,而非证书的(有点乱说了,证书就是一个包含了公钥、公钥签名hash、组织信息的组合体),所以OKHttp(CertificatePinner)中TrustManager(选择性信任的证书)、利用Pin SHA256做证书固定校验不同的东西, 另一个办法是通过ssllab的工具查看 https://www.ssllabs.com/ssltest/analyze.html?d=www.bilibili.com&hideResults=on&ignoreMismatch=on 另外地:stackoverflow回答
|证书的FingerPrint SHA256和Pin SHA256是不同的,前者是证书的sha256 哈希值,后者是公钥的sha256哈希值,我看到都是sha256居然想着在这两者间转化,那么话说回来了怎么把“byte”转成hex字符串,xxd -p
帮助你:在firefox中把证书下载下来,替换首尾shebang和换行符,保存为cert,cat cert | base64 -d |openssl dgst -sha256 -binary | xxd -p
输出的就是Firefox中或windows看到的证书指纹
|如何查看一个pem的信息?把文件后缀改成.cer
,windows中就能打开,或者openssl x509 -in the_pem_file -text -noout
注意看帮助
- 如何探测远程主机的SSL证书? 可以使用OpenSSL, ubuntu20以下需要安装OpenSSL 1.1.1,所以需要更新;然后可以敲命令
-
stat
命令并不能直接看到文件的创建日期(Birth),只能通过debugfs
命令,stat
可以看到atime
,last access time;mtime
上次修改文件内容的时间;ctime
, 修改文件元数据的时间。配合debugfs
可以看到文件创建时间:debugfs -R 'stat <inode>' /dev/sda2
ordebugfs -R 'stat file_ab_path /dev/sda2
SF1 SF2 -
看某个端口的额证书
curl -kviL
-L支持重定向 -k忽略自签证书 -v verbose -i 输出响应头 -
tcpdump指定ip、端口、协议
sudo tcpdump -nni wlp9s0 host 220.181.38.148 and tcp dst port 443
-
原来我这个博文应该叫cheatSheet啊。python的
parser
parser.add_argument('-n', '--build_number', default=0, help='help_msg'
args = parser.parse_args()
if args.build_number== 0: #....
-
java ThreadDump 对比锁信息
egrep -n 'locked|wait for' threaddump > locks
ws=`grep wait locks | grep -oP '\<\S{18}\>'`;for i in $ws; do grep locked locks | grep $i; done
-
rabbitmq 命令行拉去消息
rabbitmqadmin get queue=queue_name requeue=false count=100
-
scp debug can’t open /dev/tty: No such device or address 真实用户 这写的啥?意思是用户为假时会报此错误?
-
一个简单UDP的
echo
程序,mkfifo fifo; cat fifo | nc -ul 1234 > fifo
来自man nc
手册,但是这个只能用于单个UDP连接,即使带了-k
也是不行;另一种方法是用nmap
中带的ncat
:ncat -l 2000 --keep-open --udp --exec "/bin/cat"
,这个支持多连接。 -
产生一个大文件
fallocate -l 1G file_path
dd -if=/dev/zero of=file_path count=1024 bs=1024
-
删除用户密码
passwd -d user
切换过去sudo su - username
-
限制CPU使用
ulimit -t 2
限制CPU时钟周期 或者cpulimit -l 15 -- ls -al
占总共CPU15%(最大到CPU个数*100%) user.slice又忘了? 于是搜索得sudo vim /etc/systemd/system/user-1000.slice
文件 注意sudo sytemctl restart user.slice
会使所有用户进程关闭!我失手了!也忘记了systemctl edit --force user-1000.slice
然后systemctl daemon-reload
即可id
命令可以获得用户ID
[Slice]
CPUQuota=100%
MemoryMax=2G
IOReadBandwidthMax= / 15M
IOWriteBandwidthMax= / 15M
IOReadIOPSMax= / 1024
IOWriteIOPSMax= / 1024
- 全盘搜索文件
locate
非常好使 - 内核在编译的时候打开了哪些开关?
cat /lib/modules/
uname -r
/build/.config | grep CONFIG_SECU‐RITY_YAMA
- ubuntu18以后的版本主机都自带了一个本地DNS,即
systemd-resolve
,这个服务缓存DNS解析结果做多为2小时,当然它是上限,并不会改上游返回的小于2小时的结果,诊断该服务的方法:how-to-troubleshoot-dns-with-systemd-resolved, GitHub源码 main/src/resolve/resolved-dns-cache.c 看这个
/* We never keep any item longer than 2h in our cache */
#define CACHE_TTL_MAX_USEC (2 * USEC_PER_HOUR)
如何修改DNS
-
iptables -S -t nat
列举nat表kubectl describe pods/services xxxx
注:docker中虚假IP都用的iptables做的,所以在宿主机使用netstat
ss
看不到TCP连接,这时候就看上面提到的的conntrak
-
主机太老ubuntu 14.04 上面的python太旧 python3.4,鉴于以前删除后更新引起一些系统服务的故障,不再敢直接更新;于是就想python虚拟环境,不过这个虚拟环境,主机目前安装为3.4能虚拟个3.6出来?不行叭,隔离的应该只是依赖包;于是就想到万能的docker,search pull一气呵成,可是怎么run不起来呢, 看下 logs正常退出,
docker run python python -V
可以看到是3.9.6,那么怎么执行我的脚呢?脚本还要安装依赖啊,用&&
全部追加?这个cassandra driver(最低支持3.5)编译起来还挺慢的. 于是搜得why-docker-container-exits-immediately:docker run python -dit
-d Detached mode: run command in the background. 注意在ubuntu18下运行时顺序应当是docker run -dit python
否则会报错:docker: Error response from daemon: failed to create shim: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: “-tid”: executable file not found in $PATH: unknown. 这已经说得很明显:把dit视为了一个命令,显然不是内核版本不与docker兼容的问题:https://github.com/docker/for-linux/issues/591 -
使用命令打开、关闭WIFI,使用
rfkill
rfkill block 0
-
电脑型号:
cat /sys/class/dmi/id/product_name
PCI设备lspci -nn
目录/etc/modprobe.d
记录了一些阻止加载的module -
docker容器做的非常干净,没有
netstat
来查看进程监听端口怎么办?docker-any-way-to-list-open-sockets-inside-a-running-docker-container step1:docker inspect -f '{{.State.Pid}}' container_name_or_id
, step2:sudo nsenter -t pid -n netstat
说的我pull了一个awvs,但是看日志起来似乎有错,也不知道能不能用,把去dockerhub看日志这个方法给忘了,不知道应该怎么正确启动这个容器:docker-awvs -
openssl 输出
verify return:1
表示验证成功: what-does-verify-return1-mean-in-the-openssl-output -
MySQL 创建用户:
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
-
icdiff
找到一个带颜色的diff工具python3 -m pip install icdiff
,不同之处会用红、绿色标记,精确到字母。 -
daemon daemon --running --pidfile xxx --name xxx
但是实践发现,daemon判断进程是否running并不是只看pid文件中pid是否存在。一般systemctl
执行start时,脚本会先判断是否running. -
WIFI扫描
nmcli dev wifi
https://askubuntu.com/questions/567006/how-can-i-display-the-list-of-available-wifi-networks -
主机扫描
sudo arp-scan -l --interface=wlp3s0
nmap -sP 192.168.0.1/24
-
WSL中安装docker容易把C盘吃完,所以需要清理,强力清除,会删除所有images和volumes
docker system prune -a --volumes
-
yaml文件格式校验
yamllint
Spring指定配置文件夹:-Dspring.config.location
yaml用锚点&
定义变量,用&
引用变量,但是只能在同一个文件中生效;Spring yaml如何定义数组变量并引用呢? -
curl -H "Content-Type: application/json" -d '{}' -b "cookie1=value1" -XPOST https://api.gitihub.com/
ab -c 4 -n 100 -p payload_file_path -T 'application/json' -H "header: value" -rk https://api.github.com
最近发发现ab原来发的是HTTP 1.0协议,通过-v 2
可以看到发送的请求,然而我们k8s使用的enovy并不支持HTTP 1.0,SF上找到一个硬处理:直接全局替换为HTTP 1.1,是MCU的网络实验课的操作方式:sed 's|HTTP/1.0|HTTP/1.1|g' /usr/bin/ab >ab-http11
但是有个bug是请求会超时,读到了reponse还在等;所以换用wrk,发POST需要写在lua脚本里wrk.method = "POST" wrk.body = "foo=bar&baz=quux" wrk.headers["Content-Type"] = "application/json"
wrk -t4 -c20 -d30s -s post.lua https://baidu.com
-
极客时间 通过
execsnoop
通过ftrace
监控进程exec()
系统调用,来追踪短时进程的创建等;CPU使用率高但是top看不到任何高耗进程;1. 看top中CPU使用那一行 2.看正在执行的tasks 3.看top中进程状态为R(run)的;可能的原因:创建的短时进程很快结束;短时进程崩溃重启;所以需要确定父进程行为,即进行进程溯源,谁启动的这个短时进程。 -
github使用token推代码
git push https://<GITHUB_ACCESS_TOKEN>@github.com/<GITHUB_USERNAME>/<REPOSITORY_NAME>.git
-
有时候linux获得的一些数据没有对齐,可以用awk来完成
awk -F, '{printf "%-20s%-15s%-15s%-15s%-15s%-15s%-15s%-15s%-15s%-15s\n", $1,$2,$3,$4,$5,$6,$7,$8,$9,$10}'
awk学习文档 https://www.w3cschool.cn/awk/3ja71k8i.html -
IDEA下载不下来源码:
mvn dependency:sources
https://stackoverflow.com/a/38951545 -
Json在shell下美化:
echo '{"foo": "lorem", "bar": "ipsum"}' | python -m json.tool
how-can-i-pretty-print-json-in-a-shell-script bing搜不到StackOverflow了 -
xargs
gerrit服务器替换,需要批量替换项目下的config文件 xargs来帮忙,xargs怎么代指xargs传过来的参数呢?-1
就行,但是sed替换输出重定向怎么处理,把 -1 用引号引起来;也可直接用sed
的-i
则有ls */.git/config | xargs sed -e -i "s/old-gerrit_domain/new_gerrit_domain"
有同行Blog easyengine -
列举内核加载的所有modules
find /lib/modules/$(uname -r) -type f -name '*.ko'
SF -
ab跑https性能测试时有些问题 1.自签证书 2.颁发有误的SHA256中间证书问题 所以采用httperf,当然如果能下载编译wrk更好
httperf --client=0/1 --server=example.com --port=443 --uri=/readme --rate=100 --send-buffer=4096 --recv-buffer=16384 --ssl --num-conns=50 --num-calls=1000
优快云 -
重新安装内核
sudo apt-get install --reinstall linux-image-5.19.0-50-generic
列举内核dpkg -l | grep linux-image-.*-generic;
安装内核Headerssudo apt install linux-headers-5.19.0-50-generic
查看当前硬件使用的驱动lspci -k
header所在目录/usr/src/
蓝牙命令行工具bluetoothctl
-
mvn 父子模块一个有趣的问题,我们知道子模块通过父模块
dependencyManagement
来继承统一的版本,当子模块dependencies
中没有指定此依赖时则不会依赖;子模块dependencies
指定了hutool-crypt 5.0.3 父模块中dependencyManagement指定了hutool-all 4.0.19(hutool-all实际上也是一个依赖父pom的子工程,父pom里列举了所有hutool modules),最终hutool-crypt 4.0.19
会被加入CLASSPATH,造成编译时一些方法找不到而报错,就看新旧版本谁在前了,造成不稳定。
方法:用maven help:effective-pom
来看最终有效pom,其他排查依赖也可以用此命令;另外IDEA Maven Helper:maven dependency
并不能排查出此问题。
再次遇到同样的问题,项目父pom: spring-boot-starter-parent中定义了jetty.version=11.0.15,而我代码中依赖的是9.4.20.v20190813,导致jetty-utils包中一些类找不到。
这个根本原因是dependencyManagement优先于依赖协调 Dependency management takes precedence over dependency mediation for transitive dependencies 解决办法是覆盖变量版本(properties
)即可,如果父pom没有定义变量那就麻烦了。 -
shell 读文件并操作,加快批处理速度
while read line ; do echo "$line" 2>/dev/null; done < file
-
查看环境变量
printenv
-
Java跑微基准测试要用JMH,不要
System.currentMilliseconds()
-
环境变量是哪里定义的?bash
PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2
zshzsh -xl
SO -
域名解析 查看迭代查询过程:
dig +trace baidu.com
将模拟DNS服务器发进行迭代查询
反向解析:dig +x 1.1.1.1
查看迭代查询过程呢?
host是个很好的工具:查很多记录:host baidu.com
反向域名解析host 1.1.1.1
DNS递归查询和迭代查询并存,更常见的是没有缓存时的迭代查询。 -
tldr man手册太长不看,安装后,
tldr -u
请求github更新db -
终于找到了bash中管道
|
的反向操作符<<<
, md5sum <<< “test”,urlencode
转码python3 -c "import sys; from urllib.parse import unquote; print(unquote(sys.stdin.read()));" <<< "%21%20"
here-stringhere-file
cat <<EOF 还有另一种:<()
bash的magics -
maven递归下载指定依赖,先创建一个pom,示例,然后执行命令
mvn dependency:copy-dependencies -DoutputDirectory=./
命令get
是不能下载指定目录的,而是repository
mvn dependency:get -DartifactId=cglib -DgroupId=cglib -Dversion=3.2.4
-
性能监测
iostat
iotop
vmstat
atop
dstat
nmon
-
shell proxy
export http_proxy="socks5://127.0.0.1:8080"
export https_proxy="socks5://127.0.0.1:8080"
ssh -R 0.0.0.0:8000:remoteserver:8000
把远程端口8000转到本地端口8000,访问本地8000就相当于访问远程8000
ssh -D 6666 -b 0.0.0.0
ssh绑定6666,可以设置代理,转发流量到远程主机,但是这里绑定IP在wsl下有问题,绑不了0.0.0.0