在Linux下不像Windows下这样是鼠标的天下,Linux主要的使用键盘啊亲,Shell命令的重要性自然不言而喻,然而Linux系统那么多的Shell命令,有些让人应接不暇,这种情况下,就只能记住一些常用的,有用的命令了 —— 本文记录就是这样一些Shell命令。
- System
- 运行中的kernel和system信息
uname -a ## 获取kernel版本(和BSD版本)
lsb_release -a ## 打印本系统发行版的所有信息,比如发行版的ID,描述信息,具体版本,代号。LSB (Linux Standard Base)
cat /etc/debian_version ## 获取Debian 版本,Ubuntu:/etc/DISTR-release, DISTR= lsb。通用/etc/issue。
uptime ## 显示系统已经运行(加载)的时间
hostname ## 系统的主机名
hostname -i ## 显示本地主机的IP地址
man hier ## 描述文件系统的层次结构
last reboot ## 显示系统重启的历史记录
- 硬件信息
- Kernel检测到的硬件
dmesg ##检测到的硬件和启动信息
lsdev ## 已经安装的硬件信息
dd if=/dev/mem bs=1k skip=768 count=256 2>/dev/null | strings -n 8 ## 读取 BIOS
cat /proc/cpuinfo ## CPU model
cat /proc/meminfo ## 硬件中内存的信息
grep MemTotal /proc/meminfo ## 显示系统的物理内存
watch -n1 'cat /proc/interrupts' ## 连续动态监测中断状态
free -m ## 已经使用和空闲内存(m=MB)
cat /proc/devices ## 已配置的设备
lspci -tv ## PCI设备
lsusb -tv ## USB设备
lshal ## 显示所有设备的属性清单
dmidecode ## DMI/SMBIOS: 来自BIOS的硬件信息
- Load, statistics 和 messages
- 下面的命令在找出运行于系统上的程序信息非常有用.
top ## 动态显示cpu进程信息
mpstat 1 ## 进程的相关统计信息
vmstat 2 ## 虚拟内存统计信息
iostat 2 ## I/O统计信息 (2s间隔)
systat -vmstat 1 ## BSD系统统计汇总 (1s)
systat -tcp 1 ## BSD tcp 连接 (也可 -ip)
systat -netstat 1 ## BSD 活动的网络连接
systat -ifstat 1 ## BSD 通过活动的网络接口的网络流量
systat -iostat 1 ## BSD CPU和磁盘的吞吐量
tail -n 500 /var/log/messages ## 最后500条kernel/syslog信息
tail /var/log/warn ## 系统警告信息,参看:syslog.conf
- 用户类
- 系统下关于用户信息的各种Shell命令
id ## 当前活动帐户的用户ID的相关信息
last ## 系统的最近的登录记录
who ## 系统当前登录的所有用户
groupadd admin ## 添加admin组
useradd -c "Mitchell Chu" -g admin -m mitchell ## 添加mitchell用户,并将mitchell添加到admin组
usermod -a -G ## 添加现存用户到组 (Debian)
userdel mitchell ## 删除用户mitchell
pw groupmod admin -m newmembe r ## 添加新成员到组
pw useradd mitchell -c "Mitchell Chu" -g admin -m -s /bin/tcsh ##
pw userdel mitchell; pw groupdel admin ##
- Kernel模块
- 内核模块信息
lsmod ## kernel加载的所有模块
modprobe isdn ## 加载模块 (这里是isdn)
- Kernel编译
- 内核编译命令
cd /usr/src/linux
make mrproper # 清除所有,删除不必要的文件和目录,包括配置文件
make oldconfig # 如果存在老配置文件(.config)则重用
make menuconfig # 基于文本选单的配置界面,字符终端下推荐使用, xconfig (Qt) or gconfig (GTK),(需要安装ncurses)
make # 创建一个压缩的kernel image
make modules # 编译modules
make modules_install # 安装modules
make install # 安装kernel
reboot
- grub修复
- 当grub出现损坏时,通过live cd来启动,(在/dev下找到linux分区,然后使用fdisk来找到这个Linux分区)挂载这个linux分区,添加/proc和/dev并使用grub-install /dev/xyz。假设Linux系统位于/dev/sda4.
mount /dev/sda6 /mnt # 将linux分区挂载到/mnt
mount --bind /proc /mnt/proc # 挂载proc subsystem到/mnt
mount --bind /dev /mnt/dev # 挂载devices到/mnt
chroot /mnt # 更改 root 目录
grub-install /dev/sda # 使用旧配置重新安装grub
- Listing和PIDs
- 每个进程都有一个唯一的数字,PID。通过ps可以获取当前在运行的所有进程列表。当然,更典型的用法是和pipe或者pgrep一起使用来过滤信息。
ps -auxefw ## 所有运行中的进程列表
ps axww | grep cron ## 返回类似:586 ?? Is 0:01.48 /usr/sbin/cron -s
ps axjf ## 所有的进程使用树状格式显示
ps aux | grep 'ss[h]' ## 查找所有的进程ssh的PIDs,grep 条目不显示
pgrep -l sshd ## 通过名称(或部分名称)来查找进程的PIDs
echo $$ ## 当前shell的PID
fuser -va 22/tcp ## 列出使用端口号为22的进程 (Linux)
pmap PID ## 进程的Memory map(可用于搜索内存泄露) (Linux)
fuser -va /home ## 列出正在访问 /home的进程
strace df ## 追踪系统的 calls 和 signals
truss df ## 同上
- Signals/Kill
- 通过kill或killall终止或发送一个信号。
kill -s TERM 4712 ## 同kill -15 4712
killall -1 httpd ## 用(详细)名称 Kill HUP 进程
pkill -9 http ## 用(部分)名称Kill 进程
pkill -TERM -u www ## Kill TERM 进程(属于用户www的)
fuser -k -TERM -m /home ## Kill 所有访问 /home 的进程(umount时可用)
重要的signals有:
1 HUP (hang up)
2 INT (interrupt)
3 QUIT (quit)
9 KILL (non-catchable, non-ignorable kill)
15 TERM (software termination signal)
- Permissions(权限)
- 通过chmod和chown来修改权限和所有者信息。在Linux下,所有用户的默认的umask可以在/etc/profile下面修改。默认的umask通常是022。umask会从777中减去,因此022的umask表现在权限中的结果是755.
1 --x execute # Mode 764 = exec/read/write | read/write | read
2 -w- write # For: |-- Owner --| |- Group-| |Oth|
4 r-- read
ugo=a u=user, g=group, o=others, a=everyone
chmod [OPTION] MODE[,MODE] FILE ## MODE 应属于这种形式: [ugoa]*([-+=]([rwxXst]))
chmod 640 /var/log/maillog ## 限定日志为 -rw-r-----
chmod u=rw,g=r,o= /var/log/maillog ## 同上
chmod -R o-r /home/* ## 递归移除/home下所有其他用户的读权限
chmod u+s /path/to/prog ## 在可执行位置设置SUID位(确认你要这么做!!!这将改变euid和egid的值,处置不当将会带来很大安全风险,SGID有时候是更好的选择)
find / -perm -u+s -print ## 查找所有设置了SUID位的程序
chown user:group /path/to/file ## 更改文件的所属用户和组(user,group要存在)
chgrp group /path/to/file ## 更改文件所属组
chmod 640 `find ./ -type f -print` ## 修改所有文件的权限为: 640
chmod 751 `find ./ -type d -print` ## 修改所有文件夹的权限为:751
- Disk——磁盘信息
- 获取磁盘信息,系统挂载点/磁盘使用量
hdparm -I /dev/sda ## IDE/ATA 磁盘信息 (Linux)
fdisk /dev/ad2 ## 显示和更改当前的分区表
smartctl -a /dev/ad2 ## 显示磁盘的SMART信息
mount | column -t ## 显示系统已经挂载的文件系统(file-systems)
df ## 显示可用磁盘空间和已挂载的设备
cat /proc/partitions ## 所有已注册的磁盘分区
du -sh * ## 以列表形式显示目录的大小
du -csh ## 当前目录的总用量
du -ks * | sort -n -r ## 按千字节(kilobytes)大小排序项目
- 查看用户已经打开的文件信息
- 这个方法可以有效的找出阻止了要卸载分区并引起下面这个典型错误的文件。注意,umount利用设备名或挂载点都能卸载文件系统,不过最好还是使用挂载点进行,以免使用绑定挂载(一个设备,多个挂载点)时出现混乱。
#通过设备名卸载
umount -v /dev/sda1
#通过挂载点卸载
umount -v /mnt/my_mount_point
#如果设备正忙,则卸载失败,会报错umount: unmount of /mnt/my_mount_point failed: Device busy.
umount /home/
umount: unmount of /home failed: Device busy. ## umount impossible because a file is locking home
ls -lSr ## 显示所有文件,最大的在后面
## 通过fuser和lsof来查找挂载点打开的所有文件
fuser -m /home ## 列出所有访问/home的进程
lsof /home
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
tcsh 29029 eedcoba cwd DIR 0,18 12288 1048587 /home/cipi (cipi:/home)
lsof 29140 eedcoba cwd DIR 0,18 12288 1048587 /home/cipi (cipi:/home)
## 通过进程PID来使用lsof,需要先通过下面的这个方式来获得PID
ps ax | grep Xorg | awk '{print $1}'
3324
lsof -p 3324
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
Xorg 3324 root 0w REG 8,6 56296 12492 /var/log/Xorg.0.log
About a single file:
lsof /var/log/Xorg.0.log
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
Xorg 3324 root 0w REG 8,6 56296 12492 /var/log/Xorg.0.log
- 挂载或重新挂载文件系统
- 以cdrom为例,假设cdrom已经存在/etc/fstab,(在CentOS下,cdrom的添加在/etc/mtab下。下同)。进入/etc/fstab,可以看到类似下面的信息:
/dev/cdrom /media/cdrom subfs noauto,fs=cdfss,ro,procuid,nosuid,nodev,exec 0 0
mount /cdrom ## 存在于mtab的前提下
mount -t auto /dev/cdrom /mnt/cdrom ## 常用的cdrom挂载命令
mount /dev/hdc -t iso9660 -r /cdrom ## 常用的 IDE
mount /dev/scd0 -t iso9660 -r /cdrom ## 常用的 SCSI cdrom
mount /dev/sdc0 -t ntfs-3g /windows ## 常用的 SCSI
- 实时增加swap
- 假设现在需要更多的swap,例如一个2GB的文件 /swap2gb。注意:如果有多余分区,也可以使用分区来创建swap,swap最多能创建32个.
dd if=/dev/zero of=/swap2gb bs=1024k count=2000
mkswap /swap2gb ## 创建swap区域
swapon /swap2gb ## 激活这个swap,现在就可以使用了
swapoff /swap2gb ## 当完成后,取消swap
rm /swap2gb ## 删除swap
- 挂载一个SMB共享
- 假设我们想访问计算机smbserver上的SMB共享myshare,在Windows上地址为:\\smbserver\myshare\. 我们直接挂载到/mnt/smbshare。会出现警告:Warning> cifs wants an IP or DNS name, not a Windows name.
smbclient -U user -I 192.168.16.229 -L //smbshare/ ## 列出共享
mount -t smbfs -o username=winuser //smbserver/myshare /mnt/smbshare
mount -t cifs -o username=winuser,password=winpwd //192.168.16.229/myshare /mnt/share
注意:使用mount.cifs包,这可能会将credentials保存到文件中,比如:/home/user/.smb:
username=winuser
password=winpwd
然后再进行mount
mount -t cifs -o credentials=/home/user/.smb //192.168.16.229/myshare /mnt/smbshare
- 挂载一个image
- image不是图片,是镜像.
mount -t iso9660 -o loop file.iso /mnt ## 挂载CD image
mount -t ext3 -o loop file.img /mnt ## 以ext3文件系统格式挂载image
- 创建一个内存文件系统
- 对于高IO负载的应用程序来说,基于内存的文件系统是非常快的.下面例子展示如何创建一个挂载到/memdisk的64MB分区。
mount -t tmpfs -osize=64m tmpfs /memdisk
- 磁盘性能
- 下面例子展示在分区ad4s3c(/home)读写1GB的文件。
time dd if=/dev/ad4s3c of=/dev/null bs=1024k count=1000
time dd if=/dev/zero bs=1024k count=1000 of=/home/1Gb.file
hdparm -tT /dev/hda ## 仅Linux
- 网络
- 网络的一些有用功能
ethtool eth0 ## ethernet的状态(eth0) (替换:mii-diag)
ethtool -s eth0 speed 100 duplex full ## 强制使用100Mbit 全双工(Full duplex)
ethtool -s eth0 autoneg off ## 关闭(禁用)自动协商
ethtool -p eth1 ## 闪烁ethernet的led - 如果支持的情况下这个功能非常有用
ip link show ## 显示Linux上的所有的接口 (类似 ifconfig)
ip link set eth0 up ## 启用或关闭设备. 同 "ifconfig eth0 up"
ip addr show ## 显示Linux上的所有的IP地址 (类似 ifconfig)
ip neigh show ## 类似 arp -a
- 使用中的端口
- 当前处于打开状态的端口号
netstat -an | grep LISTEN
lsof -i ## 列出所有的互联网连接
socklist ## 显示所有打开的socket列表
netstat -anp --udp --tcp | grep LISTEN
netstat -tup ## 列出所有活动的连接(连接到/连接自当前系统的)
netstat -tupl ## 列出所有本地监听的端口
- 防火墙
- 首先确保防火墙已经运行,这里给出的是一般的配置。
iptables -L -n -v ## iptables防火墙已启用规则列表的详细信息
iptables -P INPUT ACCEPT ## INPUT的默认策略改为ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -Z ## 清零所有链上的包和字节计数器
iptables -F ## 清除所有链规则
iptables -X ## 删除所有用户定义的链
- 路由IP Forward
- 检查并且启用IP转发
cat /proc/sys/net/ipv4/ip_forward ## 检查IP forward设置,0=off, 1=on
echo 1 > /proc/sys/net/ipv4/ip_forward
或者编辑:/etc/sysctl.conf
net.ipv4.ip_forward = 1
- 网络地址转换(NAT)
- 利用IPTABLE来做网络地址转换。MASQUERADE模块需要加载.
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE ## 激活NAT
iptables -t nat -A PREROUTING -p tcp -d 78.31.70.238 --dport 20022 -j DNAT \
--to 192.168.16.44:22 ## 将端口20022转到内网IP的SSH端口
iptables -t nat -A PREROUTING -p tcp -d 78.31.70.238 --dport 993:995 -j DNAT \
--to 192.168.16.254:993-995 ## 转换端口范围:993-995
ip route flush cache
iptables -L -t nat ## 检查NAT状态
- DNS
- DNS条目存放在/etc/resolv.conf下面,针对本地所有的网络接口有效.下面是可能的最小配置:
nameserver 66.63.128.84
search cipi.net intern.lab
domain cipi.org
如果要检查系统的域名可以这样:
hostname -d ## 这里和DNS Domain name一致
- DHCP
- DNS条目存放在/etc/resolv.conf下面,针对本地所有的网络接口有效.下面是可能的最小配置:
dhcpcd -n eth0 ## 触发下renew(注意并不是每次都能正常工作)
dhcpcd -k eth0 ## release并且shutdown
续租的详细信息被存放在:/var/lib/dhcpcd/dhcpcd-eth0.info
- tar
- 命令tar(磁带归档,tape archive)创建和提取文件和目录的归档。.tar归档文件是没有压缩的,压缩的归档文件一般会有.tgz,.tar.gz(zip),.tbz(bzip2)的后缀。在创建归档时请不要使用绝对路径,因为提取文件时你可能会需要放到其他的地方。
## 创建
cd /
tar -cf home.tar home/ ## 归档整个/home目录 (c参数用来创建按)
tar -czf home.tgz home/ ## 和zip压缩一样
tar -cjf home.tbz home/ ## 和bzip2压缩效果一样
## 多个目录时,保留目录的结构,下面的这个是/usr/local/etc和/usr/local/www归档,保持相对的目录结构,最后的归档文件是local开始
tar -C /usr -czf local.tgz local/etc local/www
tar -C /usr -xzf local.tgz ## untar local目录到/usr
cd /usr; tar -xzf local.tgz ## 同上
## 提取
tar -tzf home.tgz ## 不提取文件仅仅是查看归档文件列表
tar -xf home.tar ## 提取文件到当前目录(x参数是提取)
tar -xzf home.tgz ## 同zip解压(bzip2是-xjf)
## 移除路径的起始gallery2并提取到gallery目录下
tar --strip-components 1 -zxvf gallery2.tgz -C gallery/
tar -xjf home.tbz home/mitchell/file.txt ## 恢复单个文件
## 更多高级货
tar c dir/ | gzip | ssh user@remote 'dd of=dir.tgz' ## 归档dir/并保存到远端.
tar cvf - `find . -print` > backup.tar ## 归档当前目录
tar -cf - -C /etc . | tar xpf - -C /backup/etc ## 拷贝目录
tar -cf - -C /etc . | ssh user@remote tar xpf - -C /backup/etc ## 远程拷贝
tar -czf home.tgz --exclude '*.o' --exclude 'tmp/' home/ ## 剔除文件和目录
- Find
- Find的一些重要的选项:
-x (BSD下) -xdev (Linux系统) ## 保持在同一文件系统 (dev在fstab里).
-exec cmd {} \; ## 执行cmd命令并用全路径替换{}
-iname ## 类似于 -name,不同在于它是大小写不敏感,ignorecasename
-ls ## 显示文件的信息 (类似于 ls -la)
-size n ## n 值为 +-n (k M G T P)
-cmin n ## 文件的状态在过去的n分钟内被修改过
find . -type f ! -perm -444 ## 查找所有不可读的文件
find . -type d ! -perm -111 ## 查找不可访问的所有目录
find /home/user/ -cmin 10 -print ## 查找在过去10分钟内创建或修改过的文件
find . -name '*.[ch]' | xargs grep -E 'expr' ## 在目录内或子目录内查找'expr'.
find / -name "*.core" | xargs rm ## 查找内核的转储并删除 (也可尝试 core.*)
find / -name "*.core" -print -exec rm {} \; ## 执行其他语法
## 查找图片并创建归档, iname大小写不敏感. -r 为附加
find . \( -iname "*.png" -o -iname "*.jpg" \) -print -exec tar -rf images.tar {} \;
find . -type f -name "*.txt" ! -name README.txt -print ## 执行 README.txt
find /var/ -size +10M -exec ls -lh {} \; ## 查找 > 10 MB的文件
find /var/ -size +10M -ls ## 这是更简单的版本
find . -size +10M -size -50M -print
find /usr/ports/ -name work -type d -print -exec rm -rf {} \; ## 清理端口
## 通过SUID来查找文件; 这些文件非常容易受到攻击,必须保证其安全性
find / -type f -user root -perm -4000 -exec ls -l {} \;
- 杂项
- 系统里一些其他有用的命令
which command ## 显示命令的全路径
time command ## 查看命令执行的时间
time cat ## 用time当作码表(stopwatch). Ctrl-c退出
set | grep $USER ## 显示当前的环境变量
cal -3 ## 显示一个三个月的日历
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
date 10022155 ## 设置日期和时间
whatis grep ## 显示命令或词的简短信息
whereis java ## 查找提供的词的路径和标准目录
setenv varname value ## 设置环境变量varname的值为value (csh/tcsh)
export varname="value" ## 同上 (sh/ksh/bash)
pwd ## 输出工作目录
mkdir -p /path/to/dir ## 存在目录不报错必要时创建父目录
mkdir -p project/{bin,src,obj,doc/{html,man,pdf},debug/some/more/dirs}
rmdir /path/to/dir ## 删除目录
rm -rf /path/to/dir ## 强制删除目录和目录下的内容(force)
rm -- -badchar.txt ## 删除以中划线开头的文件 (-)
cp -la /dir1 /dir2 ## 存档和硬链接文件,来替代拷贝
cp -lpR /dir1 /dir2 #
cp unixtoolbox.xhtml{,.bak} ## 拷贝有多个扩展名的文件的快捷方式,包含unixtoolbox.xhtml
mv /dir1 /dir2 ## 重命名
ls -1 ## 一行一个文件名
history | tail -50 ## 显示历史中最后50个命令
cd - ## cd 转到之前的那个目录 ($OLDPWD)
- 添加/删除程序
- 针对Debian/Ubuntu/Mint
apt-get update ## 更新包列表
apt-get install emacs ## 安装emacs包
dpkg --remove emacs ## 删除emacs
dpkg -S file ## 查找文件所属包