shell 以及 bash
-
命令前加上
bash -x
可以输出命令的执行过程
http://macshuo.com/?p=676 -
terminal 按 tab 补全异常
https://askubuntu.com/questions/545540/terminal-autocomplete-doesnt-work-properly -
rbash
受限制的 bash -
cursor move
Ctrl + [left/right arrow]
move cursor to previous/next word
系统相关
查看 Linux 内核版本和 CentOS 版本
-
查看 CentOS 版本
$ cat /etc/centos-release # 或者 $ cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.2 (Maipo)
-
查看内核版本
$ uname -a Linux dscn3 3.10.0-327.el7.x86_64 #1 SMP Thu Oct 29 17:29:29 EDT 2015 x86_64 x86_64 x86_64 GNU/Linux
-
查看 Ubuntu 版本
$ lsb_release -a
-
查看 CPU 信息
$ lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 8 On-line CPU(s) list: 0-7 Thread(s) per core: 2 Core(s) per socket: 4 Socket(s): 1 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 158 Model name: Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz Stepping: 10 CPU MHz: 1144.681 CPU max MHz: 4100.0000 CPU min MHz: 800.0000 BogoMIPS: 4800.00 Virtualization: VT-x L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 8192K NUMA node0 CPU(s): 0-7 ...
我们可以根据 architecture 来确定下载软件的不同编译版本, 例如 ttyd 的 release 里有很多不同的编译版本: https://github.com/tsl0922/ttyd/releases
用户
-
显示用户
$ cat /etc/passwd
-
删除用户
# remove the user’s home directory and mail spool pass the -r option to userdel $ userdel -r username
-
增加用户
# 增加用户 $ useradd username # 设置密码 $ passwd username
-
修改用户密码
# 修改其他用户密码 sudo passwd <user>
网络与连接
SSH
How To Use SSH to Connect to a Remote Server in Ubuntu
我们用ssh
命令能登录远程服务器,例如:
$ ssh root@123.45.12.145
如果我们只是想测试是否能连通服务器, 用ssh -q user@downhost exit
命令, 如果能连上那么$?
等于 0, 否则等于 255
需要注意的是,ssh 的默认端口是 22,有的服务器设置的端口不是 22,那么连接的时候就需要指定端口,例如:
$ ssh -p 2222 root@123.45.12.145
然后系统会提示输入密码,每次输入密码很麻烦,我们可以这样
$ ssh-copy-id root@123.45.12.145
if we not have key, it will get no identities found error
, because ssh-copy-id
command is copy out host key to remote server, so we need generate key first:
ssh-keygen -t rsa
ssh user@ip command is too long? we can set it to ~/.ssh/config
:
Host car18
Hostname 192.168.2.43
Port 22
User apollo
if you want to connect a inner server in a bulk server which have one server have outer ip, you can config proxyjump in ssh config:
Host car18
Hostname 39.13.13.14
Port 22
User apollo
Host car18-inner
Hostname 192.168.102.10
Port 22
User apollo
ProxyJump car18
some problems:
-
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
参考资料:http://stackoverflow.com/questions/20840012/ssh-remote-host-identification-has-changed
$ ssh-keygen -R <host>
-
连接不上, 没反应
可能是 22 端口没打开, 如何打开端口, 这篇文章里有讲到
-
connection refused
probably openssh-server is not installed on remote server, use this command to check(ubuntu):
dpkg -l | grep openssh-server
if not installed, use this command to install:
sudo apt install openssh-server
-
avoid host authenticity check
first ssh to remote server, it will ask you to confirm the authenticity of the host, you can use this command to avoid this check:
ssh -o StrictHostKeyChecking=no
or you can add this line to
~/.ssh/config
:Host car18 StrictHostKeyChecking no UserKnownHostsFile=/dev/null Hostname 103.61.153.140 Port 6018 User apollo
网络 IP 相关命令
参考资料:http://www.cnblogs.com/kaiye/archive/2013/05/25/3099393.html
-
port occupation progress:
$ lsof -i:<port>
sometimes progress is root, it will not show, so we need sudo to run this command.
-
查看 localhost ip:
$ hostname -I
SCP 文件传输
安装(CentOS):
$ yum -y install openssh-clients
需要相互通信的服务器都要安装
开通端口
Ubuntu
# 查看已经开启的端口
sudo ufw status
# 打开端口
sudo ufw allow <port>
# 开启防火墙
sudo ufw enable
# 重启防火墙
sudo ufw reload
# 再次查看端口是否已开启
sudo ufw status
下载文件
# 下载到当前路径
wget http://www.domain.com/filename-4.0.1.zip
# 指定路径和文件名
wget -O filename.zip http://www.domain.com/filename-4.0.1.zip
curl 请求
curl post 请求
curl -X POST -H "Content-Type: application/json" -d '{"date": "2022-08-03", "car_id_list": ["white-rhino-013"]}' http://192.168.199.102:8802/api/case/
net status
nethogs command is useful:
sudo apt install nethogs
sudo nethogs -s
about file
mv file
mv file1 file2
move and overwrite
mv -f file1 file2
查找文件
-
which 查找可执行文件,根据可执行文件的文件名。例如:
$ which mysqld
-
查找路径下包含某内容的文件
# 在当前路径下查找包含content的文件 $ grep -r "content" .
-
在当前路径下根据文件名查找文件
find . -name app.bundle.js
file display
-
list file with date sort
ll -t .
-
查看文件的全部内容
$ cat app.py
-
如果你只想看文件的前 5 行,可以使用 head 命令,如:
$ head -5 app.py
-
如果你想查看文件的后 10 行,可以使用 tail 命令,如:
$ tail -20 /etc/passwd
-
参数-f 使 tail 不停地去读最新的内容,这样有实时监视的效果
$ tail -f /var/log/messages
-
查看某文件是否包含特定字符串
$ grep "string" /path/to/file $ echo $? # 0表示包含,1表示不包含
archive & unarchive
-
tar
The Linux “tar” stands for tape archive, which is used by large number of Linux/Unix system administrators to deal with tape drives backup. The tar command used to rip a collection of files and directories into highly compressed archive file commonly called tarball or tar, gzip and bzip in Linux. The tar is most widely used command to create compressed archive files and that can be moved easily from one disk to another disk or machine to machine.
-
args
x – extract 释放
v – Verbosely show the .tar file progress 显示解压过程
f – File name type of the archive file 使用档案文件或设备,这个选项通常是必选的
C – specified directory 指定路径
z – if archive file is compressed with gzip, then use this argument
-
unzip
# unzip to current path $ tar -xvf public_html-14-09-12.tar # unzip to specified path $ tar -xvf public_html-14-09-12.tar -C /home/public_html/videos/
args:
--strip-components 2
去掉前两层路径. 例如有的压缩结果有多层文件夹, 前两层文件夹可能是无用的. -
zip
# zip file $ tar -zcvf public_html-14-09-12.tar.gz public_html
-
路径
-
mkdir
# 创建多层级路径 $ mkdir -p /home/work/bin/ksxing-web
-
查看路径下的全部内容,并 exclude 某路径
# 查看当前路径下的所有文件,并不查看venv这个路径 $ find . -path ./venv -prune -o -print
磁盘
- 查看路径挂载在哪个磁盘下
# df -h再加上路径 $ df -h /tmp Filesystem Size Used Avail Use% Mounted on /dev/sde2 439G 21G 395G 6% /
创建随机临时文件
# 创建临时文件
$ mktemp
/tmp/tmp.aJuVf0ftIo
# 创建临时文件夹
$ mktemp -d
/tmp/tmp.3iwExbjajN
获取当前路径下某文件的完整路径
readlink -e <filename>
根据文件路径获取文件名
basename <path>
preview image
feh https://feh.finalrewind.org/
check two file is same
md5sum file1.txt
md5sum file2.txt
进程
查看网络状态
$ netstat -pln
$ netstat -pln|grep python
重新读取配置文件并重启
一个进程, 我们修改了配置文件, 但是不想关闭它然后再启动, 想无缝重启, 那么可以用:
kill -HUP <pid>
pid 怎么获取呢? 可以用ps aux | grep <name>
, 也可以去读取其 pid 文件, 例如 supervisord 的 pid 文件一般是在/tmp
下, 那么可以:
kill -HUP `cat /tmp/supervisord.pid`
权限
无法 cd 到某些路径,Permission Denied
http://unix.stackexchange.com/questions/320011/permission-denied-cd-into-directory
$ chmod go+rx /dir
更改文件的用户
ll
可以看到文件的用户和组信息, 如果是 root 用户, 权限较高, 可能某些场景下会有问题.
我们可以修改成当前用户:
sudo chown -R max:max /data/product
文件权限
用ll
查看文件详细信息
$ ll
-rwxrwxr-x 1 yangle yangle 5.9M 8月 7 16:51 access*
drwxr-xr-x 15 yangle yangle 4.0K 7月 21 13:52 apollo/
...
第一列就是文件的类型和权限信息, 第一个字符-
代表文件, d
代表文件夹. 后面还有 3*3 = 9 个字符, 第一组 3 个字符是 owner 的权限, 第二组 3 个字符是 group 的权限, 第三组 3 个字符是 other 的权限. r
代表读, w
代表写, x
代表执行.
如果我们需要增加一个文件(例如上面的 access 文件)的执行权限, 可以用chmod
命令, 如:
chmod +x access*
another example:
sudo chmod 600 ××× (只有所有者有读和写的权限)
sudo chmod 644 ××× (所有者有读和写的权限,组用户只有读的权限)
sudo chmod 700 ××× (只有所有者有读和写以及执行的权限)
sudo chmod 666 ××× (每个人都有读和写的权限)
sudo chmod 777 ××× (每个人都有读和写以及执行的权限)
进程
screen
screen 和 tmux 类似, 可以脱离 shell 运行程序, 不受 shell 退出的影响
# dmS后台运行并指定一个名字, 后面再加上命令
$ screen -dmS myscreen python -m SimpleHTTPServer 8080
回到这个进程可以用
$ screen -xS myscreen
日期
时间戳转换为日期
$ date -d @123456789
Wed Dec 31 19:00:00 1969
bash
bash -x [command]
可以打印出命令执行的详细信息
ldd [command]
可以查看命令依赖的库
grammar
-
&&
and||
and;
$ false || echo "Oops, fail" Oops, fail $ true || echo "Will not be printed" $ $ true && echo "Things went well" Things went well $ false && echo "Will not be printed" $ $ false ; echo "This will always run" This will always run