find -iname "MyProgram.c"
。find -iname "MyProgram.c" -exec md5sum {} \;
。find ~ -empty
。【常用】如何在 /usr 目录下找出大小超过 10MB 的文件?
find /usr -type f -size +10240k
命令。
另外,du 命令也可以做类似的事情,可以看看 《查找 Linux 系统中的占用磁盘空间最大的前 10 个文件或文件夹》 文章。
如何在 /var 目录下找出 90 天之内未被访问过的文件?
find /var \! -atime -90
。如何在 /home 目录下找出 120 天之前被修改过的文件?
find /home -mtime +120
。在整个目录树下查找文件 “core” ,如发现则无需提示直接删除它们?
find / -name core -exec rm {} \;
。ls -lh
。ls -ltr
。ls -F
。pwd
。cd
:可以在最近工作的两个目录间切换。mkdir ~/temp
。-p
选项可以创建一个路径上所有不存在的目录:mkdir -p dir1/dir2/dir3/dir4/
。df -k
将以字节为单位输出磁盘的使用量。df -h
选项可以以更符合阅读习惯的方式显示磁盘使用量。df -T
选项显示文件系统类型。rm -i filename.txt
。rm -i file*
。rm -r example
。mv -i file1 file2
。-v
会输出重命名的过程,当文件名中包含通配符时,这个选项会非常方便:mv -v file1 file2
。cp -p file1 file2
。cp -i file1 file2
。有一普通用户想在每周日凌晨零点零分定期备份 /user/backup到 /tmp 目录下,该用户应如何做?
相比来说,rsync
比 scp
的性能更好。具体可以看看 《scp 与 rsync 性能实测》 文章。
cat file1 file2
。-n
命令可以在每行的前面加上行号:cat -n /etc/logrotate.conf
。如何看当前 Linux 系统有几颗物理 CPU 和每颗 CPU 的核数?
[root@centos6 ~ 10:55 #35]# cat /proc/cpuinfo|grep -c 'physical id'
4
[root@centos6 ~ 10:56 #36]# cat /proc/cpuinfo|grep -c 'processor'
4
tail filename.txt
。-n
选项指定要显示的行数:tail -n N filename.txt
。-f
选项进行实时查看,这个命令执行后会等待,如果有新行添加到文件尾部,它会继续输出新的行,在查看日志时这个选项会非常有用。你可以通过 CTRL-C
终止命令的执行:tail -f log-file
。less huge-log-file.log
。
grep -i "the" demo_file
。grep -A 3 -i "example" demo_text
。grep -r "ramesh" *
。\r\n
结尾,sed 可以轻易将其转换为 Unix 格式的文件,使用\n
结尾的文件:sed 's/.$//' filename
。sed -n '1!G; h; p' filename
。sed '/./=' thegeekstuff.txt | sed 'N; s/\n/ /'
。用 sed 命令将指定的路径 /usr/local/http 替换成为 /usr/src/local/http ?
[root@centos7 ~]# echo "/usr/local/http/" | sed 's#/usr/local/#/usr/src/local/#'
打印 /etc/ssh/sshd_config 的第一百行?
sed -n '100p' /etc/ssh/sshd_config
用 sed 命令永久关闭防火墙?
[root@centos7 ~]# sed -i.bak 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
[root@centos7 ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
可能会有胖友刚开始会懵逼,awk 和 sed 命令不是类似的么,那么就可以看看 《【总结】awk 与 sed 的区别》 。
打印 /etc/passwd 的 1 到 3 行?
vim +10 filename.txt
。vim +/search-term filename.txt
。vim -R /etc/passwd
。貌似不太常用,当学习下。
diff -w name_list.txt name_list_new.txt
。貌似不太常用,当学习下。
sort names.txt
。sort -r names.txt
。/etc/passwd
的内容排序:sort -t: -k 3n /etc/passwd | more
。**
ls *.jpg | xargs -n1 -i cp {} /external-hard-drive/directory
。find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz
。cat url-list.txt | xargs wget –c
。? 把当前目录下所有后缀名为 .txt 的文件的权限修改为 777 ?
find ./ -type f -name "*.txt" |xargs chmod 777
。find ./ -type f -name "*.txt" -exec chmod 777 {}
。tar cvf archive_name.tar dirname/
。tar xvf archive_name.tar
。tar tvf archive_name.tar
。*.gz
的压缩文件:gzip test.txt
。*.gz
文件:gzip -d test.txt.gz
。gzip -l *.gz
。*.bz2
压缩文件:bzip2 test.txt
。*.bz2
文件:bzip2 -d test.txt.bz2
。*.zip
文件:unzip test.zip
。*.zip
文件的内容:unzip -l jasper.zip
。export | grep ORCALE
。export ORACLE_HOME=/u01/app/oracle/product/10.2.0
。kill 用于终止一个进程。一般我们会先用 ps -ef
查找某个进程得到它的进程号,然后再使用 kill -9
进程号终止该进程。你还可以使用killall、pkill、xkill 来终止进程
艿艿:注意,
-9
表示强制终止指定进程。实际场景下,不会这么做。 但一般情况下,只需要kill 进程编号
就可结束。
$ ps -ef | grep vim
ramesh 7243 7222 9 22:43 pts/2 00:00:00 vim
$ kill -9 7243
passwd
。passwd USERNAME
。passwd -d USERNAME
。su - USERNAME
。
su -s 'SHELLNAME' USERNAME
。
yum install httpd
。yum update httpd
。yum remove httpd
。rpm -ivh httpd-2.2.3-22.0.1.el5.i386.rpm
。rpm -uvh httpd-2.2.3-22.0.1.el5.i386.rpm
。rpm -ev httpd
。shutdown -h now
。shutdown -h +10
。shutdown -r now
。shutdown -Fr now
。crontab -u user -l
。*/10 * * * * /home/ramesh/check-disk-space
。【前提是,在 crontab 下】/etc/init.d
文件下,这个命令可以直接运行这个文件夹里面的脚本,而不用加上路径。service ssh status
。service --status-all
。service ssh restart
。另外,使用 chkconfig 命令,可以设置服务在系统启动时,是否自动启动。详细的,见 《Linux 命令大全 —— chkconfig 命令》 文章。
chmod ug+rwx file.txt
。chmod g-rwx file.txt
。chmod -R ug+rwx file.txt
。chown oracle:dba dbora.sh
。-R
选项对目录和目录下的文件进行递归修改:chown -R oracle:dba /home/oracle
。uname -a
。whereis ls
。-B
选项,并指定目录作为这个选项的参数。下面的命令在 /tmp
目录下查找 lsmk 命令:whereis -u -B /tmp -f lsmk
。locate crontab
。另外,胖友如果使用 CentOS 找不到 locate 命令,可以看看 《CentOS 系统找到 locate 命令及 locate 搜索不到存在的文件》 文章。
man crontab
。
man SECTION-NUMBER commandname
。
whatis crontab
,你可以看到 crontab 有两个命令类型 1 和 5 ,所以我们可以通过下面的命令查看命令类型 5 的 man 页面:
$ whatis crontab crontab (1) - maintain crontab files for individual users (V3) crontab (5) - tables for driving cron $ man 5 crontab
ifconfig -a
。ifconfig eth0 up
和 ifconfig eth0 down
。用一条命令显示本机 eth0 网卡的 IP 地址,不显示其它字符?
ping -c 5 gmail.com
。如何禁止服务器被 ping ?
[root@node0 ~]# echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all // 这个时候,别人是可以 ping 通自己的
[root@node1 ~]# ping 192.168.6.6
PING 192.168.6.6 (192.168.6.6) 56(84) bytes of data.
64 bytes from 192.168.6.6: icmp_seq=1 ttl=64 time=1.79 ms
64 bytes from 192.168.6.6: icmp_seq=2 ttl=64 time=0.597 ms
[root@node0 ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
[root@node1 ~]# ping 192.168.6.6 // ping 不能了
PING 192.168.6.6 (192.168.6.6) 56(84) bytes of data.
--- 192.168.6.6 ping statistics ---
93 packets transmitted, 0 received, 100% packet loss, time 92168ms
如果我们使用 ping 测试某个地址是否能连接,那么 curl 测试用个 URL 是否可以访问。
写出一个 curl 命令,访问指定服务器 61.135.169.121 上的如下 URL :http://www.baidu.com/s?wd=test ,访问的超时时间是 20 秒
curl --connect-timeout 20 http://61.135.169.121/s?wd=test
。wget http://prdownloads.sourceforge.net/sourceforge/nagios/nagios-3.2.1.tar.gz
。wget -O taglist.zip http://www.vim.org/scripts/download_script.php?src_id=7701
。ssh username@remotehost.example.com
。ssh -V
。##【重要】服务器状态相关
通过如下命令,我们可以知道 Linux 服务器运行情况,从而可以排查性能的情况。
因为我们是每小节一个命令,胖友后面可以看看 《Linux 性能分析工具介绍(CPU,内存,磁盘 I/O,网络)》 文章,它将本小节的命令,又做了一次归类,和介绍。所以,可以结合着一起读读。
ps -ef | more
。ps -efH | more
。查看后台所有 java 进程?
ps -ef |grep java
。jps -m
。这个命令可以快速查看机器的负载情况。在 Linux 系统中,这些数据表示等待 CPU 资源的进程和阻塞在不可中断 IO 进程(进程状态为 D)的数量。这些数据可以让我们对系统资源使用有一个宏观的了解。
命令的输出分别表示 1 分钟、5 分钟、15 分钟的平均负载情况。通过这三个数据,可以了解服务器负载是在趋于紧张还是趋于缓解。
另外,还有一个 《Linux 命令大全 —— w 命令》 ,也是使用比较方便的,快速查看系统负载情况的命令。
该命令会输出系统日志的最后 10 行。示例中的输出,可以看见一次内核的 oom kill 和一次 TCP 丢包。这些日志可以帮助排查性能问题。千万不要忘了这一步。
vmstat 命令,每行会输出一些系统核心指标,这些指标可以让我们更详细的了解系统状态。后面跟的参数 1 ,表示每秒输出一次统计信息,表头提示了每一列的含义,这几介绍一些和性能调优相关的列:
上述这些 CPU 时间,可以让我们很快了解 CPU 是否处于繁忙状态。一般情况下,如果用户时间和系统时间相加非常大,CPU 出于忙于执行指令。如果IO等待时间很长,那么系统的瓶颈可能在磁盘 IO 。
示例命令的输出可以看见,大量 CPU 时间消耗在用户态,也就是用户应用程序消耗了 CPU 时间。这不一定是性能问题,需要结合 r 队列,一起分析。
该命令可以显示每个 CPU 的占用情况,如果有一个 CPU 占用率特别高,那么有可能是一个单线程应用程序引起的。
pidstat 命令输出进程的 CPU 占用率,该命令会持续输出,并且不会覆盖之前的数据,可以方便观察系统动态。如上的输出,可以看见两个 JAVA 进程占用了将近 1600% 的CPU时间,既消耗了大约 16 个 CPU 核心的运算资源。
如果显示的是逻辑设备的数据,那么设备利用率不代表后端实际的硬件设备已经饱和。值得注意的是,即使 IO 性能不理想,也不一定意味这应用程序性能会不好,可以利用诸如预读取、写缓存等策略提升应用性能。
free 命令可以查看系统内存的使用情况,-m
参数表示按照兆字节展示。最后两列分别表示用于IO缓存的内存数,和用于文件系统页缓存的内存数。需要注意的是,第二行 -/+ buffers/cache
,看上去缓存占用了大量内存空间。
这是 Linux 系统的内存使用策略,尽可能的利用内存,如果应用程序需要内存,这部分内存会立即被回收并分配给应用程序。因此,这部分内存一般也被当成是可用内存。
如果可用内存非常少,系统可能会动用交换区(如果配置了的话),这样会增加 IO 开销(可以在 iostat 命令中体现),降低系统性能。
【重要】Linux系统里,您知道 buffer 和 cache 如何区分吗?
Buffer 和 Cache 都是内存中的一块区域。
详细的,可以看看 《Linux中 buffer/cache、swap、虚拟内存和Page》 。
TCP 连接数可以用来判断性能问题是否由于建立了过多的连接,进一步可以判断是主动发起的连接,还是被动接受的连接。TCP 重传可能是因为网络环境恶劣,或者服务器压力。
我们可以使用哪个命令查看系统的历史负载(比如说两天前的)?
sar -q -f /var/log/sa/sa22 # 查看 22 号的系统负载
top 命令包含了前面好几个命令的检查的内容。比如系统负载情况(uptime)、系统内存使用情况(free)、系统 CPU 使用情况(vmstat)等。因此通过这个命令,可以相对全面的查看系统负载的来源。同时,top 命令支持排序,可以按照不同的列排序,方便查找出诸如内存占用最多的进程、CPU占用率最高的进程等。
但是,top 命令相对于前面一些命令,输出是一个瞬间值,如果不持续盯着,可能会错过一些线索。这时可能需要暂停 top 命令刷新,来记录和比对数据。
如何查看系统都开启了哪些端口?
[root@centos6 ~ 13:20 #55]# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1035/sshd
tcp 0 0 :::22 :::* LISTEN 1035/sshd
udp 0 0 0.0.0.0:68 0.0.0.0:* 931/dhclient
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 6825 1/init @/com/ubuntu/upstart
unix 2 [ ACC ] STREAM LISTENING 8429 1003/dbus-daemon /var/run/dbus/system_bus_socket
[root@centos6 ~ 13:22 #58]# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 192.168.147.130:22 192.168.147.1:23893 ESTABLISHED
tcp 0 0 :::22 :::* LISTEN
udp 0 0 0.0.0.0:68 0.0.0.0:*
// ... 省略其它
如何统计系统当前进程连接数?
netstat -an | grep ESTABLISHED | wc -l
。177
。一共有 177 连接数。用 netstat 命令配合其他命令,按照源 IP 统计所有到 80 端口的 ESTABLISHED 状态链接的个数?
严格来说,这个题目考验的是对 awk 的使用。
netstat -an|grep ESTABLISHED
命令。结果如下:
tcp 0 0 120.27.146.122:80 113.65.18.33:62721 ESTABLISHED tcp 0 0 120.27.146.122:80 27.43.83.115:47148 ESTABLISHED tcp 0 0 120.27.146.122:58838 106.39.162.96:443 ESTABLISHED tcp 0 0 120.27.146.122:52304 203.208.40.121:443 ESTABLISHED tcp 0 0 120.27.146.122:33194 203.208.40.122:443 ESTABLISHED tcp 0 0 120.27.146.122:53758 101.37.183.144:443 ESTABLISHED tcp 0 0 120.27.146.122:27017 23.105.193.30:50556 ESTABLISHED // ... 省略其它
netstat -an|grep ESTABLISHED|grep ":80"|awk 'BEGIN{FS="[[:space:]:]+"}{print $4}'
命令。结果如下:
120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 120.27.146.122 10.47.111.216 // ... 省略其它
FS
是字段分隔符,简单的可以用多个 awk 过滤。netstat -an|grep ESTABLISHED|grep ":80"|awk 'BEGIN{FS="[[:space:]:]+"}{print $4}'|sort|uniq -c|sort -nr
命令。结果如下:
47 120.27.146.122 1 10.47.111.216
虽然我们这里罗列了很多的命令,下面,还是会有其它命令。
从大的方面讲,Linux 体系结构可以分为两块:Linux 体系结构
? 为什么 Linux 体系结构要分为用户空间和内核空间的原因?
用户空间和内核空间是程序执行的两种不同的状态,我们可以通过两种方式完成用户空间到内核空间的转移:1)系统调用;2)硬件中断。
了解即可。
Linux 系统的核心是内核。内核控制着计算机系统上的所有硬件和软件,在必要时分配硬件,并根据需要执行软件。
详细的,可以看看 《是时候深入了解 Linux 的系统结构了》 。
了解即可。
Linux系 统缺省的运行级别?
了解即可,不需要太深入。
详细的,可以看看:
参见 《Linux 系统日志及日志分析》 文章,比较重要的是 /var/log/messages
日志文件。
该日志文件是许多进程日志文件的汇总,从该文件可以看出任何入侵企图或成功的入侵。 另外,如果胖友的系统里有 ELK 日志集中收集,它也会被收集进去。
艿艿:选读,面试不问。作为一个知识点,比较底层~
直接看 《虚拟内存的那点事儿》 文章。
在 Linux 操作系统中,所有被操作系统管理的资源,例如网络接口卡、磁盘驱动器、打印机、输入输出设备、普通文件或是目录都被看作是一个文件。
也就是说在 Linux 系统中有一个重要的概念:一切都是文件。其实这是 Unix 哲学的一个体现,而 Linux 是重写 Unix 而来,所以这个概念也就传承了下来。在 Unix 系统中,把一切资源都看作是文件,包括硬件设备。UNIX系统把每个硬件都看成是一个文件,通常称为设备文件,这样用户就可以用读写文件的方式实现对硬件的访问。
Linux 支持 5 种文件类型,如下图所示:
艿艿:这个问题,一般不会问。更多是实际使用时,需要知道。
Linux 文件系统的结构层次鲜明,就像一棵倒立的树,最顶层是其根目录:
常见目录说明:
艿艿:一般来说,面试不会问 inode 。但是 inode 是一个重要概念,是理解 Unix/Linux 文件系统和硬盘储存的基础。
查看 《理解 inode》 文章。
简述 Linux 文件系统通过 i 节点把文件的逻辑结构和物理结构转换的工作过程?
如果看的一脸懵逼,也没关系。一般来说,面试官不太会问这个题目。
Linux 通过 inode 节点表将文件的逻辑结构和物理结构进行转换。
1)硬链接
由于 Linux 下的文件是通过索引节点(inode)来识别文件,硬链接可以认为是一个指针,指向文件索引节点的指针,系统并不为它重新分配 inode 。每添加一个一个硬链接,文件的链接数就加 1 。
2)软链接
软链接克服了硬链接的不足,没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接。
实际场景下,基本是使用软链接。详细的,胖友可以看看 《关于硬链接和软连接(符号链接)的区别》 。总结区别如下:
RAID 全称为独立磁盘冗余阵列(Redundant Array of Independent Disks),基本思想就是把多个相对便宜的硬盘组合起来,成为一个硬盘阵列组,使性能达到甚至超过一个价格昂贵、 容量巨大的硬盘。RAID 通常被用在服务器电脑上,使用完全相同的硬盘组成一个逻辑扇区,因此操作系统只会把它当做一个硬盘。 RAID 分为不同的等级,各个不同的等级均在数据可靠性及读写性能上做了不同的权衡。在实际应用中,可以依据自己的实际需求选择不同的 RAID 方案。
详细的,胖友可以看看 《RAID 技术介绍和总结》 。当然,因为很多公司都使用云服务,大家很难接触到 RAID 这个概念,更多的可能是普通云盘、SSD 云盘酱紫的概念。
iptables ,是一个配置 Linux 内核防火墙的命令行工具。功能非常强大,对于我们开发来说,主要掌握如何开放端口即可。例如:
iptables -I INPUT -s 192.168.1.101 -p tcp --dport 80 -j REJECT
。
iptables save
命令,进行保存。否则,服务器重启后,配置的规则将丢失。
详细的,可以看看:
添加一条到 192.168.3.0/24 的路由,网关为 192.168.1.254 ?
route add -net 192.168.3.0/24 netmask 255.255.255.0 gw 192.168.1.254
。查看本机路由的三种方式?
[root@centos6 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.220.0 0.0.0.0 255.255.255.0 U 1 0 0 eth1
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
0.0.0.0 172.16.0.1 0.0.0.0 UG 0 0 0 eth0
[root@centos6 ~]# netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.220.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
0.0.0.0 172.16.0.1 0.0.0.0 UG 0 0 0 eth0
[root@centos6 ~]# ip route
192.168.220.0/24 dev eth1 proto kernel scope link src 192.168.220.157 metric 1
169.254.0.0/16 dev eth0 scope link metric 1002
172.16.0.0/16 dev eth0 proto kernel scope link src 172.16.251.6
default via 172.16.0.1 dev eth0 proto static
在 Linux 系统下如何按照下面要求抓包:只过滤出访问 HTTP 服务的,目标 IP 为 192.168.0.111 ,一共抓 1000 个包,并且保存到 1.cap 文件中??
tcpdump -nn -s0 host 192.168.0.111 and port 80 -c 1000 -w 1.cap
参见文章 《Linux 设置静态IP》 。这是一个必备技能。
是否可以给一个网卡配置多个 IP?
可以,参见文章 《Linux 下一个网卡配置多个 IP【虚拟ip】》 。不过,一般比较少这么做。更多的是,一台服务器有两个网卡,配置了两个不同的 IP 。
如何查看某个网卡是否连接着交换机?
艿艿:原来还有酱紫的命令!学习到新技能了。 不过阿里云不支持酱紫的操作。
mii-tool eth0
或者 mii-tool eth1
。
/etc/resolv.conf
文件中配置。/etc/sysconfig/network-scripts/ifcfg-eth0
文件中配置。/etc/hosts 文件什么做用?
在 /etc/hosts
文中,我们可以配置指定域名和 IP 的映射关系。详细的,可以看看 《Linux环境下 /etc/hosts 文件详解》 文章。
在 Linux 下如何指定dns服务器,来解析某个域名?
使用 dig 命令:dig @DNSip http://domain.com
。例如:
dig @8.8.8.8 www.baidu.com # 使用谷歌 DNS 解析百度
怎么预防 CC 攻击和 DDOS 攻击?
防 CC、DDOS 攻击,这些只能是用硬件防火墙做流量清洗,将攻击流量引入黑洞。
流量清洗这一块,主要是买 ISP 服务商的防攻击的服务就可以,机房一般有空余流量,我们一般是买服务,毕竟攻击不会是持续长时间。 例如说,《阿里云 —— DDoS 高防IP》 。
如何过滤与预防?
数据库网页端注入这种,可以考虑使用 nginx_waf 做过滤与预防。
艿艿:本小节为选读。我也不太会写 Shell 脚本,都是写的时候,在网络上拼拼凑凑。。。
一个 Shell 脚本是一个文本文件,包含一个或多个命令。作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件(Shell 脚本)来完成这些日常工作任务。
什么是默认登录 Shell ?
在 Linux 操作系统,"/bin/bash"
是默认登录 Shell,是在创建用户时分配的。
使用 chsh 命令可以改变默认的 Shell 。示例如下所示:
# chsh <用户名> -s <新shell>
# chsh linuxtechi -s /bin/sh
在 Shell 脚本中,如何写入注释?
注释可以用来描述一个脚本可以做什么和它是如何工作的。每一行注释以 #
开头。例子如下:
#!/bin/bash
# This is a command
echo “I am logged in as $USER”
在 Shell 脚本,我们可以使用两种类型的变量:
set
命令查看。
"echo $<变量名>"
查看。
Shell脚本中 $? 标记的用途是什么?
在写一个 Shell 脚本时,如果你想要检查前一命令是否执行成功,在 if
条件中使用 $?
可以来检查前一命令的结束状态。
Bourne Shell(bash) 中有哪些特殊的变量?
下面的表列出了 Bourne Shell 为命令行设置的特殊变量。
内建变量 解释
$0 命令行中的脚本名字
$1 第一个命令行参数
$2 第二个命令行参数
….. …….
$9 第九个命令行参数
$# 命令行参数的数量
$* 所有命令行参数,以空格隔开
如何取消变量或取消变量赋值?
unset
命令用于取消变量或取消变量赋值。语法如下所示:
# unset <变量名>
if
语法如何嵌套?if [ 条件 ]
then
命令1
命令2
…..
else
if [ 条件 ]
then
命令1
命令2
….
else
命令1
命令2
…..
fi
fi
在 Shell 脚本中如何比较两个数字?
在 if-then
中使用测试命令( -gt
等)来比较两个数字。例如:
#!/bin/bash
x=10
y=20
if [ $x -gt $y ]
then
echo “x is greater than y”
else
echo “y is greater than x”
fi
case
语句的语法?基础语法如下:
case 变量 in
值1)
命令1
命令2
…..
最后命令
!!
值2)
命令1
命令2
……
最后命令
;;
esac
for
循环语法?基础语法如下:
for 变量 in 循环列表
do
命令1
命令2
….
最后命令
done
while
循环语法?如同 for
循环,while
循环只要条件成立就重复它的命令块。
不同于 for
循环,while
循环会不断迭代,直到它的条件不为真。
基础语法:
while [ 条件 ]
do
命令…
done
do-while 语句的基本格式?
do-while
语句类似于 while
语句,但检查条件语句之前先执行命令(LCTT 译注:意即至少执行一次。)。下面是用 do-while
语句的语法:
do
{
命令
} while (条件)
Shell 脚本中 break 命令的作用?
break
命令一个简单的用途是退出执行中的循环。我们可以在 while
和 until
循环中使用 break
命令跳出循环。
Shell 脚本中 continue 命令的作用?
continue
命令不同于 break
命令,它只跳出当前循环的迭代,而不是整个循环。continue
命令很多时候是很有用的,例如错误发生,但我们依然希望继续执行大循环的时候。
使用 chmod 命令来使脚本可执行。例子如下:chmod a+x myscript.sh
。
#!/bin/bash 的作用?
#!/bin/bash
是 Shell 脚本的第一行,称为释伴(shebang)行。
#
符号叫做 hash ,而 !
叫做 bang。/bin/bash
来执行。如何调试 Shell脚本?
-x'
数(sh -x myscript.sh
)可以调试 Shell脚本。-nv
参数(sh -nv myscript.sh
)。如何将标准输出和错误输出同时重定向到同一位置?
2>&1 (如# ls /usr/share/doc > out.txt 2>&1 )
。&> (如# ls /usr/share/doc &> out.txt )
。在 Shell 脚本中,如何测试文件?
test 命令可以用来测试文件。基础用法如下表格:
Test 用法
-d 文件名 如果文件存在并且是目录,返回true
-e 文件名 如果文件存在,返回true
-f 文件名 如果文件存在并且是普通文件,返回true
-r 文件名 如果文件存在并可读,返回true
-s 文件名 如果文件存在并且不为空,返回true
-w 文件名 如果文件存在并可写,返回true
-x 文件名 如果文件存在并可执行,返回true
函数是拥有名字的代码块。当我们定义代码块,我们就可以在我们的脚本调用函数名字,该块就会被执行。示例如下所示:
$ diskusage () { df -h ; }
译注:下面是我给的shell函数语法,原文没有
[ function ] 函数名 [()]
{
命令;
[return int;]
}
如何让 Shell 就脚本得到来自终端的输入?
read 命令可以读取来自终端(使用键盘)的数据。read 命令得到用户的输入并置于你给出的变量中。例子如下:
# vi /tmp/test.sh
#!/bin/bash
echo ‘Please enter your name’
read name
echo “My Name is $name”
# ./test.sh
Please enter your name
LinuxTechi
My Name is LinuxTechi
如何执行算术运算?
有两种方法来执行算术运算:
# expr 5 + 2
。/dev
目录下?#!/bin/bash
read -p "Input file name: " FILENAME
if [ -c "$FILENAME" ];then
cp $FILENAME /dev
fi
#!/bin/bash
groupadd class1
for((i=1;i<31;i++))
do
if [ $i -le 10 ];then
useradd -g class1 std0$i
else
useradd -g class1 std$i
fi
done
编写 Shell 程序,实现自动删除 50 个账号的功能,账号名为stud1 至 stud50 ?
#!/bin/bash
for((i=1;i<51;i++))
do
userdel -r stud$i
done
/tmp/input.txt
文件的内容?要求:
[root@~]# cat -n /tmp/input.txt
1 000011111222
2
3 000011111222222
4 11111000000222
5
6
7 111111111111122222222222
8 2211111111
9 112222222
10 1122
11
# 删除所有空行命令
[root@~]# sed '/^$/d' /tmp/input.txt
000011111222
000011111222222
11111000000222
111111111111122222222222
2211111111
112222222
1122
# 插入指定的字符
[root@~]# sed 's#\(11111\)#AAA\1BBB#g' /tmp/input.txt
0000AAA11111BBB222
0000AAA11111BBB222222
AAA11111BBB000000222
AAA11111BBBAAA11111BBB11122222222222
22AAA11111BBB111
112222222
1122
一般来讲,桌面用户首选 Ubuntu ;服务器首选 RHEL 或 CentOS ,两者中首选 CentOS 。
根据具体要求:
有哪些方面的因素会导致网站网站访问慢?
针对网站访问慢,怎么去排查?
怎么去解决?