难以忘记
Bash Shell 命令
命令补全符和通配符:
- 输入文件前几个字符时,按下 tab 会自动补全文件,按两下 tab 会给出所有相符的文件;
- " * " 用于匹配文件名中任意长度的字符串,而类似的?只匹配一个字符;
- " [ ] " 用于匹配所有出现方括号的字符,也可以使用短线 - 来匹配范围。
列出目录内容:dir 和 vdir
windows 用的比较多。在 linux 中,dir 类似 ls,但比 ls 功能少。 vdir 相当于 ls -l 命令,默认列出文件和目录的完整信息。
查看文本文件:cat 和 more
cat 用于查看文本文件内容,后跟文件名作为参数。可以跟多个文件名作为参数,也可以使用通配符,cat 提供了 -n 选项显示行号。
cat 命令的缺陷是一次会显示文件内的所有内容,对于大文件来说,cat 命令的这个缺陷越明显。所以,linux 提供了 more 命令来分页显示文件内容。空格 或 F 向下翻页,B 向上翻页,enter 向下滚动一行,Q 退出。
阅读文件的开头和结尾:head 和 tail
可以用 -n 参数指定显示行号。可以指定多个文件名。
更好的文本阅读工具:less
搜索,键入 “/” 跟上要查找的内容,如果要再次查找相同的内容,键入 “/”,按下 enter 就可以了。
“ -M ” 参数会在底部显示文件名、行号、总行数、百分比。
查找文件内容:grep
用法:grep 关键词 文件名。可跟多个文件名。
查找文件:find
用法:find 路径 -name 名字 ;默认当前路径,默认标准输出 -print。参数 -type 可指定 文件类型。可使用命令 man find 查看 find 详情。
更快速的文件定位:locate
locate 命令没有进入到子目录搜索,而是通过检索文件名数据库来确定文件位置,locate 命令自动建立整个文件名数据库,updatedb 命令可以立刻生成该数据库文件的最新版本。
终端启动程序
如,
$ firefox
后台启动
$ firefox &
查找特定程序:whereis
-b 参数指定只查找这个程序的二进制可执行文件;如果whereis 无法找到文件,将会返回一个空串。
用户及版本信息查看
who 查看当前系统有哪些用户登录,工作在哪个工作台上:
whoami,当前是哪个用户:
uname 显示当前系统版本信息。带 -a 参数选项会给出当前系统所有有用信息:
-r 参数选项显示系统内核版本信息:
寻求帮助:man 命令
获取命令简介:whatis 和 apropos
whatis 获取命令简介;
apropos 根据命令简介的某一关键词查找相关命令;
文件目录管理
建立文件和目录:mkdir
mkdir 目录名。可指定多个目录名,即一次性创建多个目录。
-p 选项提供创建多级目录,如:
建立一个空文件:touch
touch 亦可更新文件的建立日期和时间,文件内容不变。
移动和重命名:mv
用 mv 移动一个文件到一个目录中,如果该目录中存在相同的文件名文件,则该文件会被移动的文件所覆盖。-i 选项增加提示信息,-b 选项会直接在目标目录中的同名文件后面加~,避免覆盖。
复制文件和目录:cp
提供 -i 、-b 选项类似 mv,同时 cp 命令在执行复制任务时会自动跳过目录,为此,可以使用 -r 选项将子目录和文件一起复制到目标目录中。
删除目录和文件:rmdir 和 rm
rmdir 用于删除目录,但删除目录前需要将目录下的文件和子目录删除;
rm 用于删除目录或文件,可同时删除多个文件,匹配通配符*,-i 参数增加提示信息,-f 参数 不作确认提示。 -r 递归删除目录下所有文件及其子目录。
改变文件所有权:chown 和 chgrp
chown [options] user [:group] file...
修改文件所有者和组别。可以只改变文件的所有者如:chown username filename
,也可以只改变文件的组别:chown :groupname filename
,可同时更改所有者和组别:chown username:groupname filename
。-R 参数 递归地修改目录及其下面内容的所有权。
chgrp groupname filename
chgrp 提供更改文件的组别,同样提供 -R 参数。
改变文件权限:chmod
这个命令使用“用户组+/-权限”的方式来增加/删除相应权限,而用户组包括文件所有者(u),文件属组(g),其他人(o),和所有人(a),权限不必多说,如:chmod u+x filename
chmod a-x filename
。
还可以通过“用户组=权限”的规则来设置文件权限,如:chmod ug=rx,o=r filename
。
亦可以通过“用户组=用户组”的规则来设置文件权限,如 chmod o=u filename
。
在文件之间建立连接:ln
ln [options] source [dest]
ln [options] source...directory
如建立软链接,需要带上 -s参数,ln -s TARGET LINK_NAME
,链接建立后,删除源文件等于软连接失效。
还有一种链接称为硬链接,即不带 -s 参数,链接建立后,两个文件是完全独立的文件,因为硬链接的存在,修改其中一个会同时影响到两个。
输入输出重定向:
输出重定向:> 、 >>
输入重定向:<、<<
操作符 < 可以让程序从文件中获取输入。
操作符 << 被称为立即文档,明确告诉 shell 从键盘接收输入,并可以自定义结束输入的分隔符。
输入重定向应用不多。
管道符:|
软件包管理
常用的软件包格式有两种:RPM,即 Red-Hat Package Manager;另一种是 Debian 和 Ubuntu 上使用的 .deb 格式。
管理 .deb 软件包:dpkg
管理 RPM 软件包:rpm
高级软件包工具:apt
即 Red-Hat Package Manager,是Debian及其派生的Linux软件包管理器。APT可以自动下载,配置,安装二进制或者源代码格式的软件包,因此简化了Unix系统上管理软件的过程。APT最早被设计成dpkg的前端,用来处理deb格式的软件包。现在经过APT-RPM组织修改,APT已经可以安装在支持RPM的系统管理RPM包。
$ apt-get update ##更新当前 apt-get 缓存中的软件包信息
$ apt-cache search keyword ##查找包含keyword关键词的软件包,用于查找软件包名。进而卸载。
配置 apt-get
- 安装源配置:
/etc/apt/sources.list
从源代码编译软件
首先下载解压源代码,其次配置软件:
然后编译:make
,
最后安装软件:make install
。
磁盘管理
挂载文件系统:mount
在启动的时候挂载文件系统:/etc/fstab 文件
卸载文件系统:umount
查看磁盘使用情况:df
检查和修复文件系统:fsck
在磁盘上建立文件系统:mkfs
$ mkfs -t ext4 /dev/vda1 ##格式化/dev/vda1,格式化即建立文件系统的过程
如果硬盘分区已挂载到文件系统,那么格式化之前必须用 umount 命令卸载该分区。
压缩文件:gzip
压缩文件:$ gzip filename
解压文件:$ gunzip filename
或者 :$ gzip -d filename
。支持的文件类型有:.gz、.Z、-gz、.z、-z和z。
-l 参数用于压缩效果。$ gzip -l filename
。
-t 参数用于测试压缩文件完整性,如果压缩文件正常,不会有任何输出。可以与 -v 结合使用。
更高的压缩率:bzip2
用法参数等同于 gzip。支持的文件类型有:.bz2、.bz、.tbz2、.tbz、bzip2
RAR 文件
windows 下标准压缩格式,压缩效果比 zip 更好。Linux 下需要下载 RAR For Linux。
解压缩命令:$ rar x filename
。其他命令可参考文档。
文件打包:tar
常用参数:
$ -c ## --create 建立新的文档,即压缩
$ -x ## --extract, --get 从存档展开文件,即解压
$ -f ## --file [HOSTNAME:]F 指定存档或设备 (缺省为 /dev/rmt0)
$ -w ## --interactive, --confirmation 每个操作都要求确认
$ -z ## --gzip, --ungzip 用 gzip 对存档压缩或解压
$ -j ## --bzip2 调用 bzip2 程序解压、压缩
$ -v ## --verbose 详细显示处理的文件
eg:将some目录压缩为gz文件:$ tar -zcvf some.tar.gz some/
,
等同于:
$ tar -cvf somea.tar some/
$ gzip some.tar
解压gz文件:$ tar -zxvf some.tar.gz
,
等同于:
$ gzip -d some.tar.gz
$ tar -xvf some.tar
tar 命令参数前的 “-” 可以省略。
转移文件:dd
转换和拷贝文件
常用参数:
if=file 从 file 中读而不是标准输入。
of=file 写到 file 里去而不是标准输出。除非指定 conv=notrunc ,否则, dd 将把 file 截为O字节(或由 seek= 选项指定的大小)
eg:$ dd if=/dev/cdrom of=CD.iso ## if指定输入端,of指定输出端,该命令将一张 CD 完整的转为 iso 镜像文件
。
安装硬盘和分区:fdisk
用于在一块硬盘上建立逻辑分区。
不要在当前硬盘试用,会完整的删除整个系统。
使用 mkfs 建立 ext3fs 文件系统
建立完分区之后,就需要在各个分区系统建立文件系统,即格式化分区。
eg:$ mkfs -t ext4 /dev/sdb1
使用 fsck 检查文件系统
$ fsck -f /dev/sdb1 ## -f 强制执行
测试分区
即将新建立的文件系统挂载到相应的目录下。
$ mkdir /web
$ mount /dev/sdb1 /web
$ df /web
用户与用户组管理
添加用户:useradd 和 groupadd
- useradd:创建一个新用户或更新默认新用户信息,不指定 -g 会默认创建一个同名用户组,可用:
$ groups xxx
查看用户所属组,常用参数:
$ -g ## --gid GROUP 用户初始登陆组的组名或号码。组名必须已经存在。组号码必须指代已经存在的组。
$ -m ## --create-home 为用户创建主目录。不带此参数,用户可以登录shell但不能登录图形化界面。
$ -p ## --password
$ -U ## --user-group 创建一个和用户同名的组,并将用户添加到组中。
$ -s ## 指定用户登录后使用的 shell,默认sh,sh是一个指向/bash/shell的软链接。
- passwd:更改密码。
- groupadd:创建一个新组。
记录用户操作:history
查看历史 shell命令,eg:$ history 10
直接编辑 passwd 和 shadow 文件
linux 一切基本配置命令最终会反映到配置文件中,所有的用户信息都会保存到 /etc/passwd,而用户密码则会保存到 /etc/shadow。修改需要 root 权限。
/etc/passwd 文件如下:
每一行由七个字段组成,字段间使用冒号分隔。各字段的含义如下:
- 登录名;
- 口令占位符,即密码;
- 用户UID;
- GID;
- 用户的私人信息,包括全名、办公室、电话等;
- 用户主目录;
- 登录shell;
/etc/shadow 文件如下:
各字段释义类似 /etc/passwd,以冒号分隔:
- 登录名
- 加密后的口令
- 上次修改口令的日期
- 两次修改口令之间的天数(最少)
- 两次修改口令之间的天数(最多)
- 提前多少天提醒用户修改口令;
- 在口令过期后多少天禁用该用户;
- 账户过期日期;
- 保留,目前为空;
删除用户:userdel
$ userdel xxx ## 默认只会删除用户,不会删除用户主目录,可使用 -r 参数同时删除其主目录。
管理用户账户:usermod
同 useradd 一样,可通过更改配置文件 /etc/passwd,/etc/shadow,/etc/group 实现 usermod 效果。
查看用户信息:id
用于查看 UID 和 GID 及所属组:
用户切换:su
用于切换 shell 用户,eg:
$ su ## 不带参数默认切换到 root
$ su xxx 切换到xxx
受限的特权:sudo
初次使用需要用户输入自己的密码,一段时间没有再次使用(默认5分钟),需要再次输入。
没有权限可配置 /etc/sudoers 指定用户可以执行特权命令。
第一个 All 代表在任何机器上,第二个代表任何用户,第三个代表任何命令。
/etc/group 文件
各字段含义:
- 组名
- 组口令占位符
- GID;
- 成员列表,用逗号隔开。
进程管理
setuid
setuid 程序是能够在运行时临时以其他用户身份(通常是root)执行操作的程序。
监视进程:ps 命令
ps 有不同选项参数,有适应 UNIX、BSD、GUN 等选项参数,可以随意混合使用不同类型的选项,但是可能会出现冲突。
ps 常用参数:
$ -A ## 选择所有进程。与-e相同
$ -e ## 选择所有进程。与-A相同
$ -a ## 显示一个终端的所有进程,除了会话引线
$ -p ## 选择所有进程。显示父ID,与p和--pid相同。
$ -u ## 列出进程用户,userlist
$ -f ## Do full-format listing.
eg:
打印所有用户的运行进程:
$ ps aux ## a 显示所有用户的进程 u 显示进程的所有者 x 显示非终端启用的进程
显示所有进程信息:
$ ps -A
显示指定用户所有进程:
$ ps a -u root
显示所有进程信息,连同命令行:
$ ps -ef
$ ps aux
将目前属于您自己这次登入的 PID 与相关信息列示出来:
$ ps -l
列出类似程序树的程序显示:
$ ps -axjf
输出指定的字段:
$ ps -o pid,ppid,pgrp,session,tpgid,comm
即时跟踪进程信息:top
默认10s 更新一次。
查看占用文件的进程:lsof
即查看某一文件是否被进程占用:$ lsof filename
向进程发送信号:kill
用法:$ kill [-ssignal|-p] [-a] pid...
kill 给指定进程发送指定信号. 如果没有指定信号, 则发送 TERM 信号. TERM 信号会杀死不能俘获该信号的进程. 对于其他进程, 可能需要使用 KILL (9) 信号,因为该信号不能够被俘获.
常用信号量:
KILL 信号量永远不会被程序捕捉,可以用于杀死进程。
调整进程的谦让度:nice 和 renice
nice 可以在程序启动时调整其谦让度,高谦让度意味着低优先级,谦让度的值范围在 -20~19 之间。
常用参数:
$ -n ##--adjustment=N add integer N to the niceness (default 10) 增量谦让度,默认10
eg:
$ nice -n 2 bc ## 以谦让度增量2启动 bc是一个计算程序
$ nice -n -2 bc ## 以谦让度增量-2启动
$ nice bc ## 不带n默认以谦让度增量10启动
与之对应的是 renice 可以在程序运行时调整其谦让度,eg:
$ renice +12 -p 5555 ## -p 指定进程号,将xxx程序谦让度调整为12
所谓谦让度增量是指 nice 命令将 -n 参数后面的数值加上默认谦让度值,作为的程序的谦让度值。nice 调整的是**“相对”谦让度**,renice 调整的是**“绝对”谦让度**。nice 命令可查看默认谦让度的值。
/PROC 文件系统
/PROC 存放着内核有关系统状态的各种意义的信息。在系统运行的时候,内核会随时向该目录写入数据,ps 和 top 就是从该目录读取数据的。
如下,数字存放的是对应pid进程信息。
网络管理
ifconfig 和 route
ifconfig 用于配置网络接口;route 用于配置静态路由。
文件传输:FTP
可使用 FTP 工具,也可使用 FTP 命令。
基于 SSH 的文件传输:SFTP 和 SCP
SFTP 和 SCP 是基于 SSH 的文件传输,加密的数据传输协议。在安全性要求较高的场合,应该尽可能使用 SFTP 代替传统的 FTP。
SFTP 命令用法类似与 FTP,常用命令如下:
eg:
利用 ssh 通道复制文件:SCP
下载:
$ scp txcloud:~/npp.7.8.1.Installer.x64.exe . ## txcloud == root@xx.xx.xx.xx
上传:
$ scp npp.7.8.1.Installer.x64.exe txcloud:/app
使用 SSH 密钥:更便捷的 SSH 连接
大致方案如下:
- 有一对互相匹配的密钥文件
- 本地保存私钥副本
- 服务器保存公钥
- 建立 ssh 连接时检查公私钥的匹配性
具体实现如下:
生成密钥对
$ ssh-keygen -t rsa ## 该命令会在用户主目录 .ssh 目录下生成两个文件。
复制公钥到服务器
将公钥复制到远程服务器,并放在用户主目录下 .ssh 目录下 authorized_keys 文件中,具体如下:
访问
$ ssh username@xx.xx.xx.xx ## 不再需要输入用户口令
Linux 编程
Vim 编辑器
一些快捷键:
- H、J、K、L 分别代表向左、向上、向下、向右。
- 小写 o 在所在行下一行插入、大写 O 在所在行上一行快速插入。
- vim 搜索,
/keyword ## 向后搜索 ?keyword ## 向前搜索 n 可快速查找下一个结果 :set ignorecase ## 搜索忽略大小写 :set noignorecase ## 搜索开启大小写敏感
- 替换字符串
eg:替换命令的完整语法::[range]s/pattern/string/[c,e,g,i] ## 将范围 range 中的符合 pettern 的字符串替换为 string; 其中 range 用法,"1,4" 代表一到四行,"1,$" 代表一到最后一行,也就是全文,“%” 也代表全文; 最后方括号的是可选选项,释义: c ## 每次替换前询问, e ## 不显示错误信息, g ## 替换一行中的所有匹配项(这个选项通常需要使用); i ## 不区分大小写。
:%s/yangxiao/loading/g ## 将yangxiao替换为loading
- 针对程序员的配置
:syntax on ## 语法高亮 :set autoindent ## 自动缩进 :set shiftwidth=4 ## 设置tab缩进空格,默认8个空格
- 永久保存 vim 配置,需要编辑 “/etc/vimrc ”文件
vimrc 常规配置:set mouse=a "支持鼠标定位 set enc=utf-8 "设置编码格式 set nu "左侧行号 set tabstop=4 "tab 长度设置为 4 set nobackup "覆盖文件时不备份 set cursorline "突出显示当前行 set ruler "在右下角显示光标位置的状态行 set autoindent "自动缩进 et nocompatible "关闭vi兼容 set history=500 "历史命令 syntax on "语法高亮 set smartindent "智能缩进 set showmatch "括号匹配 set incsearch "设置快速搜索 set foldenable "开启代码折叠 filetype plugin on "文件关联 filetype indent on "根据文件类型缩进
vim 一些常用命令
Shell 编程
变量的赋值和使用
1 #! /bin/bash
2 #Display a line
3
4 echo "Hello World! 2019"
5 log="monday" ## 赋值
6
7 echo "The value of logfile is:"
8
9 echo $log ## 使用
source 命令可以强行让一个脚本影响其父 Shell 环境。如下 log 变量在当前 Shell 可见。
与之相反的命令是 export,export 可以让一个脚本影响其子 Shell 环境。如下,其中 bash 为启动子 bash。
unset 可以手动注销一个变量,eg:
$ unset log
变量替换
转义字符 “\” 可转义 “$”:
使用 “${变量名}” 可替换变量:
位置变量
“$1”、“$2”、“$3”…分别代表第一个、第二个、第三个…参数,其中 “$0” 代表脚本本身:
除了数字命令的位置变量,Shell 还提供了另外三个位置变量:
$*:包含参数列表;
$@:包含参数列表,同上;
$#:包含参数个数;
eg:
Bash 引号规则
- 双引号:阻止 Shell 对大多数特殊字符(如#)进行解释,但“$”、“`"、“ ” ” 仍然保持其特殊含义;
- 单引号:阻止 Shell 对所有字符进行解释。
- 倒引号:“ ` ”,这个符号位于 ESC 下方。当用倒引号括起一个 Shell 命令时,这个命令将被执行,结果将作为表达式的值。
eg:
运算符
表达式求值
- “$[]”,eg:
其中语法 [base#]n 来表示二到三十六进制的任何一个n值,如 2#10 代表二进制数10。 - expr,
$ expr 1 + 2 ## 1,2要有空格,否则会被当做字符串处理。
eg:
- let 命令用于计算整数表达式的值:
脚本执行命令和控制语句
if 选择结构
语法如下:
if test-commands
then
commands
fi # 结束标志
if test-commands-1
then
commands-1
elif test-commands-2
then
commands-2
elif test-commands-3
then
commands-3
...
else
commands
fi # 结束标志
eg:
case 多选结构
语法如下:
case word in
pattern-1)
commands-1
;; # ;; 只在 case 中出现,Shell 一旦遇到此命令就跳转到 case 结构的最后。
pattern-2)
commands-2
;;
...
pattern-n)
commands-n
;;
esac
条件测试
if 判断依据
if 语句事实上判断的是程序的返回值,返回 0 表示为真,非 0 为假,代码如下:
testif 脚本:
1 #! /bin/bash
2
3 if ./testscript -1
4 then
5 echo "testscript exit -1"
6 fi
7
8 if ./testscript 0
9 then
10 echo "testscript exit 0"
11 fi
12
13 if ./testscript 1
14 then
15 echo "testscript exit 1"
16 fi
testscript 脚本:
1 #! /bin/bash
2
3 exit $@ #接收用户输入的参数并返回给其父进程
最终执行结果:
test 命令和空格的使用
因为 if 语句接收一个命令作为参数,所以表达式不能直接放到 if 后面。为此需要额外引入一个命令,用于判断表达式真假。test 语法命令如下:
test expr
test 等同于 [],即:
[ espr ]
用于字符串比较的选项:
eg:用于检测是否为空。
#!/bin/bash
read password
if [ -z "$password" ]
then
echo "please enter the password"
fi
用于文件测试的选项:
用于数字比较的选项:
复合表达式操作符:
循环结构
Shell 循环结构有三种:while、until、for。
while 语法:
while test-commands
do
commands
done
eg:
#! /bin/bash
sum=0
number=1
while test $number -le 100
do
sum=$[ $sum + $number ]
let number=$number+1
done
echo "The summary is $sum"
util 语法:
until test-commands
do
commands
done
除了 test-commands 和 while 相反,其他都相同,即 test-commands 为假时执行,为真时跳出循环。
for 语法:
for variable [in list]
do
commands
done
eg:
1 #! /bin/bash
2
3 for i in $@
4 do
5 echo $i
6 done
seq
该工具接收一个数字参数,生成一个列表:$ seq 9 ## 生成1到9的数字
读取用户输入:read
如下图:read 读取输入,并存放于 REPLY 中
脚本执行命令
exit 命令
强行退出一个脚本,并向调用这个脚本的进程返回一个整数值。eg:
#! /bin/bash
exit 1
trap 命令
用于捕获一个信号。
eg:
1 #! /bin/bash
2
3 trap 'echo "Type quit to exit"' INT ## 忽视 INT 信号(中断(同 Ctrl + C))
4
5 while [ "$input" != 'quit' ]
6 do
7 read input
8 done
其他常用的 Shell 命令
服务器
服务器基础知识
任务计划:cron
语法
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
* * * * * user commands
# 第一个*代表分钟,0表示整点
# 第二个*代表小时
# 第三个*代表日期
# 第四个*代表月份
# 第五个*代表星期
user 代表用户
最后是执行的命令
eg:* 19 * * * root /app/start.sh
cron 原理
cron 随系统启动而作为守护进程启动,当 cron 启动时会读取配置文件,将内容保存到内存中。每过一分钟,cron 会重新检查配置文件,并执行这一分钟安排的任务。因为 cron 的最短周期是 1 分钟。
手动启动可以运行:$ sudo /etc/init.d/cron restart
crontab 管理
cron 的配置文件叫 crontab。可以在三个地方找到 cron 的配置文件。
系统全局的 cron 配置文件
- 和系统维护有关的全局任务计划一般存放在 /etc/crontab 中,这个配置文件由系统管理员定制。
- /etc/cron.d 目录,地位等同于 /etc/crontab,用于应用软件配置自己的任务计划。cron 还提供了 /etc/cron.daily、/etc/cron.hourly、/etc/cron.monthly、/etc/cron.weekly 用于存放每天,每小时,每月、每周执行的定时任务。这种机制使 cron 配置更为清晰。
eg:cron.d 目录下两个文件各存放了不同的定时任务命令,针对不同应用,管理更为方便。
普通用户的配置文件
普通用户的获得批准后可以配置自己的定时任务,每个用户的配置文件保存在 /var/spool/cron/ 目录下,以 username.cron 命名。
和系统 crontab 不同,编辑用户自己的配置文件应该使用 crontab 命令。语法如下:
管理用户的定时任务
/etc/cron.deny、/etc/cron.allow 分别用于配置哪些用户禁止提交 crontab 文件、哪些用户允许提交 crontab 文件。用法:将用户名追加到相应文件即可。
简单的定时:at 命令
at 适合执行一次性任务。
ctrl + d 结束输入。
atq 查看当前已经设置的定时任务:
删除任务:$ atrm 8 ## 删除编号为8的任务