标签归档:linux

linux ssh爆破应急响应相关命令

1、查看ssh端口(默认22)可疑连接
[root@host ~]#netstat -anplt |grep 22

2、查看除root外是否有特权账户
awk -F: ‘$3==0{print $1}’ /etc/passwd

3、查看可疑远程登录的账号信息
awk ‘/$1|$6/{print $1}’ /etc/shadow

4、查看ssh登录失败的记录
grep -o “Failed password” /var/log/secure|uniq -c

5、查看登录爆破的时间范围
grep “Failed password” /var/log/secure|head -1
grep “Failed password” /var/log/secure|tail -1

6、查看爆破的源IP
grep “Failed password” /var/log/secure|grep -E -o
“(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25
[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)”|uniq -c
| sort -nr

7、查看爆破用户名字典
grep “Failed password” /var/log/secure|
perl -e ‘while($_=<>){ /for(.*?) from/; print “$1n”;}’
|uniq -c|sort -nr

8、查看登录成功的日期、用户名、IP日志
grep “Accepted ” /var/log/secure | awk
‘{print $1,$2,$3,$9,$11}’

9、查看登录成功的IP
grep “Accepted ” /var/log/secure | awk ‘{print $11}’
| sort | uniq -c | sort -nr | more

修改linux系统的arp缓存数量的方法

不同版本的linux系统的arp缓存数量不同,数量默认存放在/proc/sys/net/ipv4/neigh/default/gc_thresh3配置文件中,修改后,重启系统生效。

arp缓存数量不足,会导致很多问题,参见:深信服防火墙AF上arp表数量限制导致网络问题的处理说明

关于更多的arp缓存说明,可以参考:https://vincent.bernat.ch/en/blog/2011-ipv4-route-cache-linuxhttps://supportcenter.checkpoint.com/supportcenter/portal?eventSubmit_doGoviewsolutiondetails=&solutionid=sk43772

linux内核调优

vm.swappiness = 10
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_mem = 786432 1048576 1572864
net.core.wmem_max = 873200
net.core.rmem_max = 873200
net.ipv4.tcp_wmem = 8192 436600 873200
net.ipv4.tcp_rmem = 32768 436600 873200
net.core.somaxconn = 256
net.core.netdev_max_backlog = 1000
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.conf.lo.arp_ignore = 0
net.ipv4.conf.lo.arp_announce = 0
net.ipv4.conf.all.arp_ignore = 0
net.ipv4.conf.all.arp_announce = 0

#下面是iptables相关
net.ipv4.ip_conntrack_max = 6553600
net.ipv4.netfilter.ip_conntrack_max = 6553600
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
net.ipv4.neigh.default.gc_thresh1 = 10240
net.ipv4.neigh.default.gc_thresh2 = 40960
net.ipv4.neigh.default.gc_thresh3 = 81920

几个解释:

swappiness的值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。两个极端,对于 centos linux 5的默认设置,这个值等于60,建议修改为10。

net.ipv4.tcp_syncookies = 1
#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30
#表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time = 1200 
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 1024    65000 
#表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。

net.ipv4.tcp_max_tw_buckets = 5000
#表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,
#TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。
#对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,
#但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。

相关参数说明:ARP支持一个sysctl接口,可以用以配置全局参数或逐个网络接口地进行配制。该sysctl可以通过/proc/sys /net/ipv4/neigh/*/*文件或者使用sysctl(2)接口来访问。系统中每个接口都在/proc/sys/net/ipv4 /neigh/.中有自己的目录。`default’目录中的设置用于所有新建的设备。sysctl相关的时间是以秒为单位,除非特别声明过.
anycast_delay   对IPv6相邻请求信息的回复的最大延迟时间;目前还不支持anycast。缺省值为1秒。  app_solicit  这是在使用多路广播探测(multicast probe)前,经过网络连接送到用户间隙ARP端口监控程序的探测(probe)最大数目(见mcast_solicit)。缺省值为0。  base_reachable_time  一旦发现相邻记录,至少在一段介于base_reachable_time/2和3*base_reachable_time/2之间的随机时间内,该记录是有效的。如果收到上层协议的肯定反馈,那么记录的有效期将延长。缺省值是30秒。  delay_first_probe_time  发现某个相邻层记录无效(stale)后,发出第一个探测要等待的时间。缺省值是5秒。  gc_interval  收集相邻层记录的无用记录的垃圾收集程序的运行周期,缺省为30秒。  gc_stale_time  决定检查一次相邻层记录的有效性的周期。当相邻层记录失效时,将在给它发送数据前,再解析一次。缺省值是60秒。  gc_thresh1  存在于ARP高速缓存中的最少层数,如果少于这个数,垃圾收集器将不会运行。缺省值是128。  gc_thresh2  保存在ARP高速缓存中的最多的记录软限制。垃圾收集器在开始收集前,允许记录数超过这个数字5秒。缺省值是512。  gc_thresh3  保存在ARP高速缓存中的最多记录的硬限制,一旦高速缓存中的数目高于此,垃圾收集器将马上运行。缺省值是1024。  locktime  ARP记录保存在高速缓存内的最短时间(jiffy数),以防止存在多个可能的映射(potential mapping)时,ARP高速缓存系统的颠簸(经常是由于网络的错误配置而引起)。缺省值是1秒。  mcast_solicit  在把记录标记为不可抵达的之前,用多路广播/广播(multicast/broadcast)方式解析地址的最大次数。  缺省值是3。  proxy_delay  当接收到有一个请求已知的代理ARP地址的ARP请求时,在回应前可以延迟的jiffy(时间单位,见BUG)数目。这样,以防止网络风暴。缺省值是0.8秒。  proxy_qlen  能放入代理ARP地址队列(proxy-ARP addresses)的数据包最大数目。缺省值是64。  retrans_time  重发一个请求前的等待jiffy(时间单位,见BUG)的数目。缺省值是1秒。  ucast_solicit  询问ARP端口监控程序前,试图发送单探测(unicast probe)的次数。(见app_solicit).缺省值是3秒。  unres_qlen  每个没有被其它网络层解析的地址,在队列中可存放包的最大数目。缺省值是3。

$ /proc/sys/net/core/wmem_max
最大socket写buffer,可参考的优化值:873200

$ /proc/sys/net/core/rmem_max
最大socket读buffer,可参考的优化值:873200

$ /proc/sys/net/ipv4/tcp_wmem
TCP写buffer,可参考的优化值: 8192 436600 873200

$ /proc/sys/net/ipv4/tcp_rmem
TCP读buffer,可参考的优化值: 32768 436600 873200

$ /proc/sys/net/ipv4/tcp_mem
同样有3个值,意思是:
net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力 。
net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段 。
net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket 。
上述内存单位是页,而不是字节 。
可参考的优化值是:786432 1048576 1572864

$ /proc/sys/net/core/netdev_max_backlog
进入包的最大设备队列.默认是300,对重负载服务器而言,该值太低,可调整到1000 。

$ /proc/sys/net/core/somaxconn
listen()的默认参数,挂起请求的最大数量.默认是128.对繁忙的服务器,增加该值有助于网络性能 。
可调整到256 。

$ /proc/sys/net/core/optmem_max
socket buffer的最大初始化值,默认10K 。

$ /proc/sys/net/ipv4/tcp_max_syn_backlog
进入SYN包的最大请求队列.默认1024.对重负载服务器,增加该值显然有好处.
可调整到2048.

$ /proc/sys/net/ipv4/tcp_retries2
TCP失败重传次数,默认值15,意味着重传15次才彻底放弃.可减少到5,以尽早释放内核资源 。

$ /proc/sys/net/ipv4/tcp_keepalive_time
$ /proc/sys/net/ipv4/tcp_keepalive_intvl
$ /proc/sys/net/ipv4/tcp_keepalive_probes
这3个参数与TCP KeepAlive有关.默认值是:

tcp_keepalive_time = 7200 seconds (2 hours)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 seconds

意思是如果某个TCP连接在idle 2个小时后,内核才发起probe.如果probe 9次(每次75秒)不成功,内核才彻底放弃,认为该连接已失效.对服务器而言,显然上述值太大 。 可调整到:

/proc/sys/net/ipv4/tcp_keepalive_time 1800
/proc/sys/net/ipv4/tcp_keepalive_intvl 30
/proc/sys/net/ipv4/tcp_keepalive_probes 3

$ proc/sys/net/ipv4/ip_local_port_range
指定端口范围的一个配置,默认是32768 61000,已够大。

centos分区说明

在安装centos系统时,如果采用自动分区会将大部分的空间划分到/home下,对于很多服务器应用场景,可能不太实用,本文简单描述下一些推荐的分区。

在过去的版本中,一般必须的分区包括/ 、/boot和swap分区,但是对于新版本,/ 分区是必须存在的分区,推荐10G-100G之间,/boot/efi分区,当采用uefi时,必须存在,推荐200M-500M,/biosboot分区,当硬盘采用GPT分区,固件为BIOS时,必须存在,推荐100M-200M。对于有些版本/boot也是必须存在的,推荐1G。

关于/var、/opt、/usr分区的说明,可参考下图:

linux ssh爆破应急响应相关命令

1、查看ssh端口(默认22)可疑连接
[root@host ~]#netstat -anplt |grep 22

2、查看除root外是否有特权账户
awk -F: ‘$3==0{print $1}’ /etc/passwd

3、查看可疑远程登录的账号信息
awk ‘/$1|$6/{print $1}’ /etc/shadow

4、查看ssh登录失败的记录
grep -o “Failed password” /var/log/secure|uniq -c

5、查看登录爆破的时间范围
grep “Failed password” /var/log/secure|head -1
grep “Failed password” /var/log/secure|tail -1

6、查看爆破的源IP
grep “Failed password” /var/log/secure|grep -E -o
“(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25
[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)”|uniq -c
| sort -nr

7、查看爆破用户名字典
grep “Failed password” /var/log/secure|
perl -e ‘while($_=<>){ /for(.*?) from/; print “$1n”;}’
|uniq -c|sort -nr

8、查看登录成功的日期、用户名、IP日志
grep “Accepted ” /var/log/secure | awk
‘{print $1,$2,$3,$9,$11}’

9、查看登录成功的IP
grep “Accepted ” /var/log/secure | awk ‘{print $11}’
| sort | uniq -c | sort -nr | more


Linux系统常用命令速查手册

一、系统信息
arch      #显示机器的处理器架构(1)
uname -m  #显示机器的处理器架构(2)
uname -r  #显示正在使用的内核版本
dmidecode -q         #显示硬件系统部件 – (SMBIOS / DMI)
hdparm -i /dev/hda   #罗列一个磁盘的架构特性
hdparm -tT /dev/sda  #在磁盘上执行测试性读取操作
cat /proc/cpuinfo    #显示CPU info的信息
cat /proc/interrupts  #显示中断
cat /proc/meminfo     #校验内存使用
cat /proc/swaps       #显示哪些swap被使用
cat /proc/version     #显示内核的版本
cat /proc/net/dev     #显示网络适配器及统计
cat /proc/mounts      #显示已加载的文件系统
lspci -tv   #罗列PCI设备
lsusb -tv   #显示USB设备

二、date 显示系统日期
cal 2007              #显示2007年的日历表
date 041217002007.00   #设置日期和时间 – 月日时分年.秒
clock -w              #将时间修改保存到 BIOS

三、关机 (系统的关机、重启以及登出 )
shutdown -h now    #关闭系统(1)
init 0            #关闭系统(2)
telinit 0         #关闭系统(3)
shutdown -h hours:minutes &   #按预定时间关闭系统
shutdown -c       #取消按预定时间关闭系统
shutdown -r now   #重启(1)
reboot   #重启(2)
logout   #注销

四、文件和目录
cd /home    #进入 ‘/ home’ 目录’
cd ..       #返回上一级目录
cd ../..    #返回上两级目录
cd          #进入个人的主目录
cd ~user1   #进入个人的主目录
cd –     #返回上次所在的目录
pwd      #显示工作路径
ls      #查看目录中的文件
ls -F   #查看目录中的文件
ls -l   #显示文件和目录的详细资料
ls -a   #显示隐藏文件
ls *[0-9]*   #显示包含数字的文件名和目录名
tree         #显示文件和目录由根目录开始的树形结构(1)
lstree       #显示文件和目录由根目录开始的树形结构(2)
mkdir dir1         #创建一个叫做 ‘dir1′ 的目录’
mkdir dir1 dir2   #同时创建两个目录
mkdir -p /tmp/dir1/dir2   #创建一个目录树
rm -f file1   #删除一个叫做 ‘file1′ 的文件’
rmdir dir1    #删除一个叫做 ‘dir1′ 的目录’
rm -rf dir1   #删除一个叫做 ‘dir1’ 的目录并同时删除其内容
rm -rf dir1 dir2   #同时删除两个目录及它们的内容
mv dir1 new_dir    #重命名/移动 一个目录
cp file1 file2   #复制一个文件
cp dir/* .       #复制一个目录下的所有文件到当前工作目录
cp -a /tmp/dir1 .   #复制一个目录到当前工作目录
cp -a dir1 dir2     #复制一个目录
ln -s file1 lnk1  #创建一个指向文件或目录的软链接
ln file1 lnk1     #创建一个指向文件或目录的物理链接
touch -t 0712250000 file1   #修改一个文件或目录的时间戳 – (YYMMDDhhmm)
file file1 outputs the mime type of the file as text
iconv -l   #列出已知的编码
iconv -f fromEncoding -t toEncoding inputFile > outputFile creates a new from the given input file by assuming it is encoded in fromEncoding and converting it to toEncoding.
find . -maxdepth 1 -name *.jpg -print -exec convert “{}” -resize 80×60 “thumbs/{}” \; batch resize files in the current directory and send them to a thumbnails directory (requires convert from Imagemagick)

五、文件搜索
find / -name file1   #从 ‘/’ 开始进入根文件系统搜索文件和目录
find / -user user1   #搜索属于用户 ‘user1’ 的文件和目录
find /home/user1 -name \*.bin   #在目录 ‘/ home/user1′ 中搜索带有’.bin’ 结尾的文件
find /usr/bin -type f -atime +100   #搜索在过去100天内未被使用过的执行文件
find /usr/bin -type f -mtime -10    #搜索在10天内被创建或者修改过的文件
find / -name \*.rpm -exec chmod 755 ‘{}’ \;    #搜索以 ‘.rpm’ 结尾的文件并定义其权限
find / -xdev -name \*.rpm  #搜索以 ‘.rpm’ 结尾的文件,忽略光驱、捷盘等可移动设备
locate \*.ps  #寻找以 ‘.ps’ 结尾的文件 – 先运行 ‘updatedb’ 命令
whereis halt    #显示一个二进制文件、源码或man的位置
which halt      #显示一个二进制文件或可执行文件的完整路径

六、挂载一个文件系统
mount /dev/hda2 /mnt/hda2  #挂载一个叫做hda2的盘 – 确定目录 ‘/ mnt/hda2’ 已经存在
umount /dev/hda2 #卸载一个叫做hda2的盘 – 先从挂载点 ‘/ mnt/hda2’ 退出
fuser -km /mnt/hda2     #当设备繁忙时强制卸载
umount -n /mnt/hda2  #运行卸载操作而不写入 /etc/mtab 文件
mount /dev/fd0 /mnt/floppy       #挂载一个软盘
mount /dev/cdrom /mnt/cdrom      #挂载一个cdrom或dvdrom
mount /dev/hdc /mnt/cdrecorder   #挂载一个cdrw或dvdrom
mount /dev/hdb /mnt/cdrecorder   #挂载一个cdrw或dvdrom
mount -o loop file.iso /mnt/cdrom    #挂载一个文件或ISO镜像文件
mount -t vfat /dev/hda5 /mnt/hda5    #挂载一个Windows FAT32文件系统
mount /dev/sda1 /mnt/usbdisk         #挂载一个usb 捷盘或闪存设备
mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share      #挂载一个windows网络共享

七、磁盘空间
df -h           #显示已经挂载的分区列表
ls -lSr |more    #以尺寸大小排列文件和目录
du -sh dir1      #估算目录 ‘dir1′ 已经使用的磁盘空间’
du -sk * | sort -rn     #以容量大小为依据依次显示文件和目录的大小
rpm -q -a –qf ‘%10{SIZE}t%{NAME}n’ | sort -k1,1n 
#以大小为依据依次显示已安装的rpm包所使用的空间 (fedora, redhat类系统)
dpkg-query -W -f=’${Installed-Size;10}t${Package}n’ | sort -k1,1n 
#以大小为依据显示已安装的deb包所使用的空间 (ubuntu, debian类系统)

八、用户和群组
groupadd group_name   #创建一个新用户组
groupdel group_name   #删除一个用户组
groupmod -n new_group_name old_group_name   #重命名一个用户组
useradd -c “Name Surname ” -g admin -d /home/user1 -s /bin/bash user1     #创建一个属于 “admin” 用户组的用户
useradd user1      #创建一个新用户
userdel -r user1   #删除一个用户 ( ‘-r’ 排除主目录)
usermod -c “User FTP” -g system -d /ftp/user1 -s /bin/nologin user1   #修改用户属性passwd         #修改口令
passwd user1   #修改一个用户的口令 (只允许root执行)
chage -E 2005-12-31 user1    #设置用户口令的失效期限
pwck     #检查 ‘/etc/passwd’ 的文件格式和语法修正以及存在的用户
grpck    #检查 ‘/etc/passwd’ 的文件格式和语法修正以及存在的群组
newgrp group_name     #登陆进一个新的群组以改变新创建文件的预设群组

九、文件的权限
使用 “+” 设置权限,使用 “-” 用于取消
ls -lh    #显示权限
ls /tmp | pr -T5 -W$COLUMNS   #将终端划分成5栏显示
chmod ugo+rwx directory1      #设置目录的所有人(u)、群组(g)以及其他人(o)以读(r )、写(w)和执行(x)的权限
chmod go-rwx directory1      #删除群组(g)与其他人(o)对目录的读写执行权限
chown user1 file1            #改变一个文件的所有人属性
chown -R user1 directory1    #改变一个目录的所有人属性并同时改变改目录下所有文件的属性
chgrp group1 file1          #改变文件的群组
chown user1:group1 file1     #改变一个文件的所有人和群组属性
find / -perm -u+s           #罗列一个系统中所有使用了SUID控制的文件
chmod u+s /bin/file1        #设置一个二进制文件的 SUID 位 – 运行该文件的用户也被赋予和所有者同样的权限
chmod u-s /bin/file1        #禁用一个二进制文件的 SUID位
chmod g+s /home/public      #设置一个目录的SGID 位 – 类似SUID ,不过这是针对目录的
chmod g-s /home/public      #禁用一个目录的 SGID 位
chmod o+t /home/public      #设置一个文件的 STIKY 位 – 只允许合法所有人删除文件
chmod o-t /home/public      #禁用一个目录的 STIKY 位

十、文件的特殊属性
– 使用 “+” 设置权限,使用 “-” 用于取消
chattr +a file1   #只允许以追加方式读写文件
chattr +c file1   #允许这个文件能被内核自动压缩/解压
chattr +d file1   #在进行文件系统备份时,dump程序将忽略这个文件
chattr +i file1   #设置成不可变的文件,不能被删除、修改、重命名或者链接
chattr +s file1   #允许一个文件被安全地删除
chattr +S file1   #一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘
chattr +u file1   #若文件被删除,系统会允许你在以后恢复这个被删除的文件
lsattr           #显示特殊的属性

十一、打包和压缩文件
bunzip2 file1.bz2   #解压一个叫做 ‘file1.bz2’的文件
bzip2 file1         #压缩一个叫做 ‘file1’ 的文件
gunzip file1.gz     #解压一个叫做 ‘file1.gz’的文件
gzip file1          #压缩一个叫做 ‘file1’的文件
gzip -9 file1       #最大程度压缩
rar a file1.rar test_file          #创建一个叫做 ‘file1.rar’ 的包
rar a file1.rar file1 file2 dir1   #同时压缩 ‘file1’, ‘file2’ 以及目录 ‘dir1’
rar x file1.rar     #解压rar包
unrar x file1.rar   #解压rar包
tar -cvf archive.tar file1   #创建一个非压缩的 tarball
tar -cvf archive.tar file1 file2 dir1  #创建一个包含了 ‘file1’, ‘file2’ 以及 ‘dir1’的档案文件
tar -tf archive.tar    #显示一个包中的内容
tar -xvf archive.tar   #释放一个包
tar -xvf archive.tar -C /tmp     #将压缩包释放到 /tmp目录下
tar -cvfj archive.tar.bz2 dir1   #创建一个bzip2格式的压缩包
tar -jxvf archive.tar.bz2        #解压一个bzip2格式的压缩包
tar -cvfz archive.tar.gz dir1    #创建一个gzip格式的压缩包
tar -zxvf archive.tar.gz         #解压一个gzip格式的压缩包
zip file1.zip file1    #创建一个zip格式的压缩包
zip -r file1.zip file1 file2 dir1    #将几个文件和目录同时压缩成一个zip格式的压缩包
unzip file1.zip    #解压一个zip格式压缩包

十二、RPM 包 – (Fedora, Redhat及类似系统)
rpm -ivh package.rpm    #安装一个rpm包
rpm -ivh –nodeeps package.rpm   #安装一个rpm包而忽略依赖关系警告
rpm -U package.rpm        #更新一个rpm包但不改变其配置文件
rpm -F package.rpm        #更新一个确定已经安装的rpm包
rpm -e package_name.rpm   #删除一个rpm包
rpm -qa      #显示系统中所有已经安装的rpm包
rpm -qa | grep httpd    #显示所有名称中包含 “httpd” 字样的rpm包
rpm -qi package_name    #获取一个已安装包的特殊信息
rpm -qg “System Environment/Daemons”     #显示一个组件的rpm包
rpm -ql package_name       #显示一个已经安装的rpm包提供的文件列表
rpm -qc package_name       #显示一个已经安装的rpm包提供的配置文件列表
rpm -q package_name –whatrequires     #显示与一个rpm包存在依赖关系的列表
rpm -q package_name –whatprovides    #显示一个rpm包所占的体积
rpm -q package_name –scripts         #显示在安装/删除期间所执行的脚本l
rpm -q package_name –changelog       #显示一个rpm包的修改历史
rpm -qf /etc/httpd/conf/httpd.conf    #确认所给的文件由哪个rpm包所提供
rpm -qp package.rpm -l    #显示由一个尚未安装的rpm包提供的文件列表
rpm –import /media/cdrom/RPM-GPG-KEY    #导入公钥数字证书
rpm –checksig package.rpm      #确认一个rpm包的完整性
rpm -qa gpg-pubkey      #确认已安装的所有rpm包的完整性
rpm -V package_name     #检查文件尺寸、 许可、类型、所有者、群组、MD5检查以及最后修改时间
rpm -Va                 #检查系统中所有已安装的rpm包- 小心使用
rpm -Vp package.rpm     #确认一个rpm包还未安装
rpm2cpio package.rpm | cpio –extract –make-directories *bin*   #从一个rpm包运行可执行文件
rpm -ivh /usr/src/redhat/RPMS/`arch`/package.rpm    #从一个rpm源码安装一个构建好的包
rpmbuild –rebuild package_name.src.rpm       #从一个rpm源码构建一个 rpm 包

十三、YUM 软件包升级器 – (Fedora, RedHat及类似系统)
yum install package_name             #下载并安装一个rpm包
yum localinstall package_name.rpm    #将安装一个rpm包,使用你自己的软件仓库为你解决所有依赖关系
yum update package_name.rpm    #更新当前系统中所有安装的rpm包
yum update package_name        #更新一个rpm包
yum remove package_name        #删除一个rpm包
yum list                   #列出当前系统中安装的所有包
yum search package_name     #在rpm仓库中搜寻软件包
yum clean packages          #清理rpm缓存删除下载的包
yum clean headers           #删除所有头文件
yum clean all                #删除所有缓存的包和头文件

十四、DEB 包 (Debian, Ubuntu 以及类似系统)
dpkg -i package.deb     #安装/更新一个 deb 包
dpkg -r package_name    #从系统删除一个 deb 包
dpkg -l                 #显示系统中所有已经安装的 deb 包
dpkg -l | grep httpd    #显示所有名称中包含 “httpd” 字样的deb包
dpkg -s package_name    #获得已经安装在系统中一个特殊包的信息
dpkg -L package_name    #显示系统中已经安装的一个deb包所提供的文件列表
dpkg –contents package.deb    #显示尚未安装的一个包所提供的文件列表
dpkg -S /bin/ping              #确认所给的文件由哪个deb包提供

十五、APT 软件工具 (Debian, Ubuntu 以及类似系统)
apt-get install package_name      #安装/更新一个 deb 包
apt-cdrom install package_name    #从光盘安装/更新一个 deb 包
apt-get update      #升级列表中的软件包
apt-get upgrade     #升级所有已安装的软件
apt-get remove package_name     #从系统删除一个deb包
apt-get check     #确认依赖的软件仓库正确
apt-get clean     #从下载的软件包中清理缓存
apt-cache search searched-package    #返回包含所要搜索字符串的软件包名称

十六、查看文件内容
cat file1      #从第一个字节开始正向查看文件的内容
tac file1      #从最后一行开始反向查看一个文件的内容
more file1     #查看一个长文件的内容
less file1     #类似于 ‘more’ 命令,但是它允许在文件中和正向操作一样的反向操作
head -2 file1    #查看一个文件的前两行
tail -2 file1    #查看一个文件的最后两行
tail -f /var/log/messages     #实时查看被添加到一个文件中的内容

十七、文本处理cat file1 file2 … | command <> file1_in.txt_or_file1_out.txt general syntax for text manipulation using PIPE, STDIN and STDOUT
cat file1 | command( sed, grep, awk, grep, etc…) > result.txt 
#合并一个文件的详细说明文本,并将简介写入一个新文件中
cat file1 | command( sed, grep, awk, grep, etc…) >> result.txt 
#合并一个文件的详细说明文本,并将简介写入一个已有的文件中grep Aug /var/log/messages     #在文件 ‘/var/log/messages’中查找关键词”Aug”
grep ^Aug /var/log/messages    #在文件 ‘/var/log/messages’中查找以”Aug”开始的词汇
grep [0-9] /var/log/messages   #选择 ‘/var/log/messages’ 文件中所有包含数字的行
grep Aug -R /var/log/*         #在目录 ‘/var/log’ 及随后的目录中搜索字符串”Aug”
sed ‘s/stringa1/stringa2/g’ example.txt 
#将example.txt文件中的 “string1” 替换成 “string2”
sed ‘/^$/d’ example.txt           #从example.txt文件中删除所有空白行
sed ‘/ *#/d; /^$/d’ example.txt   #从example.txt文件中删除所有注释和空白行
echo ‘esempio’ | tr ‘[:lower:]’ ‘[:upper:]’    #合并上下单元格内容
sed -e ‘1d’ result.txt          #从文件example.txt 中排除第一行
sed -n ‘/stringa1/p’            #查看只包含词汇 “string1″的行
sed -e ‘s/ *$//’ example.txt    #删除每一行最后的空白字符
sed -e ‘s/stringa1//g’ example.txt  
#从文档中只删除词汇 “string1” 并保留剩余全部
sed -n ‘1,5p;5q’ example.txt     #查看从第一行到第5行内容
sed -n ‘5p;5q’ example.txt       #查看第5行
sed -e ‘s/00*/0/g’ example.txt   #用单个零替换多个零
cat -n file1       #标示文件的行数
cat example.txt | awk ‘NR%2==1’      #删除example.txt文件中的所有偶数行
echo a b c | awk ‘{print $1}’        #查看一行第一栏
echo a b c | awk ‘{print $1,$3}’     #查看一行的第一和第三栏
paste file1 file2           #合并两个文件或两栏的内容
paste -d ‘+’ file1 file2    #合并两个文件或两栏的内容,中间用”+”区分
sort file1 file2              #排序两个文件的内容
sort file1 file2 | uniq       #取出两个文件的并集(重复的行只保留一份)
sort file1 file2 | uniq -u    #删除交集,留下其他的行
sort file1 file2 | uniq -d    #取出两个文件的交集(只留下同时存在于两个文件中的文件)
comm -1 file1 file2    #比较两个文件的内容只删除 ‘file1’ 所包含的内容
comm -2 file1 file2    #比较两个文件的内容只删除 ‘file2’ 所包含的内容
comm -3 file1 file2    #比较两个文件的内容只删除两个文件共有的部分

十八、字符设置和文件格式转换
dos2unix filedos.txt fileunix.txt      #将一个文本文件的格式从MSDOS转换成UNIX
unix2dos fileunix.txt filedos.txt      #将一个文本文件的格式从UNIX转换成MSDOS
recode ..HTML < page.txt > page.html   #将一个文本文件转换成html
recode -l | more                       #显示所有允许的转换格式

十九、文件系统分析
badblocks -v /dev/hda1    #检查磁盘hda1上的坏磁块
fsck /dev/hda1            #修复/检查hda1磁盘上linux文件系统的完整性
fsck.ext2 /dev/hda1       #修复/检查hda1磁盘上ext2文件系统的完整性
e2fsck /dev/hda1          #修复/检查hda1磁盘上ext2文件系统的完整性
e2fsck -j /dev/hda1       #修复/检查hda1磁盘上ext3文件系统的完整性
fsck.ext3 /dev/hda1       #修复/检查hda1磁盘上ext3文件系统的完整性
fsck.vfat /dev/hda1       #修复/检查hda1磁盘上fat文件系统的完整性
fsck.msdos /dev/hda1      #修复/检查hda1磁盘上dos文件系统的完整性
dosfsck /dev/hda1         #修复/检查hda1磁盘上dos文件系统的完整性

二十、初始化一个文件系统
mkfs /dev/hda1        #在hda1分区创建一个文件系统
mke2fs /dev/hda1      #在hda1分区创建一个linux ext2的文件系统
mke2fs -j /dev/hda1   #在hda1分区创建一个linux ext3(日志型)的文件系统
mkfs -t vfat 32 -F /dev/hda1   #创建一个 FAT32 文件系统
fdformat -n /dev/fd0           #格式化一个软盘
mkswap /dev/hda3               #创建一个swap文件系统

二十一、SWAP文件系统
mkswap /dev/hda3             #创建一个swap文件系统
swapon /dev/hda3             #启用一个新的swap文件系统
swapon /dev/hda2 /dev/hdb3   #启用两个swap分区

二十二、备份

dump -0aj -f /tmp/home0.bak /home    #制作一个 ‘/home’ 目录的完整备份
dump -1aj -f /tmp/home0.bak /home    #制作一个 ‘/home’ 目录的交互式备份
restore -if /tmp/home0.bak          #还原一个交互式备份
rsync -rogpav –delete /home /tmp    #同步两边的目录
rsync -rogpav -e ssh –delete /home ip_address:/tmp           #通过SSH通道rsync
rsync -az -e ssh –delete ip_addr:/home/public /home/local    #通过ssh和压缩将一个远程目录同步到本地目录
rsync -az -e ssh –delete /home/local ip_addr:/home/public    #通过ssh和压缩将本地目录同步到远程目录
dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr ‘dd of=hda.gz’  
#通过ssh在远程主机上执行一次备份本地磁盘的操作
dd if=/dev/sda of=/tmp/file1 
#备份磁盘内容到一个文件
tar -Puf backup.tar /home/user 执行一次对 ‘/home/user’ 
#目录的交互式备份操作
( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr ‘cd /home/share/ && tar x -p’ 
#通过ssh在远程目录中复制一个目录内容
( tar c /home ) | ssh -C user@ip_addr ‘cd /home/backup-home && tar x -p’ 
#通过ssh在远程目录中复制一个本地目录
tar cf – . | (cd /tmp/backup ; tar xf – ) 
#本地将一个目录复制到另一个地方,保留原有权限及链接
find /home/user1 -name ‘*.txt’ | xargs cp -av –target-directory=/home/backup/ –parents 
#从一个目录查找并复制所有以 ‘.txt’ 结尾的文件到另一个目录
find /var/log -name ‘*.log’ | tar cv –files-from=- | bzip2 > log.tar.bz2 
#查找所有以 ‘.log’ 结尾的文件并做成一个bzip包
dd if=/dev/hda of=/dev/fd0 bs=512 count=1 
#做一个将 MBR (Master Boot Record)内容复制到软盘的动作
dd if=/dev/fd0 of=/dev/hda bs=512 count=1 
#从已经保存到软盘的备份中恢复MBR内容

二十三、光盘
cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force 
#清空一个可复写的光盘内容
mkisofs /dev/cdrom > cd.iso             #在磁盘上创建一个光盘的iso镜像文件
mkisofs /dev/cdrom | gzip > cd_iso.gz    #在磁盘上创建一个压缩了的光盘iso镜像文件
mkisofs -J -allow-leading-dots -R -V “Label CD” -iso-level 4 -o ./cd.iso data_cd 
#创建一个目录的iso镜像文件
cdrecord -v dev=/dev/cdrom cd.iso               #刻录一个ISO镜像文件
gzip -dc cd_iso.gz | cdrecord dev=/dev/cdrom –  #刻录一个压缩了的ISO镜像文件
mount -o loop cd.iso /mnt/iso                  #挂载一个ISO镜像文件
cd-paranoia -B             #从一个CD光盘转录音轨到 wav 文件中
cd-paranoia — “-3”        #从一个CD光盘转录音轨到 wav 文件中(参数-3)
cdrecord –scanbus         #扫描总线以识别scsi通道
dd if=/dev/hdc | md5sum    #校验一个设备的md5sum编码,例如一张 CD

二十四、网络 – (以太网和WIFI无线)
ifconfig eth0    #显示一个以太网卡的配置
ifup eth0        #启用一个 ‘eth0’ 网络设备
ifdown eth0      #禁用一个 ‘eth0’ 网络设备
ifconfig eth0 192.168.1.1 netmask 255.255.255.0     #控制IP地址
ifconfig eth0 promisc     #设置 ‘eth0’ 成混杂模式以嗅探数据包 (sniffing)
dhclient eth0            #以dhcp模式启用 ‘eth0’
route -n    #查看路由表
route add -net 0/0 gw IP_Gateway    #配置默认网关
route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1 
#配置静态路由到达网络’192.168.0.0/16′
route del 0/0 gw IP_gateway        #删除静态路由
hostname #查看机器名
host www.example.com       #把一个主机名解析到一个网际地址或把一个网际地址解析到一个主机名。
nslookup www.example.com   #用于查询DNS的记录,查看域名解析是否正常,在网络故障的时候用来诊断网络问题。
ip link show            #查看网卡信息
mii-tool                #用于查看、管理介质的网络接口的状态
ethtool                 #用于查询和设置网卡配置
netstat -tupl           #用于显示TCP/UDP的状态信息
tcpdump tcp port 80     #显示所有http协议的流量

二十五、JPS工具
jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。
我想很多人都是用过unix系统里的ps命令,这个命令主要是用来显示当前系统的进程情况,有哪些进程,及其 id。jps 也是一样,它的作用是显示当前系统的java进程情况,及其id号。我们可以通过它来查看我们到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),和他们的进程号(为下面几个程序做准备),并可通过opt来查看这些进程的详细启动参数。
使用方法:在当前命令行下打 jps(需要JAVA_HOME,没有的话,到改程序的目录下打) 。
jps存放在JAVA_HOME/bin/jps,使用时为了方便请将JAVA_HOME/bin/加入到Path.
$> jps
23991 Jps
23789 BossMain
23651 Resin
比较常用的参数:
#-q 只显示pid,不显示class名称,jar文件名和传递给main 方法的参数
$> jps -q
28680
23789
23651
#-m 输出传递给main 方法的参数,在嵌入式jvm上可能是null
$> jps -m
28715 Jps -m
23789 BossMain
23651 Resin -socketwait 32768 -stdout /data/aoxj/resin/log/stdout.log -stderr /data/aoxj/resin/log/stderr.log
#-l 输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名
$> jps -l
28729 sun.tools.jps.Jps
23789 com.asiainfo.aimc.bossbi.BossMain
23651 com.caucho.server.resin.Resin
#-v 输出传递给JVM的参数
$> jps -v
23789 BossMain
28802 Jps -Denv.class.path=/data/aoxj/bossbi/twsecurity/java/trustwork140.jar:/data/aoxj/bossbi/twsecurity/java/:/data/aoxj/bossbi/twsecurity/java/twcmcc.jar:/data/aoxj/jdk15/lib/rt.jar:/data/aoxj/jd
k15/lib/tools.jar -Dapplication.home=/data/aoxj/jdk15 -Xms8m
23651 Resin -Xss1m -Dresin.home=/data/aoxj/resin -Dserver.root=/data/aoxj/resin -Djava.util.logging.manager=com.caucho.log.LogManagerImpl -Djavax.management.builder.initial=com.caucho.jmx.MBeanServerBuilderImpl
jps 192.168.0.77
#列出远程服务器192.168.0.77机器所有的jvm实例,采用rmi协议,默认连接端口为1099(前提是远程服务器提供jstatd服务)
#注:jps命令有个地方很不好,似乎只能显示当前用户的java进程,要显示其他用户的还是只能用unix/linux的ps命令。

dos2unix介绍及ubuntu下dos2unix下载链接

linux和windows下的换行符不同,linux使用/n换行,windows使用/r/n来表示换行,windows的文本文件直接拿到linux中使用会报错,因为多了/r字符。

可以通过dos2unix工具来将windows下写的文件转换成unix格式。

ubuntu可以从http://cn.archive.ubuntu.com/ubuntu/pool/universe/d/dos2unix/dos2unix_6.0.4-1_amd64.deb下载dos2unix工具。

Linux 命令行,bash shell和环境变量

bash shell

bashshell 是可用于 Linux 的几个 shell 之一,也被称为 Bourne-again shell,是根据一个早期的 shell (/bin/sh) 的创建者 Stephen Bourne 来命名的。Bash 高度兼容 sh,但它在函数和编程功能上都提供了许多改进。它合并了来自 Korn shell (ksh) 和 C shell (csh) 的特性,想要成为一个符合 POSIX 的 shell。

在深入了解 bash 之前,回想一下 shell是一个接受和执行命令的程序。它还支持编程结构,允许使用更小的部件构建复杂的命令。这些复杂命令或 脚本可保存为文件,独自成为新命令。实际上,典型 Linux 系统上的许多命令 都是脚本。

Shell 有一些 内置命令,比如 cdbreakexec。其他命令是 外部命令。

Shell 也使用 3 种标准 I/O

  • stdin标准输入流,它向命令提供输入。
  • stdout标准输出流,它显示来自命令的输出。
  • stderr标准错误流,它显示来自命令的错误输出。

输入流向程序提供输入,这些输入通常来自终端击键。输出流打印文本字符,通常打印到终端。终端最初为 ASCII 打字机或显示终端,但现在通常是图形桌面上的窗口。

如果您使用的是没有图形桌面的 Linux 系统,或者在图形桌面上打开一个终端窗口,那么您会看到一个提示符,它可能类似于 清单 1中所示的 3 个提示符之一。

清单 1. 一些典型的用户提示符

[ian@atticf20 ~]$
jenni@atticf20:data
$

请注意,这 3 个提示符都来自我的测试系统 atticf20,但面向的是不同用户。前两个是 bash 提示符,二者都显示了已登录的用户、系统名和当前工作目录。第三个提示符是我的系统上针对 ksh shell 的默认提示符。不同发行版和不同 shell 默认使用不同的提示符,所以如果您的发行版看起来有所不同,不要恐慌。我们将在本系列的另一篇教程中介绍如何更改提示符。

如果您以根用户(或超级用户)身份登录,您的提示符可能类似于 清单 2中所示的提示符之一。

清单 2. 超级用户或根用户提示符示例

[root@atticf20 ~]#
atticf20:~#

根用户有很大的权力,所以使用该身份时请小心。在拥有根用户特权时,大部分提示符都包含结尾的井号 (#)。普通用户特权通常使用不同的字符表示,这个字符通常为美元符号 ($)。您的实际提示符可能看起来与本教程中的示例有所不同。您的提示符可能包含您的用户名、主机名、当前目录、日期或打印该提示符的时间,等等。

备注:一些系统(比如 Debian)和基于 Debian 的发行版(比如 Ubuntu)不允许根用户登录,要求所有特权(根用户)命令都使用 sudo命令执行。在这种情况下,您的提示符不会发生更改,但您应该知道需要使用 sudo执行普通用户无权执行的命令。

这些教程包含从真实的 Linux 系统剪切并粘贴的代码示例,其中使用了这些系统的默认提示符。根用户提示符有一个结尾 #,所以您可以将它们与普通用户提示符(有一个结尾 $)区分开来。这种约定与许多有关这一主题的图书一致。如果某项功能似乎对您不起作用,您可以检查示例中的提示符。

环境变量

当您在 bash shell 中运行时,许多因素构成了您的 环境,比如您的提示符的形式、主目录、工作目录、shell 的名称、您打开的文件、您定义的函数,等等。您的环境包含许多可由 bash 或您设置的 变量。bash shell 还允许您拥有 shell 变量,您可以将这些变量 导出到环境中,供 shell 中运行的其他进程或您可能从当前 shell 衍生的其他 shell 使用。

环境变量和 shell 变量都有一个 名称。可以在名称前面加上 ‘ $ ’ 作为前缀来引用变量的值。您会遇到的一些常见的 bash 环境变量如 下表中所示。

一些常见的 bash 环境变量
名称功能
USER登录用户的名称
UID登录用户的用户 id 数字
HOME用户的主目录
PWD当前工作目录
SHELLshell 的名称
$运行的 bash shell(或其他)进程的进程 id(或 PID
PPID启动此进程的进程的进程 id(也就是父进程的 id)
?上一个命令的退出代码

展示了您可能在其中一些常见 bash 变量中看到的结果

环境变量和 shell 变量
[ian@atticf20 ~]$ echo $USER $UID
ian 1000
[ian@atticf20 ~]$ echo $SHELL $HOME $PWD
/bin/bash /home/ian /home/ian
[ian@atticf20 ~]$ (exit 0);echo $?;(exit 4);echo $?
0
4
[ian@atticf20 ~]$ echo $$ $PPID
3175 2457

可通过键入一个名称后立即键入等号 (=) 来创建或 设置shell 变量。如果该变量存在,可以修改它来分配新值。变量是区分大小写的,所以 var1 和 VAR1 是不同的变量。根据约定,变量(特别是导出的变量)采用大写,但这不是必须的。从技术上讲,$$ 和 $? 是 shell 参数而不是变量。它们只能被引用;不能向它们分配值。

创建 shell 变量时,您通常希望将它 导出到环境中,以便从此 shell 启动的其他进程可以使用它。导出的变量 可用于父 shell。可使用 export命令导出变量名。作为 bash 中的快捷方式,可以在一个步骤中分配一个值并导出变量。

为了演示分配和导出过程,我们将在 bash shell 中运行该 bash 命令,然后从新的 bash shell 运行 Korn shell (ksh)。我们将使用 ps命令显示正在运行的命令的信息。

[ian@atticf20 ~]$ ps -p $$ -o "pid ppid cmd"
PID  PPID CMD
3175  2457 bash
[ian@atticf20 ~]$ bash
[ian@atticf20 ~]$  ps -p $$ -o "pid ppid cmd"
PID  PPID CMD
4325  3175 bash
[ian@atticf20 ~]$ VAR1=var1
[ian@atticf20 ~]$ VAR2=var2
[ian@atticf20 ~]$ export VAR2
[ian@atticf20 ~]$ export VAR3=var3
[ian@atticf20 ~]$ echo $VAR1 $VAR2 $VAR3
var1 var2 var3
[ian@atticf20 ~]$ echo $VAR1 $VAR2 $VAR3 $SHELL
var1 var2 var3 /bin/bash
[ian@atticf20 ~]$ ksh$ ps -p $$ -o "pid ppid cmd"
PID  PPID CMD
4427  4325 ksh
$ export VAR4=var4
$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL
var2 var3 var4 /bin/bash
$ exit[ian@atticf20 ~]$ echo $
VAR1 $VAR2 $VAR3 $VAR4 $SHELLvar1 var2 var3 /bin/bash
[ian@atticf20 ~]$ ps -p $$ -o "pid ppid cmd"
PID  PPID CMD
4325  3175 bash
[ian@atticf20 ~]$ exit
exit
[ian@atticf20 ~]$ ps -p $$ -o "pid ppid cmd"
PID  PPID CMD
3175  2457 bash
[ian@atticf20 ~]$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL
/bin/bash
[ian@echidna ~]$ ps -p $$ -o "pid ppid cmd"
PID  PPID CMD
2559  2558 -bash
[ian@echidna ~]$ bash
[ian@echidna ~]$ ps -p $$ -o "pid ppid cmd"
PID  PPID CMD
2811  2559 bash
[ian@echidna ~]$ VAR1=var1
[ian@echidna ~]$ VAR2=var2
[ian@echidna ~]$ export VAR2
[ian@echidna ~]$ export VAR3=var3
[ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3
var1 var2 var3
[ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3 $SHELL
var1 var2 var3 /bin/bash
[ian@echidna ~]$ ksh$ ps -p $$ -o "pid ppid cmd"
PID  PPID CMD
2840  2811 ksh
$ export VAR4=var4$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL
var2 var3 var4 /bin/bash
$ exit
[ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL
var1 var2 var3 /bin/bash
[ian@echidna ~]$ ps -p $$ -o "pid ppid cmd"
PID  PPID CMD
2811  2559 bash
[ian@echidna ~]$ exit
exit
[ian@echidna ~]$ ps -p $$ -o "pid ppid cmd"
PID  PPID CMD
2559  2558 -bash
[ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL
/bin/bash

备注:

  1. 在此序列的开头,bash shell 拥有 PID 3175。
  2. 第二个 bash shell 拥有 PID 4325,它的父 shell 为 PID 3175(原始的 bash shell)。
  3. 我们在第二个 bash shell 中创建了 VAR1、VAR2 和 VAR3,但仅导出了 VAR2 和 VAR3。
  4. 在 Korn shell 中,我们创建了 VAR4。echo命令仅显示了 VAR2、VAR3 和 VAR4 的值,可以确认 VAR1 未导出。您看到 SHELL 变量的值未发生改变是否感到很奇怪,因为提示符已发生改变?您不能始终依靠 SHELL 来告诉您在哪些 shell 下运行,但 ps命令会告诉您实际命令。请注意,ps在第一个 bash shell 前面放入了一个连字符 (-),表明这是一个 登录 shell
  5. 返回到第二个 bash shell,我们可以看到 VAR1、VAR2 和 VAR3。
  6. 最后,当返回到原始 shell 时,所有新变量都不存在。

之前对引号的讨论中已提到,可以使用单引号或双引号。它们之间有一个重要区别。shell 会扩展双引号之间的 shell 变量,但使用单引号 (‘) 时不会扩展。在上一个示例中,我们在 shell 中启动了另一个 shell 并获得了一个新进程 id。使用 -c选项,您可以将一个命令传递给其他 shell,该 shell 将执行该命令并返回。如果传递一个带引号的字符串作为命令,外部 shell 将消除引号并传递字符串。如果使用双引号,变量扩展会在传递字符串 之前执行,所以结果可能不符合预期。该 shell 和命令将在另一个进程中运行,所以它们将拥有另一个 PID。清单 9演示了这些概念。顶级 bash shell 的 PID 已突出显示。

添加引号和 shell 变量
[ian@atticf20 ~]$ echo “$SHELL” ‘$SHELL’ “$$” ‘$$’
/bin/bash $SHELL 3175$$
[ian@atticf20 ~]$ bash -c “echo Expand in parent $$ $PPID”
Expand in parent 31752457
[ian@atticf20 ~]$ bash -c ‘echo Expand in child $$ $PPID’
Expand in child 4541 3175

目前为止,我们的所有变量引用都以空白终止,所以很清楚变量名在何处结束。事实上,变量名仅能由字母、数字或下划线组成。shell 知道变量名会在找到另外的字符时结束。有时,您需要在含义模糊表达式中使用变量。在这些情况下,可以使用花括号来表示变量名,如 清单中所示。

将花括号用于变量名
[ian@atticf20 ~]$ echo “-$HOME/abc-“
-/home/ian/abc-
[ian@atticf20 ~]$ echo “-$HOME_abc-“
[ian@atticf20 ~]$ echo “-${HOME}_abc-“
-/home/ian_abc-

Env

没有任何选项或参数的 env命令显示当前环境变量。也可以使用它在自定义环境中执行命令。-i(或者只是 -)选项在运行命令前清除当前环境,而 -u选项取消设置您不希望传递的环境变量。

清单 11显示了没有任何参数的 env命令的部分输出,然后给出了 3 个调用没有父环境的不同 shell 的示例。在我们讨论它们之前请仔细看看它们。

备注:如果您的系统未安装 ksh (Korn) 或 tcsh shell,您需要安装它们来自行执行这些练习。
env 命令

[ian@atticf20 ~]$ env
XDG_VTNR=2
XDG_SESSION_ID=1
HOSTNAME=atticf20
GPG_AGENT_INFO=/run/user/1000/keyring/gpg:0:1
SHELL=/bin/bash
TERM=xterm-256color
XDG_MENU_PREFIX=gnome-
VTE_VERSION=4002
HISTSIZE=1000
GJS_DEBUG_OUTPUT=stderr
WINDOWID=35651982
GJS_DEBUG_TOPICS=JS ERROR;JS LOG
QT_GRAPHICSSYSTEM_CHECKED=1
USER=ian
=/usr/bin/env OLDPWD=/home/ian/Documents [ian@atticf20 ~]$ env -i bash -c ‘echo $SHELL; env’ /bin/bash PWD=/home/ian SHLVL=1 =/usr/bin/env
[ian@atticf20 ~]$ env -i ksh -c ‘echo $SHELL; env’
/bin/sh
_=3175/usr/bin/env
PWD=/home/ian
SHLVL=1
_AST_FEATURES=UNIVERSE – ucb
A__z=”*SHLVL
[ian@atticf20 ~]$ env -i tcsh -c ‘echo $SHELL; env’
SHELL: Undefined variable.

当 bash 设置 SHELL 变量时,会将其导出至环境中。新 bash shell 已在环境中创建了 3 个其他变量。在 ksh 示例中,我们有 5 个环境变量,但我们尝试回送 SHELL 变量值时,获得了输出 /bin/sh。一些更早的 ksh 版本仅提供一个空白行来表明 SHELL 变量未设置。最后,tcsh 未创建任何环境变量,并在我们尝试引用 SHELL 的值时生成了一个错误。

取消设置和设置

清单 11显示了 shell 处理变量和环境的不同行为。尽管本教程重点介绍的是 bash,但也有必要知道不是所有 shell 都具有相同的行为。此外,shell 将根据它是否是 登录 shell来采取不同行为。就目前而言,我们仅假设登录 shell 是您登录到系统时获得的 shell;如果愿意,您还可以启动其他 shell 来充当登录 shell。上面使用 env -i启动的 3 个 shell 都不是登录 shell。尝试将 -l选项传递给 shell 命令本身,看看您使用登录 shell 会获得哪些区别。

让我们尝试在这些非登录 shell 中显示 SHELL 变量的值:

  1. 当 bash 启动时,它会设置 SHELL 变量,但不会自动将其导出到环境中。
  2. 当 ksh 启动时,它会将其 SHELL 变量的视图设置为 /bin/sh。相较而言,在之前的示例中,ksh 继承了从调用 bash shell 导出的 /bin/bash 值。
  3. 当 tcsh 启动时,没有设置 SHELL 变量。在这种情况下,默认行为与 ksh(和 bash)不同,因为在我们尝试使用一个不存在的变量时报告了错误。

可以使用 unset命令取消设置变量,并从 shell 变量列表中删除它。如果变量已导出到环境中,此命令还会从环境中删除它。可以使用 set命令控制 bash(或其他 shell)的工作方式的许多方面。Set 是一个 shell 内置命令,所以各种选项都是特定于 shell 的。在 bash 中,-u选项导致 bash 报告变量未定义的错误,而不是将它们视为已定义但是空的。可以使用 -打开 set的各种选项,使用 +关闭它们。可以使用 echo $-显示当前设置的选项。

[ian@atticf20 ~]$ echo $-
himBH
[ian@atticf20 ~]$ echo $VAR1

[ian@atticf20 ~]$ set -u;echo $-
himuBH
[ian@atticf20 ~]$ echo $VAR1
bash: VAR1: unbound variable
[ian@atticf20 ~]$ VAR1=v1;echo $VAR1
v1
[ian@atticf20 ~]$ unset VAR1;echo $VAR1
bash: VAR1: unbound variable
[ian@atticf20 ~]$ set +u;echo $VAR1;echo $-

himBH

如果使用没有任何选项的 set命令,它会显示所有 shell 变量和它们的值(如果有)。还有另一个 declare命令,可用于创建、导出和显示 shell 变量的值。可以使用手册页了解许多剩余的 set选项和 declare命令。本教程后面部分将讨论 手册页

Exec

最后一个要介绍的命令是 exec。可使用 exec命令运行另一个程序来 取代当前 shell。清单 13启动了一个子 bash shell,然后使用 exec将它替换为一个 Korn shell。从 Korn shell 退出时,会返回到原始 bash shell(在本例中为 PID 2852)。

使用 exec
[ian@atticf20 ~]$ echo $$
3175
[ian@atticf20 ~]$ bash
[ian@atticf20 ~]$ echo $$
4994
[ian@atticf20 ~]$ exec ksh
$ echo $$
4994
$ exit
[ian@atticf20 ~]$ echo $$
3175

Linux 基础知识:学习容器之前的必备知识

为了获得部署、管理和维护现代云技术所需的技能,您需要了解大量有关当前主题的必备信息:Linux® 命令和概念。由于许多现代云技术都以 GNU/Linux 操作系统为核心,因此本教程将带您逐步了解 Linux 命令行界面 (CLI) 的一些基础知识,让您准备好使用 CLI。如果您是 Linux 新手,那么本教程可以为您提供简单的用法介绍。对于已经入门的用户,我希望本教程能使您想到一些命令概念,或许能向您介绍一些新知识。

文件和目录

我们首先专门介绍标准 GNU/Linux 操作系统的基本文件结构。标准 GNU/Linux 操作系统具有一种文件管理层次结构,用于组织计算机上存储的数据。确定特定数据的存储位置是开始了解操作系统的结构方式的初步课程之一。为了避免低估您现有的 Linux 体验,我暂时不讨论“Linux 文件系统层次结构简介”。更好的是,这里有一篇详实的文章,其中详细地介绍了文件系统层次结构。这里,我们假设您知道学习方法,所以我将向您提供一些有关如何轻松浏览的提示(或者可能是一些提醒)。当您需要编辑文件,浏览文件系统,进行更改或观察配置时,您将需要此技能。

使用 cd 更改目录

cd 命令用于在终端 shell中从当前目录更改为所需目录。浏览 GNU/Linux 文件系统的目录结构时,会频繁用到此命令。语法如下所示:

$ cd [directory]

显示更多

[directory] 参数是指您想要更改到的所需目录或目标目录,并且可以通过多种方式提供通过文件系统层次结构到达该目录的路径

  1. 绝对路径
  2. 相对路径
  3. 波浪号扩展
  4. 特殊索引节点

绝对路径

绝对路径是从根目录(通常用 / 表示)到文件系统层次结构中存在的目标目录或目标文件的“完整路径”。 下面的简明示例展示了绝对路径:

如果用户名是 jsmith,那么在标准 GNU/Linux 操作系统上,到其主目录的绝对路径将为:

/home/jsmith

简明提示:在标准 GNU/Linux 操作系统上,您可以通过在命令提示符下键入 cd 进入主目录,不必指定目标目录。

在上面提供的示例中,到目标目录的路径都相当短,但是在很多情况下,到目录的路径可能很长。在本文中,我们将使用如下所示的文件系统层次结构:

采用这种目录结构,到 pacific_rose 文件的绝对路径将如下所示:

/home/jsmith/grocery_store/foods/produce/fruits/apples/pacific_rose

相对路径

GNU/Linux 操作系统的真正强大之处在于其命令行界面 (CLI)。在 Linux 上执行任务常常会使用可输入命令的 CLI。每次需要时在命令行中键入完整路径会很麻烦,这时,相对路径便为我们提供了一些支持。

相对路径定义为目标目录(或文件)相对于当前工作目录的路径。我们再次使用上面的例子。如果当前工作目录为 /home/jsmith/grocery_store/foods/produce/ 目录,那么进入 fruits 目录便很简单了:

$ cd fruits

由于当前工作目录包含 fruits 子目录,因此上述命令有效,因为它使用相对路径。只要未在 cd 命令旁边指定绝对路径,您就几乎可以将其描述为操作系统做出的“假设”。现在您已经导航到 fruits 目录,所以可以使用 pwd 命令查看此目录的完整路径:

$ pwd
/home/jsmith/grocery_store/foods/produce/fruits

pwd(或打印工作目录)命令对于查看当前工作目录非常方便(通常以绝对路径格式显示)。此命令显示了如何使用绝对路径和相对路径浏览文件系统层次结构。

波浪号扩展

为了让更方便地浏览文件层次结构(特别是在用户的主目录下创建的文件层次结构),包含 Bash Shell 的标准 GNU/Linux 操作系统为我们提供了波浪号扩展,也可以帮助我们。为了说明波浪号扩展的含义,我们来看看下面的示例:

$ cd ~

以上命令中的波浪号 ~ 字符映射到 $HOME 环境变量的值,此值通常设置为当前用户的主目录。这意味着该变量的值将根据当前登录的用户而更改。在同一系统上,对于 Jane Smith,cd ~ 命令会进入 /home/jsmith 目录,而对于 Mark Jones(以用户名 mjones 登录),同样的命令会进入 /home/mjones目录。

下面是一些使用波浪号扩展的示例:

  • ~ – 映射到 $HOME 目录
  • ~/grocery_store – $HOME 目录中存在的 grocery_store 子目录
  • ~mjones/grocery_store – mjones 用户的 $HOME 目录中专门存在的 grocery_store 子目录

特殊索引节点

为了深入探讨,我们简单谈谈索引节点。按照 Ian D. Allen 的定义:“在 Unix 上,组成目录或文件内容的数据集合不以某个名称存储;数据存储为称为数据结构的一部分,也称为索引节点。”简而言之,目录和文件是映射到索引节点编号的名称,并且有许多“特殊索引节点”可用于浏览文件系统层次结构。为了说明,请看下面的示例:

..(双点)索引节点可用于更改到文件系统层次结构中的父目录(上移一层):

$ cd ..

您还可以通过将 ..(双点)索引节点连接在一起,从而在文件系统层次结构中上移多层:

$ pwd
/home/jsmith/grocery_store/foods/produce/fruits
$ cd ../../
$ pwd
/home/jsmith/grocery_store/foods
$

在这里,我们将文件系统层次结构从 fruits 目录上移到 foods 目录(上移两层)。

-(短横线)可用于切换到上一个工作目录:

$ cd -

如果您需要从一个目录浏览到另一个目录然后再返回,那么无论当前在文件系统层次结构中的哪个位置,都可以使用 -(短横线)返回到上一个工作目录。

使用 pushd/popd 更改目录

这为我们提供了 Linux 用户可用来浏览文件系统层次结构的另一种方法:pushdpopd 和 dirs 命令。这三个 shell 内置命令允许您操作目录堆栈,也就是最近访问过的目录的列表。用于存储最近访问过的目录列表的数据结构实际上是堆栈或 LIFO(后进先出)数据结构。pushd 可将当前目录更改为目标目录,并将这个新目录添加到堆栈中,而 popd 会删除堆栈顶部列出的目录,然后将目录更改为堆栈顶部的目录。

根据我的个人经验,pushd 和 popd 命令是我在自动化脚本中最常用的命令,这是一种创建所访问目录的“面包屑痕迹”的方式。当自动化任务要求您以特定方式或特定顺序更改文件(和目录)时,使用此列表将有所帮助。先前访问过的目录可以从堆栈中剥离并且可以轻松地重新访问。

dirs 命令是我最近偶尔使用的命令,但这个命令也很好用。此命令可用于查看目录堆栈自身,以查看最近访问过的目录的列表。此命令还有一些选项,可用于根据需要来管理堆栈。下面是 pushdpopd 和 dirs 命令用法的示例:

从 /home/jsmith/grocery_store/foods/ 开始,我们将使用 pushd 来切换到 produce 目录:

$ pushd produce

当前目录现在是 /home/jsmith/grocery_store/foods/produce 目录,由于我们已经使用了 pushd 来切换到此目录,所以这个目录已经被添加到目录堆栈中,如 dirs 命令所示:

$ dirs
/home/jsmith/grocery_store/foods/produce /home/jsmith/grocery_store/foods
$

注意,目录的列表(从左到右)是按照最近访问的时间列出的。我们将再次使用 pushd 来进入 meats 目录,然后再次查看目录堆栈:

$ pushd /home/jsmith/grocery_store/foods/meats
$ dirs
/home/jsmith/grocery_store/foods/meats /home/jsmith/grocery_store/foods/produce /home/jsmith/grocery_store/foods
$

目录列表现在已经增长为 3 个最近访问过的目录。现在,如果我们使用 popd命令,则将删除堆栈顶部列出的目录,并将当前目录更改回 /home/jsmith/grocery_store/foods/produce,因为它现在是目录堆栈顶部列出的目录:

$ popd
$ pwd
/home/jsmith/grocery_store/foods/produce

再看一下目录堆栈,我们会发现,该列表又回到了最近访问的两个目录:

$ dirs
/home/jsmith/grocery_store/foods/produce /home/jsmith/grocery_store/foods
$

在接下来的文章和教程中,轻松地浏览目录结构肯定是不可或缺的方便技能,希望这篇关于浏览文件系统层次结构的简要介绍已经足够吸引您深入研究。

创建目录

我们已经讨论了目录浏览,现在让我们快速地介绍目录创建,可以通过 mkdir命令来创建目录:

$ mkdir [target]

在这一示例中,[target] 是您希望创建的目录的名称。执行后,mkdir 将在当前工作目录中创建此目录(因为未指定完整路径)。您还可以在文件系统层次结构的任何级别创建新目录,只要可以确定完整路径,并且您的用户帐户具有执行此操作的权限。例如:

$ mkdir /home/jsmith/grocery_store/foods/produce/veggies

这将在 home/jsmith/grocery_store/foods/produce 目录中创建 veggies 目录。通常,您可能需要在文件系统层次结构中的同一级别上创建多个目录,在某些情况下,甚至需要创建全新的目录结构。此时,-p 命令选项就很有用了。下面是一个更高级的示例:

$ mkdir -p /home/jsmith/grocery_store/foods/meats/{beef,fish,chicken,pork/{bacon,sausage}}

在此示例中,有几个概念在起作用。首先,-p 选项允许我们创建指定的“路径”,无论此路径中的目录先前是否已创建。使用括号,可以同时创建多个目录。这里,我们已经在 meats 目录中(并非先前创建的目录)创建了 beeffishchicken 和 pork 子目录。此外,我们还继续在 pork 目录下创建了两个子目录:bacon 和 sausage 子目录。 这样,您可以轻松地看到起作用的命令行的强大功能,只需一个命令即可创建全新的目录结构。

有关 mkdir 命令的更多信息,请参阅这篇有关如何使用 mkdir 创建目录的 lifewire 文章

查看文件和目录

我们讨论了如何在标准 GNU/Linux 操作系统上浏览和创建目录。现在,我们将讨论如何列出目录、查看文件和编辑文件。除了基于 GUI 的应用程序之外,还有几种直接从 CLI 查看文件和目录的方法。

使用 ls 查看目录内容

可以采用多种方法来使用 ls 命令查看目录内容。命令提示符下的简单 ls 以水平方式显示当前工作目录的内容:

$ ls

还有几个常用的命令选项。例如,向命令中添加一个 -l 标志以显示目标目录的内容,包括文件/目录名称、权限、所有者、修改日期和文件/目录大小:

$ ls -l

-a 选项可显示目录的内容,包括隐藏文件,隐藏文件是指主要用于桌面的自定义和个性化以及用于应用程序配置的文件:

$ ls -a

ls 的不常用命令选项

我们目前介绍的 ls 命令选项都是广泛采用的选项。然而,还有一些选项也很好用。下面是这些命名的简要列表:

ls 命令描述
ls -lh通过将 -l 与 -h 组合,以“人类可读”格式来显示文件/目录大小。
ls -F向输出中列出的子目录中附加 /
ls -R以递归方式列出子目录的内容
ls -r以相反的顺序显示输出
ls -lS显示按文件大小排序的输出,最先显示最大的文件
ls -ltr将 -l-t 和 -r 选项组合可显示按修改日期排序的输出,最新的文件最后显示

使用 cat 查看文件

要查看文件内容,最简单的命令之一是 cat 命令。cat 是“concatenate(拼接)”的缩写,不仅用于查看文件的内容,还用于通过重定向输出来创建文件:

$ cat pacific_rose
This is a test file.
$

在这里,pacific_rose 文件包含文本“This is a test file.”cat 直接在终端窗口中显示此文件的内容,这是查看所包含内容的快速、简便方法。

重定向运算符组合后,您也可以使用 cat 来创建文件:

$ cat > granny_smith

以上命令将在当前工作目录中创建一个名为 granny_smith 的新文件。

$ cat apple1.txt apple2.txt apple3.txt > three_apples.txt

如前所述,cat 是“concatenate(拼接)”的缩写,上面的示例说明了如何使用 > 重定向运算符将多个文件的内容组合成一个文件。

下面列出的命令标志(或选项)也可以方便地与 cat 命令一起使用:

  • cat -n 将在文件输出旁边显示行号。
  • cat -e 将在文件输出中显示行结尾和行空白,通常以 $ 字符表示。
  • cat -T 将在文件输出中显示以制表符分隔的行。

有关如何使用 cat 命令的更多提示,请查看这篇有关 cat 命令的 LINFO 文章

使用 more/less 查看文件

要在终端中直接查看文件,另外两种方法是使用 more 和 less 命令。more 和 less 都允许您查看文件的内容,在文件内容填满屏幕缓冲区时暂停文件输出。您可以选择在此时暂停,或按任意键继续查看剩余的输出。但是,less命令略有不同。虽然在查看文件方面,less 命令与 more 命令功能相同,但使用 less,您还可以在输出中后退,而 more 命令只允许向前查看输出。

终端文本编辑器 (vim/emacs/pico)

在实践中学习时,学习 Linux 通常需要您进行更改,以便创建配置文件、更新配置文件和/或从配置文件中删除信息。这些操作都可以通过使用大多数 Linux 操作系统上提供的文本编辑器来完成。这些文本编辑器包括:

  • vi/vim
  • emacs
  • pico

每个编辑器都有自己的优点、缺点和特色。下面是一个简短的资源列表,并非吹嘘这个编辑器比另一个编辑器更强大,而是为您提供每个编辑器的提示/技巧:

vi/vim:

emacs

pico

文件权限

作为 Linux 用户,我们可以精细地控制您作为用户可以对 Linux 操作系统上存储的文件执行的操作。在许多情况下,应该为文件和目录设置一定级别的权限才能让文件和目录生效,例如,让某个脚本变为可执行。我们简要介绍一下文件权限。

$ ls -l
-rw-r--r--  1 jdoe  staff  0 Mar 15 08:30 brisket.txt
-rw-r--r--  1 jdoe  staff  0 Mar 15 08:30 ground.txt
-rw-r--r--  1 jdoe  staff  0 Mar 15 08:30 ribs.txt
-rw-r--r--  1 jdoe  staff  0 Mar 15 08:30 tar_tar.txt

在此示例目录列表中,文件权限由 -rw-r--r-- 数据表示,将为目录中包含的每个文件提供此数据。在文件和目录上为 3 个帐户角色设置了权限:用户、组和其他(即其他所有人)。可以授予的权限为读 (r)、写 (w) 和执行 (x)。为了说明这一点,我们看看下表,其描述了对每个文件应用权限的方式(根据访问文件的帐户和组):

如果我们从左到右阅读 brisket.txt 文件的文件权限(并且忽略第一个 - 字符),那么文件权限如下所示:

用户其他
rw (读写)r (读)r (读)

对文件或目录的完全访问权限将表示为 rwx。在此示例中,用户 jdoe 具有读写权限,staff 组具有读权限,所有其他用户均具有读权限。为了理解 UGO(用户、组、其他)的概念,我建议您通读浅析 Linux 文件权限一文以进行更深入了解。

使用 chmod 更改权限

在某些情况下,需要修改应用于文件的权限。这时候,chmod 命令就派上用场了。如上所述,可以通过更改权限使 bash 脚本可执行(即,可以通过在命令行上调用脚本自身来“运行”):

$ ls -l script_to_run.sh
-rw-r--r--  1 jdoe  staff  0 Mar 15 13:33 script_to_run.sh
$ chmod u+x script_to_run.sh
$ ls -l script_to_run.sh
-rwxr--r--  1 jdoe  staff  0 Mar 15 13:33 script_to_run.sh

在以上示例中,script_to_run.sh 现在已经为用户添加了 +x 属性。 这意味着脚本现在可以由用户 jdoe 执行。

$ chmod ug+x script_to_run.sh
$ ls -l script_to_run.sh
-rwxr-xr--  1 jdoe  staff  0 Mar 15 13:33 script_to_run.sh

以上示例将 u(用户)和 g(组)与 chmod 命令一起使用,说明了您还可以如何将帐户角色合并到一起来并行修改文件权限。+ 字符添加可执行属性,相比之下,- 字符可删除此属性:

$ ls -l script_to_run.sh
-rwxr-xr--  1 jdoe  staff  0 Mar 15 13:33 script_to_run.sh
$ chmod ug-x script_to_run.sh # note the - character here
$ ls -l script_to_run.sh
-rw-r--r--  1 jdoe  staff  0 Mar 15 13:33 script_to_run.sh

如您所见,chmod 是一个非常好用的命令,可用于根据需要微调文件权限。

基本的 Docker 命令

我们讨论了许多命令行示例,这些示例可以让您快速入门,让您在使用标准 GNU/Linux 操作系统时轻松浏览文件系统、查看和创建文件和目录以及自定义终端 shell。但是,由于本教程是作为深入研究更高级的 Docker、Kubernetes 和 Istio 教程和 Code Pattern 的入门材料,因此,我们简要列出一些 Docker 命令以帮助您入门:

构建 Docker 镜像

命令描述
docker images列出本地存储的镜像
docker rmi [IMG]从本地镜像存储库中删除 [IMG] 镜像
docker build -t [TAG] .通过当前工作目录中的 Dockerfile 构建一个 Docker 镜像,并将其标记为 [TAG]

运行 Docker 镜像

命令描述
docker run --name [CNT]运行一个容器并将其命名为 [CNT]
docker run -it附加到容器的终端会话
docker rm -f $(docker ps -aq)删除所有容器
docker ps列出正在运行的容器

发放 Docker 镜像

命令描述
docker pull从容器注册表中拉取镜像
docker push [IMG]将名为 [IMG] 的镜像推送到注册表

基本的 Kubernetes 命令

我们已经介绍了一些基本的 Docker 命令,我们再看几个对您有所帮助的好用 Kubernetes 命令。Kubernetes 采用 kubectl,这是一个针对 Kubernetes 集群运行命令的命令行界面工具。在下面,您将找到一些常用命令的简短列表,这些命令用于从 Kubernetes 部署中更新和/或提取数据:

列出 Kubernetes 资源

命令描述
kubectl get services列出当前名称空间中的所有 Kubernetes 服务
kubectl get pods --all-namespaces列出所有名称空间中的所有 Pod
kubectl get pods -o wide从当前名称空间生成更详细的 Pod 输出
kubectl describe nodes [node-name]显示节点 [node-name] 的简要描述
kubectl describe pods [pod-name]显示 Pod [pod-name] 的简要描述

操作 Kubernetes 资源

命令描述
kubectl create deployment foo --image=foo部署 foo 的单个实例
kubectl create -f ./local-manifest.yaml通过名为 local-manifest.yaml 的 Kubernetes 清单文件创建资源
kubectl delete -f ./bar.json删除名为 bar.json 的文件中定义的 Pod
kubectl delete pod,service silver gold删除名称为 silver 和 gold 所有 Pod 和服务

有关 kubectl 命令的完整列表,请参阅:https://kubernetes.io/docs/reference/kubectl/cheatsheet/

结束语

本教程旨在作为命令行预热,随着您继续学习诸如 DockerKubernetes 和 Istio 等容器技术,实现自我突破。在学习新技能之前,重温基础知识可能更有意义,我希望本教程中介绍的主题可以帮助您复习已掌握的知识或学习新知识。

后续步骤

完成本教程后,请务必查看 Kubernetes 学习路径中的后续步骤。如果您喜欢使用容器,还可以查看以下资源和 Code Pattern。