Linux command

shell 以及 bash

参考书:Linux 命令行与 shell 脚本编程大全


系统相关

查看 Linux 内核版本和 CentOS 版本

  1. 查看 CentOS 版本

    $ cat /etc/centos-release
    # 或者
    $ cat /etc/redhat-release
    Red Hat Enterprise Linux Server release 7.2 (Maipo)
    
  2. 查看内核版本

    $ 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
    
  3. 查看 Ubuntu 版本

    $ lsb_release -a
    
  4. 查看 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

    Tar Command Examples in Linux

    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