马哥Linux培训课堂笔记(1)

2017-11-12|Categories: External cmd, Linux, Magedu-training|

以下内容主要按照在课堂讲述的顺序记录,有适当整理和延伸,便于回顾复习。

重要知识点

Bash内部命令(builtin)

enable

# 查看已启用的内部命令
enable

# 查看已禁用的内部命令
enable -n

# 禁用`type`
enable -n type

# 启用`type`
enable type

hash

# 列出已缓存的外部命令
hash

# 列出已缓存的外部命令的路径、名称
hash -l

# 删除已缓存的外部命令
hash -d <program_name>

# 重命名已缓存的命令
hash -p <program_full_path> <program_name>

# forget all remembered locations
hash -r

alias

alias可以让用户自定义命令,例如:

alias cdnet="cd /etc/sysconfig/network-scripts"

alias可以存放到多个文件:

  • ~/.bashrc:仅对某个用户有效。
  • ~/.bash_profile:仅对某个用户有效。
  • /etc/bashrc:对所有用户有效。
  • /etc/profile:对所有用户有效。
    • 不建议直接修改/etc/profile,更好的方式是在/etc/profile.d/目录下新建一个.sh脚本文件,所有自定义的条目(包括alias)放到这个脚本统一管理。

推荐把alias放到~/.bashrc,原因详见《.bash_profile vs .bashrc》

Bash执行命令的顺序:alias → builtin → hashed external commands → $PATH

屏蔽alias的方法:

  • 单引号:'ls'
  • 反斜线:\ls
  • 完整路径:/bin/ls

内部命令 vs 外部命令

内部命令是Bash内置的函数,外部命令是一个磁盘文件,可以使用以下命令来区分。

  • type:优先搜索hash缓存。
  • which:只搜索$PATH

某些命令既是内部命令,也是外部命令,例如echo,Bash会优先执行内部命令,这会提升效率。如果是其它没有echo内部命令的shell就会执行外部命令。

时间和时区

date(系统时间)

设置系统时间
# date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
date 110912342018.35

# -s, --set=STRING
[root@centos7 ~] date +'%F %T'
2017-11-16 19:11:21

[root@centos7 ~] date -s '45days'
Sun Dec 31 19:11:34 CST 2017

[root@centos7 ~] date -s '45days 2hours'
Wed Feb 14 21:11:54 CST 2018

[root@centos7 ~] date -s '45days 2hours 10mins'
Sat Mar 31 23:22:09 CST 2018
自定义时间输出格式
# 以「年-月-日」格式输出今天的日期,%F = %Y-%m-%d
date +%F

# 计算当前时间相距1970-1-1 0:00的秒数
date +%s

# 计算两天前是星期几
date -d '2 days ago' +%A

# 计算相距1970-1-1 0:00共2147483647秒的那个日期
date -d @2147483647 +%Y-%m-%d

clock & hwclock(硬件时间)

# clock是指向hwclock的软链接
[liyang@centos7 ~]$ ll `which clock`
lrwxrwxrwx. 1 root root 7 Nov  7 16:08 /usr/sbin/clock -> hwclock

# 查看硬件时间
clock

# 根据硬件时间设置系统时间
clock --hctosys

# 根据系统时间设置硬件时间
clock --systohc

时区

CentOS 7的/etc/localtime是一个指向当前时区文件的软连接:

CentOS 6的/etc/localtime是一个当前时区文件的硬连接:

# set timezone in centos 7
timedatectl list-timezones
timedatectl set-timezone Asia/Shanghai

# set timezone in centos 6
tzselect

涉及的命令

bc

短小精悍的命令行计算器:

# 二进制转十进制
[testuser@centos7 ~]$ echo 'ibase=2;111110101' | bc
501

# 八进制转十进制
[testuser@centos7 ~]$ echo 'ibase=8;765' | bc
501

# 十六进制转十进制
[testuser@centos7 ~]$ echo 'ibase=16;1F5' | bc
501

# 十六进制转二进制
# 注意,顺序很重要,必须是`obase; ibase; input_num`
[testuser@centos7 ~]$ echo 'obase=2;ibase=16;1F5' | bc
111110101

# 八进制转二进制
[testuser@centos7 ~]$ echo 'obase=2;ibase=8;765' | bc
111110101

startx

  • 运行startx不会改变运行级别。
  • startx可以在Level 3运行。
  • who -r可以显示运行级别。

  • runlevel可以显示运行级别。

strace & ltrace & ldd

  • strace:跟踪系统调用和信号
  • ltrace:跟踪库调用(CentOS 7默认未安装)
  • ldd:显示应用程序依赖的库文件

reboot/halt/poweroff/shutdown

通过man halt可以看到,reboot/halt/poweroff三个命令在不加--force的情况下,都是调用shutdown命令:

When called with --force or when in runlevel 0 or 6, this tool invokes the reboot(2) system call itself and directly reboots the system.

Otherwise this simply invokes the shutdown(8) tool with the appropriate arguments.

在CentOS 7上,

  • halt关机不断电,等同于shutdown -H
  • poweroff关机+断电,等同于shutdown -P

在CentOS 6上,二者都是「关机+断电」。

shutdown语法:

shutdown [OPTIONS...] [TIME] [WALL...]

时间参数可以:

  • 使用+m,表示m分钟之后执行。
  • 也可以使用hh:mm,表示在一天中某个具体的时刻执行。
  • 如果不指定时间参数,等同于+1,也就是1分钟之后执行。
  • 如果要群发提示信息,必须指定时间参数。
  • 从指定关机时间前的5分钟开始,禁止新的用户登录。

rz & sz

  • rz:远程主机从本地主机接收文件(receive)。
  • sz:远程主机向本地主机发送文件(send)。

Windows系统上的XShell、SecureCRT可以直接运行rzsz,macOS上的iTerm2需要brew install lrzsz,然后执行以下步骤:

下载iTerm2-zmodem

cd /usr/local/bin
sudo wget https://raw.github.com/mmastrac/iterm2-zmodem/master/iterm2-send-zmodem.sh
sudo wget https://raw.github.com/mmastrac/iterm2-zmodem/master/iterm2-recv-zmodem.sh
sudo chmod 777 /usr/local/bin/iterm2-*

打开iTem2,点击菜单「Preferences → Profiles」,选择某个profile,如Default,之后继续选择「Advanced → Triggers」,点击「Edit」添加如下triggers:

Regular expression: rz waiting to receive.\*\*B0100
Action: Run Silent Coprocess
Parameters: /usr/local/bin/iterm2-send-zmodem.sh
Instant: checked

Regular expression: \*\*B00000000000000
Action: Run Silent Coprocess
Parameters: /usr/local/bin/iterm2-recv-zmodem.sh
Instant: checked

cp

这里主要是借助cp展示花括号{}的用法:

# copy and quick rename a file,
# equal to `cp test test.bak`
cp test{,.bak}

reset

有些时候,如果用文本查看程序打开了一个非文本文件:cat $(which ifconfig),可能导致终端界面全部乱码,此时需要使用reset命令重设(复位)终端,使其恢复正常。

备注:是否乱码要看使用的终端模拟器,cat $(which ifconfig)在Windows平台的SecureCRT执行后就会乱码,在macOS平台的iTerm2执行后就不会。

who/whoami/who am i/w

从上图可以看到,

  • whoami输出最简洁,只有当前用户名。
  • w的输出最详细。
  • whowho am i的输出字段是一样的,但
    • who输出当前系统所有的登录用户,
    • who am i只输出当前终端上的登录用户。

screen

安装

cd /run/media/root/CentOS\ 7\ x86_64/Packages
rpm -i screen-4.1.0-0.23.20120314git3c2946.el7_2.x86_64.rpm

会话

# 创建一个名为testing会话,替代默认的<pid>.<tty>.<host>
screen -S testing

# 列出现有的会话
screen -ls

# 连接一个没有分离的会话
screen -x testing

# 重新连接一个已经分离的会话
screen -r

快捷键

注意:

  • screen的所有快捷键都需要先按Ctrl-a这个「前缀」(缩写为C-a),松开之后再按其它键。
  • 快捷键是区分大小写的,例如C-a aC-a A是完全不同的意思。
离开screen
快捷键 用途 备注
C-a d 分离当前会话 d = detach
C-a \ 退出screen和所有会话 不推荐
C-a C-\ 强制退出screen 不推荐
exit 退出(结束)当前会话
窗口管理
快捷键 用途 备注
C-a c 创建新窗口
C-a nC-a <space> 切换到下一个窗口
C-a pC-a <backspace> 切换到上一个窗口
C-a " 查看窗口列表
C-a k 关闭当前窗口 不推荐
C-a A 重命名当前窗口
分割显示区域
快捷键 用途 备注
C-a S 水平分割显示区
C-a | 垂直分割显示区
C-a tab 跳到下一个显示区
C-a X 删除当前显示区 在这个显示区打开的窗口仍然在后台运行
C-a Q 删除当前显示区以外的所有显示区

刚分割出来的窗口是一片空白,连命令提示符都没有,此时可以:

  • C-a c:创建新窗口
  • C-a ":查看窗口列表,选择需要的窗口打开。
    • 多个显示区可以打开相同的窗口,同一个窗口的操作会在多个显示区同步。

复制粘贴
快捷键 用途 备注
C-a [ or C-a <esc> 进入「复制模式」
space 开始或结束复制 按一下开始复制,再按一下结束
C-a ] 粘贴

备注:

  • 尚未找到从iTerm2的screen里复制内容到宿主机操作系统(macOS)剪贴板的方法。
  • 变通方法:登录Gnome桌面环境,打开Gnome-Terminal,选中内容,点击菜单EditCopy,此时内容已存入macOS剪贴板。
其它快捷键
快捷键 用途 备注
C-a ? 列出快捷键清单 完整的快捷键详见man screen
C-a : 进入命令模式 进入命令模式之后,底部会弹出命令输入栏,此时可以输入命令,例如detach
C-a a C-a发送给screen里运行的程序 在Bash里按C-a可以让光标跳转到命令行首字符,如果Bash运行在screen里,必须按C-a a达到同样的效果

技巧

磁盘分区

  • /boot独占第一个分区。
  • /独占一个分区。
  • /etc不能独占一个分区。
  • swap分区 = 内存 x 1.5,大内存机器视情况设置8G或16G即可,不必严格遵守前面的公式。

查看CPU信息

  • lscpu

  • cat /proc/cpuinfo

查看内存信息

  • free
  • cat /proc/meminfo

登录前后显示信息

  • 登录前显示:/etc/issue
  • 登录后显示:/etc/motd

出于安全考虑,登录前显示的信息应当隐藏操作系统相关信息,最好是清空相关文件。

开机自动登录桌面(非ssh登录)

用于学习的机器设置自动登录可以提高效率,不能用于生产环境。

vim /etc/gdm/custom.conf

[daemon]
AutomaticLoginEnable=True
AutomaticLogin=root

命令行历史

清空命令历史记录

用户注销或关机时,系统会把内存中的命令行历史记录保存到.bash_history

# 清空历史记录文件
> .bash_history

# 清空内存中的命令历史
history -c

操作命令行历史记录的快捷键

详见《Bash keyboard shortcuts》

查看帮助文件

  • 内部命令:help <builtin_name>
  • 外部命令:
    • 完整帮助:man <command_name>
    • 简略帮助:<command_name> --help,但不是所有命令都支持--help选项。
  • 一个命令的帮助文件可能有多个章节,可以通过whatis先查看简要说明,等同于man -f
  • man -w可以查看帮助文件的查找路径。
  • 管理帮助文件查找路径的配置文件是:
    • CentOS 6: /etc/man.config
    • CentOS 7: /etc/man_db.conf

经验

  • 由于目前只提供了视频课件,没有PDF,无法快速搜索,所以在记笔记时,要注明哪一天、哪一节课,知识点按讲课顺序记录,方便后续整理。
  • 马哥课堂提供的网络通过DHCP分配的IP地址变化太频繁,会导致ssh频繁掉线,可以通过编辑/etc/sysconfig/network-scripts/目录下的网卡文件,设置固定IP来解决,不需要修改VMware Fusion的虚拟网卡配置文件。

Leave A Comment