常用shell命令

1,327 阅读9分钟

Linux界两大主流:RPM与DPKG

RedHat系列:Redhat、Centos、Fedora

  • 常见的安装包格式rpm,安装rpm包的命令是”rpm -i *.rpm“
  • 包管理工具yum

Debian系列:Debian、Ubuntu

  • 常见的安装包格式deb,安装命令是"dpkg -i *.deb"
  • 包管理工具apt

APT

常用apt命令:

# 更新软件包列表
apt-get update
# 安装一个新的软件包
apt-get install <packagename>
# 卸载一个已安装的软件包(保留配置)
apt-get remove <packagename>
# 卸载一个已安装的软件包(不保留配置文件)
apt-get --purge remove <packagename>
# 将已经卸载了的软件包的.deb安装文件从硬盘中删除
apt-get autoclean
# 将已经卸载和没有卸载的软件包的.deb安装文件从硬盘删除
apt-get clean
# 删除为了满足其它软件包的依赖而安装的,但是现在不需要的
apt-get autoremove
# 升级所有软件
apt-get upgrade

Ubuntu

  1. 显示行号

    sudo vim /etc/vim/vimrc
    # 添加
    set number
    
  2. scp

    # 本地 --文件--> 远程
    # 本地 --公钥--> 远程
    # 拷贝文件
    scp <file> ubuntu@172.16.0.1:/home/ubuntu/
    # ssh连接
    ssh ubuntu@172.16.0.1
    

注意:命令行yes/no的时候,不要直接回车,应输入yes回车。

  1. 安装mysql

    sudo apt-get install mysql-server-5.7
    # 开启外网访问 # bind 127.0.0.1
    sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
    # 开启/关闭/重启
    sudo service mysql start/stop/restart
    
    # 允许远程访问
    use mysql;
    update user set host="%" where user="root";
    flush privileges;
    
  2. 安装rabbitmq

    # 安装erlang
    sudo apt-get install erlang
    # 查看erlang版本
    erl
    # 安装rabbitmq
    sudo apt-get install rabbitmq-server
    # 查看rabbitmq版本
    sudo rabbitmqctl status | grep rabbit
    
    # 启动/停止/重启
    sudo service rabbitmq-server start/stop/restart
    # 添加用户
    sudo rabbitmqctl add_user 用户名 密码
    # 给予用户管理员权限
    sudo rabbitmqctl set_user_tags 用户名 administrator
    # 为用户设置读写权限
    sudo rabbitmqctl set_permissions -p / 用户名 "." "." ".*"
    
    
  3. 安装redis

    # 安装redis
    sudo apt-get install redis-server
    # 启动/停止/重启
    sudo service redis-server start/stop/restart
    # 修改配置
    sudo vim /etc/redis/redis.conf
    # 开启远程访问
    # bind 127.0.0.1
    # 修改密码
    requirepass xxx
    
    
  4. 启动jar包

    nohup java -jar xxx.jar > ./nohup.out 2>&1 &
    
  5. 解压zip

    # 解压到指定目录
    unzip -d 指定目录 xxx.zip
    
  6. 安装Node环境

    Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎。

    安装nodejs:

    curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
    sudo apt-get install -y nodejs
    

    NPM是nodejs的包管理工具,新版的nodejs已经集成了npm。npm相关命令:

    # npm查看版本
    npm -v
    # npm升级
    sudo npm install npm -g
    # npm安装模块,-g表示全局安装,不带-g会安装在./node_modules下
    sudo npm install -g <Module Name>
    # 更新模块
    sudo npm update <Module Name>
    # 卸载模块
    sudo npm uninstall <Module Name>
    # 发布模块?
    sudo npm publish
    

    www.jianshu.com/p/f2592d106…

  7. ubuntu 16.04添加开机自启脚本

    /etc/rc.local中添加启动命令

    # 脚本文件为/ubuntu/home/script/mount.sh
    ./ubuntu/home/script/mount.sh
    
  8. Ubuntu增加账号密码登录方式

    云服务器一般使用公钥方式登录,有时候需要以账号密码方式时,需要增加这种登录方式。比如提供给云厂商客服解决工单问题的时候。

    1. 首先查看当前登录用户:

      who
      
    2. 为用户创建密码:

      # sudo useradd elastic 增加用户
      sudo passwd ubuntu # ubuntu是账户名
      # 输入并确认密码
      
    3. 修改sshd配置

      sudo su
      vi /etc/ssh/sshd_config
      
      # 修改2处
      PermitRootLogin yes # 允许root账户登录
      PasswordAuthentication yes # 允许密码登录
      
    4. 重启sshd服务

      sudo service ssh restart
      

常用命令

top

top中一些字段的含义:

  • 内存

    • VIRT:virtual memory usage,虚拟内存

      进程需要的虚拟内存大小

    • RES:resident memory usage,常驻内存

      进程当前使用的内存大小,不包括swap out

    • SHR:shared memory,共享内存

      某个进程所占物理内存:RES-SHR

    • DATA:数据占用的内存

  • CPU

    • us:user,运行(未调整优先级的)用户进程的CPU时间
    • sy:system,运行内核进程的CPU时间
    • ni:niced,运行已调整优先级的用户进程的CPU时间
    • wa:IO wait,用户等待IO完成的CPU时间
    • hi:处理硬件中断的CPU时间
    • si:处理软件中断的CPU时间
    • st:这个虚拟机被hyperversor偷去的CPU时间

top -Hp [进程ID]

iostat(-x)

  • tps:该设备每秒的传输次数
  • kB_read/s:每秒从设备读取的数据量
  • kB_wrtn/s:每秒向设备写入的数据量
  • kB_read:读取的总数据量
  • kB_wrtn:写入的总数据量
  • rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(相同Block的读取请求会Merge)
  • wrqm/2:每秒这个设备相关的写入请求有多少被Merge了
  • await:每个IO请求处理的平均时间(ms)
  • %util:在统计时间内所有处理IO时间,储以总共统计时间。表示设备的繁忙程度。

vim

替换字符串

[range]s/s1/s2/[option]

  • [range]表示检索范围,缺省值为当前行
    • 1,10表示第一行到第10行
    • %表示整个文件,同1,$
    • .,$表示当前行到文件尾
  • s为替换命令
  • s1为要被替换的串,s2为替换的串
  • [option]表示选项
    • /g表示整行
    • /c表示每次替换之前需要确认
    • 缺省时仅对每行第一个匹配串进行替换

判断

-e 判断对象是否存在
-d 判断对象是否存在,并且为目录
-f 判断对象是否存在,并且为常规文件
-L 判断对象是否存在,并且为符号链接
-h 判断对象是否存在,并且为软链接
-s 判断对象是否存在,并且长度不为0
-r 判断对象是否存在,并且可读
-w 判断对象是否存在,并且可写
-x 判断对象是否存在,并且可执行
-O 判断对象是否存在,并且属于当前用户
-G 判断对象是否存在,并且属于当前用户组
-nt 判断file1是否比file2新 [ ``"/data/file1"` `-nt ``"/data/file2"` `]
-ot 判断file1是否比file2旧 [ ``"/data/file1"` `-ot ``"/data/file2"` `]

MD5

Linux: md5sum filename

Windows: certutil -hashfile filename MD5

ssh

ssh-keygen -t rsa

ls

ls -lh查看文件信息,h表示将文件容量以人类易读的方式展示

正则表达式

元字符含义
^匹配行首
$匹配行尾
^$表示空行
.匹配一个任意字符
*匹配0或多个任意字符
\转义元字符
[]匹配括号内的字符

grep

grep擅长查找过滤。

语法:grep [OPTIONS]... PATTERN [FILE]...,FILE是要搜索的文件,OPTIONS如下。

OPTIONS

  • 正则说明类:

    简写全称含义/用法
    -E--extended-regrexp使用ERE,扩展正则表达式语法
    -F--fixed-strings使用固定字符串
    -G--basic-regexp使用BRE,基本正则表达式语法
    -e--regexp=PATTERN使用BRE,基本正则表达式语法
    -f--file=FILE指定文件内容作为正则,文件中每行为一个正则
    -i--ignore-case忽略大小写
    -w--word-regexp匹配整个单词
    -x--line-regexp匹配整行
  • 其它:

    简写全称含义/用法
    -v--invert-match匹配不含指定正则的行
  • 输出控制:

    简写全称含义/用法
    -n--line-number打印行号
    -o--only-matching仅显示正则匹配到的字符串
  • 上下文控制:

    简写全程含义/用法
    -B--before-context=NUM打印前NUM行
    -A--after-context=NUM打印后NUM行
    -C--context=NUM打印前后NUM行
    -NUM-NUM打印前后NUM行

常用-v, -n, -w。

sed

sed擅长取行和替换。sed全称是Stream EDitor,流编辑器。

语法:sed [OPTION]... [动作] [input-file]...

OPTION:

简写全称含义
-n--quiet或--silent安静模式,只有经过sed特殊处理的行或操作才会列出来
-e script--expression=script直接在命令行模式上进行sed的动作编辑
-f script-file--file=script-file直接将sed的动作写在一个文件内,-f执行文件内的sed动作
-r--regexp-extended使用扩展的正则表达式
-i[SUFFIX]--in-place[=SUFFIX]直接读取和修改文件而不是输出到屏幕

动作

[n1[,n2]]function

  • n1,n2表示进行动作的行范围。

  • function有下面这些参数:

    参数含义/用法
    a新增,a的后面可以接字符串,这些字符串会在新的一行出现(目前的下一行)
    cc的后面可以接字符串,这些字符串可以替换区间[n1,n2]的行
    dd后面不带参数
    ii的后面可以接字符串,这些字符串会在新的一行出现(目前的上一行)
    p也就是将某个选择的数据打印出来,通常p会与参数sed -n一起运行,例如:sed -n '5,7p'
    s替换,可以直接进行替换的工作,通常可以搭配正则表达式,例如:1,20s/old/new/g

awk

awk擅长取列。awk得名于其三个创始人的姓氏首字母。

语法:awk '条件类型1{动作1} 条件类型2{动作2}...' filename,动作外的大括号不能省略。

内置变量:

变量名属性
$0当前记录
$1-$n当前记录的第n个字段
FS输入字段分隔符,默认一个或多个空格
RS输入记录分隔符,默认换行
NF当前记录中的字段数,就是有多少列
NR已经读出的记录数,就是行号,从1开始
OFS输出字段分隔符,默认空格
ORS输出记录分隔符,默认换行

例子:

# test文件内容
a  :b::c
awk -F[" ":]+ 'print NF"\t"$1"\t"$2"\t"$3'
# 输出
3	a	b	c

抓包

使用tcpdump抓包,在windows wireshark图形界面上查看。

# 直接输出
tcpdump tcp port 80 -n -X -s 0
# 输出文件
tcpdump tcp port 80 -n -s 0 -w ./tcp.cap
# 结合管道流
tcpdump tcp port 80 -n -s 0 -X -l |grep xxx

Ubuntu下安装jdk

版本:

cat /etc/issue
Ubuntu 16.04.1 LTS \n \l

通过PPA源安装

PPA(Personal Package Archives):个人软件包文档。所有PPA都是寄存在Canonical公司的launchpad.net网站上的,只有Ubuntu用户可以用。类似于maven的中央仓库坐标,可以去launchpad.net上面搜软件获取安装命令。

添加源:
add-apt-repository ppa:xxx/xxx
更新系统源:
apt-get update
安装软件:
apt-get install xxx

通过PPA源安装open jdk

安装命令

sudo su
add-apt-repository ppa:openjdk-r/ppa
apt-get update
apt-get install openjdk-8-jdk

切换jdk版本

update-alternatives --config java
update-alternatives --config javac

卸载

apt-get remove openjdk*

通过PPA源安装oracle jdk

由于oracle修改了JDK许可证,通过ppa:webupd8team/java的方式就已经过时不可用了。

下载并安装Jdk

在WINDOWS上下载jdk叭,再传到ubuntu主机上。

解压在/usr/local/java/下。

环境变量:

export JAVA_HOME=/usr/local/java/jdk1.8.0_221
export PATH=$JAVA_HOME/bin:$PATH

# 生效环境变量
source /etc/profile

建议在/etc/profile.d下新建jdk.sh,然后将环境变量放进去。

/etc/profile , /etc/profile.d ,~/.bashrc, ~/.bash_file的区别:

~/.bashrc, ~/.bash_file这两个看到~这个符合,应该明白,这是宿主目录下的,即里面的环境变量也叫shell变量,是局部的,只对特定的shell有效,修改过别忘了source 命令一下。

   /etc/profile , /etc/profile.d,前面的是文件,后面一看也就明白.d表示目录, /etc/profile里面的变量是全局的,对所有用户的shell有效。

JDK 1.6之后不需要配CLASSPATH。