此处将为大家介绍关于比特|某公司测试工程师面试:Linux命令的详细内容,此外,我们还将为您介绍关于2019软件测试工程师面试题集锦、Linux运维工程师面试题整理、Linux工程师面试题C、Linu
此处将为大家介绍关于比特 | 某公司测试工程师面试:Linux命令的详细内容,此外,我们还将为您介绍关于2019软件测试工程师面试题集锦、Linux 运维工程师面试题整理、Linux工程师面试题C、Linux运维工程师面试题的有用信息。
本文目录一览:比特 | 某公司测试工程师面试:Linux命令
面试中遇到对 Linux 基础知识的考察,主要是一些简单的文本操作,某项系统数据、日志的查看。
鉴于是考核测试工程师而不是考核运维工程师,难度不很小,相应的分值也不高。
大多数时候你的面试官往往也不是很精通 Linux ,此类问题稍作准备即可。
查看服务器的某个端口是否打开
nmap -sT localhost查看指定 ip 所有打开的端口
telnet localhost 22 查看指定 ip 的指定端口是否打开
netstat -ntpl |grep 22查看本机指定端口是否打开
根据进程查端口
ps -ef | grep Name 先找到进程的 pid
netstat -nap | grep 2111 根据进程 pid 查端口
linux 根据进程名查看其占用的端口
lsof -Pnl +M -i4 | grep 22 查看指定端口所属进程id
Linux下根据端口号查询对应进程
查看内存占用
free 命令
linux-2g4s:~ # free -m
total used free shared buffers cached
Mem: 7746 2764 4981 204 2 1340
-/+ buffers/cache: 1421 6324
Swap: 8197 0 8197
top 命令
top - 22:50:48 up 33 min, 1 user, load average: 0.29,0.75,0.63
Tasks: 220 total, 1 running,219 sleeping, 0 stopped, 0 zombie
%cpu(s): 1.2 us, 2.2 sy, 0.0 ni,96.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 7932260 total, 2831700 used, 5100560 free, 2488 buffers
KiB Swap: 8394748 total, 0 used, 8394748 free. 1374992 cached Mem
PID USER PR NI VIRT RES SHR S %cpu %MEM TIME+ COMMAND
1371 root 20 0 206052 45928 19960 S 3.322 0.579 1:16.57 Xorg
1586 zhouqiz+ 20 0 2093212 175428 81420 S 2.326 2.212 1:38.60 gnome-shell
2856 zhouqiz+ 20 0 958652 50292 36296 S 2.326 0.634 0:09.08 gnome-terminal-
1102 root 20 0 572608 16160 11240 S 0.997 0.204 0:01.34 NetworkManager
1070 message+ 20 0 41124 5268 3676 S 0.664 0.066 0:01.02 dbus-daemon
360 root 20 0 0 0 0 S 0.332 0.000 0:00.32 btrfs-transacti
1820 zhouqiz+ 20 0 384708 13560 9996 S 0.332 0.171 0:00.20 mission-control
2229 zhouqiz+ 20 0 1857708 221152 108252 S 0.332 2.788 1:17.47 chromium
3646 root 20 0 14092 2452 1940 R 0.332 0.031 0:00.03 top
1 root 20 0 185360 5928 3944 S 0.000 0.075 0:10.72 systemd
2 root 20 0 0 0 0 S 0.000 0.000 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.000 0.000 0:00.03 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.000 0.000 0:00.00 kworker/0:0H
7 root 20 0 0 0 0 S 0.000 0.000 0:01.61 rcu_sched
8 root 20 0 0 0 0 S 0.000 0.000 0:00.00 rcu_bh
9 root rt 0 0 0 0 S 0.000 0.000 0:00.00 migration/0
10 root rt 0 0 0 0 S 0.000 0.000 0:00.00 watchdog/0
查看硬盘分区大小
fdisk
linux-2g4s:~ # fdisk -l
disk /dev/sda: 238.5 GiB,256060514304 bytes,500118192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
disklabel type: gpt
disk identifier: 2590AC87-0E3E-4F54-9062-46B3FA6E6D11
Device Start End Sectors Size Type
/dev/sda1 2048 923647 921600 450M Windows recovery environment
/dev/sda2 923648 1128447 204800 100M EFI System
/dev/sda3 1128448 1161215 32768 16M Microsoft reserved
/dev/sda4 1161216 254112398 252951183 120.6G Microsoft basic data
/dev/sda5 254113792 270903295 16789504 8G Microsoft basic data
/dev/sda6 270903296 291885055 20981760 10G Microsoft basic data
/dev/sda7 291885056 500117503 208232448 99.3G Microsoft basic data
查看每个挂载点占用情况
df
linux-2g4s:~ # df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs tmpfs 3.8G 11M 3.8G 1% /dev/shm
tmpfs tmpfs 3.8G 2.6M 3.8G 1% /run
tmpfs tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup
/dev/sda6 btrfs 11G 7.2G 2.8G 73% /
/dev/sda2 vfat 96M 29M 68M 30% /boot/efi
/dev/sda6 btrfs 11G 7.2G 2.8G 73% /boot/grub2/i386-pc
/dev/sda6 btrfs 11G 7.2G 2.8G 73% /var/lib/pgsql
/dev/sda6 btrfs 11G 7.2G 2.8G 73% /var/tmp
/dev/sda7 xfs 100G 8.1G 92G 9% /home
/dev/sda6 btrfs 11G 7.2G 2.8G 73% /var/crash
/dev/sda6 btrfs 11G 7.2G 2.8G 73% /var/lib/mariadb
/dev/sda6 btrfs 11G 7.2G 2.8G 73% /var/spool
/dev/sda6 btrfs 11G 7.2G 2.8G 73% /tmp
/dev/sda6 btrfs 11G 7.2G 2.8G 73% /var/log
/dev/sda6 btrfs 11G 7.2G 2.8G 73% /var/lib/MysqL
/dev/sda6 btrfs 11G 7.2G 2.8G 73% /var/lib/libvirt/images
/dev/sda6 btrfs 11G 7.2G 2.8G 73% /boot/grub2/x86_64-efi
/dev/sda6 btrfs 11G 7.2G 2.8G 73% /var/opt
/dev/sda6 btrfs 11G 7.2G 2.8G 73% /srv
/dev/sda6 btrfs 11G 7.2G 2.8G 73% /var/lib/mailman
/dev/sda6 btrfs 11G 7.2G 2.8G 73% /opt
/dev/sda6 btrfs 11G 7.2G 2.8G 73% /usr/local
/dev/sda6 btrfs 11G 7.2G 2.8G 73% /var/lib/named
/dev/sda6 btrfs 11G 7.2G 2.8G 73% /var/lib/machines
/dev/sda6 btrfs 11G 7.2G 2.8G 73% /var/cache
tmpfs tmpfs 775M 28K 775M 1% /run/user/1000
du 查看文件目录大小
linux-2g4s:/usr # du -h -d1
0 ./local
2.6G ./share
458M ./lib
42M ./sbin
43M ./include
2.4G ./lib64
0 ./X11R6
377M ./bin
0 ./games
0 ./src
28K ./x86_64-suse-linux
5.8G
awk 使用
点击下方阅读原文跳转到awk 的使用哟~
推荐阅读 点击阅读☞比特 | 你为什么要做软件测试?
点击阅读☞面试问题集锦 | 65个面试常问到的问题
点击阅读☞比特 | Linux中消费者与生产者模型
点击阅读☞比特 | TCP协议的"三次握手"和"四次挥手"
点击阅读☞比特面经 | 校招虐我千百遍,我待校招如初恋!
2019软件测试工程师面试题集锦
背景:虽然测试行业在2019不太景气,面试后的一些面试题归集和总结,为了将来面试时使用。
所有的面试题中我发现超过90%都是基础性的面试题,只要有自动化基础,功能测试接触,再加上面试的时候态度ok,且不卑不亢即可
切记,面试时一定要不卑不亢,切记心浮气躁和心虚 ,你懂得!
一、以下是我面试的经验所得
1、http与https有何区别
答案:
①https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
②http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
③http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
④http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
2、tcp/ip三次握手
①含义理解
TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
②三次握手:
(1)客户 端发送一个带SYN标志的TCP报文到server。这是三次握手过程中的报文1。
(2) server端回应client的,这是三次握手中的第2个报文。这个报文同一时候带ACK标志和SYN标志。
因此它表示对刚才clientSYN报文的回应。同一时候又标志SYN给client,询问client是否准备好进行数据通 讯。
(3) 客户必须再次回应服务段一个ACK报文,这是报文段3。
(4)连接终止协议(四次握手)
3、悲观锁和乐观锁
悲观锁:
悲观锁原理是每次获取数据的时候,都会担心自己数据被修改,所以每次获取数据的时候都会进行加锁,确保在自己使用的过程中数据不会被别人修改,使用完成后再进行数据解锁。由于数据进行加锁,期间对该数据进行读写的其他线程都会进行等待。在Java中,synchronized的思想也是悲观锁。(如:同一个数据库表A用户在操作时B用户不能进行操作)
适合写入较频繁场景,如出现大量的读取操作,每次读取都会进行加锁,这样会增加大量的锁的开销,降低了系统的吞吐量。
乐观锁:
适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量。
(如:A用户操作一个表,B用户同时操作这个表,乐观锁认为不会冲突,但实际会造成冲突)
4、左连接、右连接和全连接
左连接:左边有的,右边没有的为null
右连接:左边没有的,右边有的为null
内连接:显示左边右边共有的
5、数据库中sum和count的区别以及使用
一般面试会把sum与order by 分组一起使用
count:统计你查询出来的数据记录条数 :select count(*) from 学生表;
sum:求和 :select sum(chengji) from 学生表 where name=''张三'';
6、软件测试流程
7、软件测试方法有哪些?
黑盒、白盒、灰盒
8、jmeter中跟踪重定向和自动重定向区别?
1)跟踪重定向通俗的理解就是跟踪请求执行的过程,并记录一些信息给开发者看到,我们一般可以在结果日志和监控中看到
2)自动重定向是不用跟踪请求执行过程,也不用记录
9、数据库中事物是什么?有哪些特性
10、软件测试方案包含哪些内容
11、设计一个模块测试用例
考察面试者的经验、用例设计能力、思维、以及掌握的测试方法是否全面
从功能测试、接口测试、性能测试方面分析
12、自动化测试selenium 显示等待和隐式等待
显示等待就是有条件的等待
隐式等待就是无条件的等待
显示等待:
# 设置等待时间
WebDriverWait(driver, 3, 0.5) #传入三个参数,第一个是浏览器驱动,第二个是等待多少秒,第三个是每隔多少秒监控一次
原理:指定一个等待条件,和一个最长等待时间,程序会判断在等待时间内条件是否满足,如果满足则返回,如果不满足会继续等待,超过时间就会抛出异常
隐士等待:
browser.implicitly_wait(10) #直接等待10秒钟
当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0
13、pytest如何管理测试用例?
1)掌握案例规则,如以test_开头,类以Test命名等
2)案例文件执行单个py如何执行,多个文件夹的管理方式
14、cookie、token、session的区别
点击链接获取答案:
Cookie、token、session的区别是什么?
15、软件测试通过的标准是什么?
回答:
1、ISO90001-ISO90004标准
2、通过案例执行完成,bug验收通过,完成功能测试、集成测试(等等)
以上,持续更新中.....
Linux 运维工程师面试题整理

[root@localhost ~]# cat aaa.txt
1.aaa
2.bbbbbbb
3.ccccccccccccc
4.dddddddddddddddddddddd
5.eeeeeeeeeeeeeeeeee
6.ffffffffffffffffffffffffffffffffff
7.gggggggggggggggggggggg
8.hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
9.iiiiiiiiiiiiiiiiiiii
10.jjjjjjjjjjjjjjjjjjjjjjjjjj
11.kkk
12.llllllllll
[root@localhost ~]# sed -n ''4,7p'' aaa.txt
4.dddddddddddddddddddddd
5.eeeeeeeeeeeeeeeeee
6.ffffffffffffffffffffffffffffffffff
7.gggggggggggggggggggggg
[root@localhost ~]# ls
1.txt 2.txt 3.pdf aaa.txt anaconda-ks.cfg
[root@localhost ~]# find ./ -name "*.txt"
./aaa.txt
./1.txt
./2.txt
[root@localhost ~]# find /usr -type f -size +10240k
/usr/lib/locale/locale-archive
/usr/lib64/libicudata.so.50.1.2
* 5-8 * * * /usr/bin/backup
主库 db 的更新事件 (update、insert、delete) 被写到 binlog。
主库创建一个 binlog dump thread,把 binlog 的内容发送到从库。
从库启动并发起连接,连接到主库。
从库启动之后,创建一个 I/O 线程,读取主库传过来的 binlog 内容并写入到 relay log。
从库启动之后,创建一个 SQL 线程,从 relay log 里面读取内容,从 Exec_Master_Log_Pos 位置开始执行读取到的更新事件,将更新内容写入到 slave 的 db。
命令模式。行末模式,编辑模式
优先查找本地 dns 缓存,查找本地 /etc/hosts 文件,是否有强制解析,如果没有去 /etc/resolv.conf 指定的 dns 服务器中查找记录 (需联网,在 dns 服务器中找到解析记录后,在本地 dns 中添加缓存,完成一次 dns 解析
递归查询是一种 DNS 服务器的查询模式,在该模式下 DNS 服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机。如果 DNS 服务器本地没有存储查询 DNS 信息,那么该服务器会询问其他服务器,并将返回的查询结果提交给客户机。
DNS 服务器另外一种查询方式为迭代查询,DNS 服务器会向客户机提供其他能够解析查询请求的 DNS 服务器地址,当客户机发送查询请求时,DNS 服务器并不直接回复查询结果,而是告诉客户机另一台 DNS 服务器地址,客户机再向这台 DNS 服务器提交请求,依次循环直到返回查询的结果为止。
比如我们国内访问国外网站,直接访问访问不到,我们可以通过一个正向代理服务器,请求发到代理服,代理服务器能够访问国外网站,这样由代理去国外网站取到返回数据,再返回给我们,这样我们就能访问了。
反向代理实际运行方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时客户只是访问代理服务器却不知道后面有多少服务器。
— 【 THE END 】—
本公众号全部博文已整理成一个目录,请在公众号里回复「
m
」获取!
3T技术资源大放送!包括但不限于:Java、C/C++,Linux,Python,大数据,人工智能等等。在公众号内回复「1024」,即可免费获取!!
本文分享自微信公众号 - 程序员书单(CoderBooklist)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。
Linux工程师面试题C
1、"匈牙利命名法"有什么优缺点?(2分)
2、下面x, y, *p的值是多少,有什么问题?(2分)
int x, y, z = 2;
int *p=&z;
x=sizeof*p;
y=x/*p; // x=?, *p=?, y=?, 有什么问题?
3、下面的语句是什么意思?如何声明或定义才使它们更易懂?(10分)
int (*foo())();
int (*foo())[];
int (*foo[])();
(*(void(*)())0)();
void (*signal(int,void(*)(int)))(int);
4、本题(2分)。一般使用malloc时,需要进行强制类型转换,如:
char *s; s = (char *)malloc(31);
下面中???该如何填写,才可以正确执行强制类型转换?
int (*monthp)[31]; monthp = (???)malloc(31);
5、关于C语言运算符优先级的记忆技巧是什么?(2分)
// 下面r的值是多少
int hi, low, r;
hi=7;low=3;
r=hi<<4+low;
6、指针和数组的区别是什么?用一个简单的声明把它们区分开。(2分)
指针和数组的声明在什么情况下是相同的?(2分)
7、C语言的左值(lvalue)和右值(rvalue)的含义是什么?(2分)
8、为什么C语言可以实现printf(char *format, ...)这样可变参数的调用形式?这样有什么缺点?(2分)
9、说明C语言中术语"声明""定义""原型"的含义?(2分)
10、举一个例子,说明使用assert和防错代码的区别。(5分)
11、对语句 if else 与操作符 ? : 使用场合的比较。(2分)
12、编写一个函数,输入一个的整型数字,可以选择按照8/10/16进制输出字符串。
注意边界值。(5分)
13、本题(2分)。下面是一个16x16的黑白图标:
static unsigned short stopwatch[] = {
0x07c6,
0x1ff7,
0x383b,
0x600c,
0x600c,
0xc006,
0xc006,
0xdf06,
0xc106,
0xc106,
0x610c,
0x610c,
0x3838,
0x1ff0,
0x07c0,
0x0000,
};
如何修改声明,可以使之在源代码中形象地表现出图形的模样。
14、说出可以使用calendar[11][30]变量的四种类型定义。(5分)
如:int calendar[12][31]; // 二维数组
15、使用strcmp,当字符串相同时会返回''\0''。但''\0''一般作为逻辑假,
因此下面的语句不容易理解:
if (!strcmp(s, "string")) return EQUATION;
如何经过简单修改,使之更易懂?(2分)
16、编写一个自己的完全C语言版本的memset函数,并且评价这个实现的性能和可移植性。(5分)
17、在树和图这些数据结构中,通常使用指针来组织数据。如果我们要把这些数据保存到文件中,指针是没有意义的。我们该如何解决这个问题。(2分)
18、用2种不同的方法计算long变量的"1"bit的个数。(2分)
19、任意给出一个C的基本数据类型,如何编码判断这个数据类型是有符号还是无符号的?(2分)
不得上机实验,写出下面代码的输出。解释这个行为是标准定义的,还是依赖实现的。(2分)
int i;
for (i = 0; i < 10; i++) {
int j = i;
printf ("%d\n", j);
}
20、列出5种以上你所看过的C编程的书籍,并写简要书评。(5分)
对C的评价。如果要你改造一把菜刀,使之更加安全,你是否会使用这样的菜刀,为什么?(5分)
-----华丽的分割线-----
1、"匈牙利命名法"有什么优缺点?(2分)
首先,我们要知道有这么个东西,因为这可能是目前公认的程序员的良好素质。匈牙利命名法是一种编程时的命名规范。基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。匈牙利命名法是一位叫 Charles Simonyi 的匈牙利程序员发明的,后来他在微软呆了几年,于是这种命名法就通过微软的各种产品和文档资料向世界传播开了。
然后,我们来讨论一下优点。虽然我很少涉足OOP,但是对这个东西多少知道一点。匈牙利命名法非常便于记忆,而且使变量名非常清晰易懂,这样,增强了代码的可读性,方便各程序员之间相互交流代码。而且由于是从微软出来的东西,现在又变成了世界范围内的编码规范,所以使在熟悉这一命名法的程序员之间交流代码变得轻松。我们一直强调要有良好的程序风格,而这就需要从命名开始。
最后,我们再来讨论一下缺点。其实很少人说名压力命名法的缺点,所以我认为这道题的目的并不是让你骨头里挑刺,而是要看你有没有“怀疑一切,否定一切”的态度,是要看你是不是喜欢逆来顺受,要看你是不是能对一件看似既定的事情说“NO!”。那么好,给你一个机会,但也不能太离谱。凡是都有两面性,在匈牙利命名法给我们带来清晰的命名规范的同时,我们不得不承认,它的命名成本是很高的。比如一个变量,可能在程序里会出现100次,在debug阶段的时候忽然觉得它应该是另一个类型,那么好,噩梦开始,你要修改100遍啊100遍!还有匈牙利命名法的收益,有一些简单的不能再简单,清楚的不能再清楚的变量,非要加上一串帽子,即便是一个简单的函数和变量,我们是不是也要停下来仔细琢磨一下它想传递一个什么值呢?在类型越来越多,越来越复杂的情况下,匈牙利命名法可能会画蛇添足,火上浇油,比如一个名为ppp的帽子,想说明什么?是Point to Point Protocol么?显然不是,它的意思是指向指针的指针的指针,晕吧。
好了,大致是这样,每个人都有心中的不满,导致这个题目没有标准答案,就像我说的,这道题的目的在于你是不是能够说出“不”,而不是走大众路线。引用AMD创始人Jerry Sanders的一句名言:只有偏执狂才能生存。我们虽然不偏执,但是总要有自己的想法和愤怒,不是么。
给出一篇参考文献,值得仔细品味:http://baike.baidu.com/view/419474.htm
2、下面x, y, *p的值是多少,有什么问题?(2分)
int x, y, z = 2;
int *p=&z;
x=sizeof*p;
y=x/*p; // x=?, *p=?, y=?, 有什么问题?
有什么问题……我想说的是,如果你按这个写出来,肯定编译不过去。为什么?最明显的:y=x/*p;,这是什么东西?为p;做个注释?不至于懒得加一个括号吧,y=x/(*p);。
类似的问题,x=sizeof(*p);是不是更好看,这是编码素质的问题。好了,解决了这个问题,可以编译了,但是我们需要一个前提:你的宿主机是多少位的?下面我们用32bits举例,因为嵌入式linux都是跑在32bits的ARM上的。一句一句来:
int x, y, z = 2; //x=?,y=?,z=2
int *p=&z; //等价于int *p;p=&z; 所以p为指向z的数据的地址,*p=z=2
x=sizeof(*p); //考点来了,32bits的CPU运行完这句,x=4,同理,如果换成16bits的,x=2
y=x/(*p); //y=4/2=2
那么最后的结果就是:x=2,y=2,*p=2。很简单吧。
3、下面的语句是什么意思?如何声明或定义才使它们更易懂?(10分)
int (*foo())();
int (*foo())[];
int (*foo[])();
(*(void(*)())0)();
void (*signal(int,void(*)(int)))(int);
第一个:int (*foo())();
先一步一步的分析:首先是被左边的()括起来的*foo()。
(1) 里面()的优先级高于*,所以foo()先是一个函数;
(2) *foo()说明这个函数返回一个指针;
(3) (*foo())()这个函数返回的指针指向一个函数;
(4) int (*foo())();
(5) 最后这个函数返回一个整型数。
好了,我们来一遍全的:这个函数的含义是foo()函数返回的指针指向一个函数,该函数返回一个整型数。(我汗啊……)
第二个:int (*foo())[];
有上面的打基础了,这回好多了。大致还是那个意思,但是就是由函数变成了数组,所以还更简单些,具体的含义是:foo()函数返回的指针指向一个具有整型数的数组。
第三个:int (*foo[])();
这个就是上两个的翻版:一个存有指针的数组*foo[],该指针指向一个函数,该函数返回一个整型数。
第四个:(*(void(*)())0)();
明显比上面的复杂,但是不要怕,还是那样,一层一层的分析:
(1) 最里面的(*)()意思是一个指向函数的指针;
(2) 加个前缀void(*)(),表示一个指向返回类型为void的函数的指针;
(3) 套个马甲(void(*)())的意思就是类型强制转换;
(4) (void(*)())0就是把0强制转换成前面说的那个类型的指针;
(5) 那么好,现在(void(*)())0是一个指针了,这个指针指向了一个函数,我们用宏定义简化一下,看着太麻烦:
(6) #define ptr (void (*)())0 ,现在(*(void(*)())0)();这个怪物就可以简化成:(*ptr)();
(7) 别忘了ptr是一个指向函数的指针,既然这样*ptr就是函数了,那么上面的结果再次被简化成:ptr();,这不就是函数的调用么!
至此这个怪物函数的含义和简化形式就都给出了,我就不再总结了。不过我还想再给出一个简化形式,这会对下面的问题有启示:
使用typedef,typedef void (*ptr)(); ,然后就可以用(*(ptr)0)();来表示这个怪物函数了,其灵活性比使用#define要高。
第五个:void (*signal(int,void(*)(int)))(int);
这是著名的signal函数的原型,可以如此声明:
typedef void (*HANDLER)(int);
HANDLER signal(int,HANDLER);
或者:
typedef void HANDLER(int);
HANDLER *signal(int,HANDLER *);
随你喜欢,反正用起来没什么区别。这个函数简单的表述就是发出一个信号(int型),然后跳转到指向函数的指针HANDLER指向的信号处理函数处。
好了,都答完了,前三个我认为没有必要简化,所以只给出了后两个的简化。不知道做的对不对,八九不离十吧。
4、一般使用malloc时,需要进行强制类型转换,如:
char *s; s = (char *)malloc(31);
下面中???该如何填写,才可以正确执行强制类型转换? (2分)
int (*monthp)[31]; monthp = (???)malloc(31);
说实在的,我认为题干有一点点问题。我先来说一下我的思路:malloc的用法在上一部分说过了,不清楚的去翻书,或者翻我的文章。在这里int (*monthp)[31];是一个套,代表定义一个指向有31个整型数的数组的指针,我们如果吧这个数组看成一个连续的内存区域,那么(*monthp)[31]原则上和*s没有什么区别,区别只是类型,如果只是强制类型转换,monthp = (int *)malloc(31); 就可以了。
但是这个题干本可以出的更精彩点,比如不给提示,直接int (*monthp)[31]; monthp = (???)malloc(???);,那么我们就要考虑到开辟空间的大小了,所以 monthp = (int *)malloc(sizeof(int)*31);应该是最完美的回答。
5、关于C语言运算符优先级的记忆技巧是什么?(2分)
//下面r的值是多少
int hi, low, r;
hi=7;low=3;
r=hi<<4+low;
技巧……我不知道有什么技巧,摘一篇别人总结的:(1)先(括号)内层,后(括号)外层。(2)先函数,后运算。(3)先算术,后关系,再逻辑。(4)先乘除,后加减。(5)先左,后右。(6)搞不清,加括号。
我认为凡事都是一个熟能生巧的过程,技巧固然重要,但是以为追求技巧而忽略了原则,可谓得不偿失,早晚要栽跟头的。所以多用多练是最好的技巧。实在不行……就用括号!
回到题目中,位运算的级别是低于算术运算的,所以r=hi<<4+low;就变成了r=hi<<(4+low);,把数带进去就是r=7<<7;意思是把7左移7位,不用我再解释了吧,r=896。
6、指针和数组的区别是什么?用一个简单的声明把它们区分开。(2分)
指针和数组的声明在什么情况下是相同的?(2分)
这个问题可能在我们熟练使用指针和数组后已经很少去思考了。
第一个问题:
其实数组是一个地址,指针则是指向地址的地址。举个例子:
char array[10];
char *pt;
pt=array;
char array[10];的含义是,在内存里开辟一个10个字节的空间用来存放数据,其中array是这个空间的头地址,正如刚才所说,数组是一个地址。
char *pt;的含义是,只是定义一个指针pt,这个指针可以指向任意char型的地址,而指向的地址则存放在地址*pt中,也就是刚才说的指针是指向地址的地址。
那么好,pt=array;的意思就是我们把*pt中存放的地址(指针)指向了数组array[10]的头地址array,这个时候pt和array辩证的统一了,区别用通俗的话说就是数组是地名,指针是路牌。但是别忘了,在这个例子中,数组实实在在的占用了10个字节的空间,而指针只占用了4个字节用来存放地址而已(假设是32bits系统)。
最后我们总结一下区别:
数组:保存数据;直接访问数据;用于存储数目固定且类型相同的数据;由编译器自动分配和删除;自身即为数据名。
指针:保存地址;间接访问数据(先取得指针的内容,然后以它为地址,取得数据);通常用于动态数据结构;动态的分配和删除;通常指向隐式数据。
第二个问题:
在第一个问题中,虽然指针和数组的本质定义永远不可能是一样的,但是在某种情况下也可以辩证的统一。
char array[10]={''0'',''1'',''2'',''3'',''4'',''5'',''6'',''7'',''8'',''9''};
char *pt="0123456789";
这样一来,它们在初始化阶段都占用了同样大小的内存空间,如此情况下,也就可以认为是相同的了。
7、C语言的左值(lvalue)和右值(rvalue)的含义是什么?(2分)
这个问题挺汗的,从来没仔细琢磨过其深层次的含义。阅览了一下文献,大致可以这么理解,当然也可能不对,我尽可能说的准确些:
左值就是一个可被存储的单元,右值就是一个可被读取的数据。
如此说笼统了一些,详细一些,就是左值必须是一个被明确了的内存存储单元,可以用来被赋值;右值必须是一个能被读出来的确确实实的值,这个值可以是数据,可以是指针,可以是结构,反正只要能被读出来的,都可以定义为右值。
大致我就理解这么多,可能不太准确,只是作为思考的参考,我也想知道最精准的答案。
8、为什么C语言可以实现printf(char *format, ...)这样可变参数的调用形式?这样有什么缺点?(2分)
关于这个问题,恐怕要上升到理论的高度,说实话,我并不清楚为什么,所以更谈不上缺点,经过阅览文献,我还是找出了一些蛛丝马迹,解释的比较笼统,希望有高人能用通俗的语言解答一下!
可变参数的函数,即函数的参数是不确定的。为了支持可变参数函数,C语言引入新的调用协议,即C语言调用约定 __cdecl。采用C语言编程的时候,默认使用这个调用约定。如果要采用其它调用约定,必须添加其它关键字声明。__cdecl 最大好处在于由于是调用者清理栈,它可以处理可变参数,缺点则在于它增加了程序的大小,因为在每个调用返回的时候,需要多执行一条清理栈的指令。
好了,我能理解的就这么多,希望真正回答这个问题的时候不要再被深入提及,否则就露馅了。在这个别和书签,有时间要好好琢磨一下。
9、说明C语言中术语"声明""定义""原型"的含义?(2分)
用函数举个例子,因为变量仿佛不存在原型的说法。
函数声明和函数原型其实很相似,函数声明是把函数的名字,函数类型以及形参的类型,个数和顺序通知编译系统,以便在调用该函数时系统进行对照检查,但是函数声明并不包括函数的功能。而函数的定义则是具体指出了函数要完成的功能。
函数的定义只能有一次,函数的原型只能有一个,而声明可以有多次,例如前面题目提到的著名的signal函数,原型是void (*signal(int,void(*)(int)))(int); ,但是可以声明成:
typedef void (*HANDLER)(int);
HANDLER signal(int,HANDLER);
当然也可以声明成其他的,声明后仍然只是个名字,而且已经和原型看似不同了,但是实际上将声明翻译回去,应该与原型不冲突。
我总结了一下,原型应该是函数最原始的形态,声明是将函数按照原型的形式声明成方便使用的形态,定义是为声明的函数添加具体的工作。
有可能不准确,但是我认为大致是这个意思。
10、举一个例子,说明使用assert和防错代码的区别。(5分)
我恐怕这5分得不到了,由此做出抛砖引玉吧。
说到防错代码,我第一联想到的是#ifdef、#ifndef、#else、#endif之类的在预处理阶段的一些宏和一些条件判断。而assert函数则是在程序中使用的宏(注意,其实assert是一个宏)。在使用防错代码时,一般判断为假的时候可以使用一些语句继续调试,而使用assert后,当判断为假貌似就直接结束程序了。所以我认为这是一个区别。还有就是在debug版的程序中可以允许assert,但是在release版中不应该出现assert,而防错代码应该是可以出现的,扩展的说,就是assert不能代替条件过滤。
还有什么区别?应该有吧,只是我实在是不知道了。多学多问,不耻下问,请高人指点啊!!!
11、对语句 if else 与操作符 ? : 使用场合的比较。(2分)
这个……其实?:就是if else的简化版,并没有太多的区别,如果说场合上有所不同的话,我各说一下它们为对方所不能的地方。
if else语句可以用在复杂的程序里,判断的结果为真时要执行N多程序,这个时候如果用?:来写恐怕写出来的东西连自己亲妈都不认识了。所以?:操作符一般都是用在简单的条件判断中,虽然也可以嵌套和干一些别的,但是程序的可读性大大降低了。
但是操作符?:可以用在一个宏里,比如一个经典的面试题,定义一个宏MIN,比较两个数,输出小者,就可以这么写:#define MIN(A,B) ((A) <= (B) ? (A) : (B)) ,恐怕if else做不到吧。
具体还有什么场合上要注意的,我再想想看。
12、编写一个函数,输入一个的整型数字,可以选择按照8/10/16进制输出字符串。注意边界值。(5分)
char* transfer(int kind,unsigned int num)
{
char *pt;
switch(kind)
{
case 8:
{sprintf(pt,"%o",num);break;}
case 10:
{sprintf(pt,"%d",num);break;}
case 16:
{sprintf(pt,"%x",num);break;}
default:
{sprintf(pt,"%d",num);break;}
}
return pt;
}
随手写了一个,没有具体验证,大致意思就是函数transfer的两个输入参数为kind和num,kind是一个整型数,告诉函数transfer要转换成多少进制的字符串,可以输入8、10、16,默认是10进制;num是一个无符号整型数,是被转换数。函数transfer将指针pt指向转换后的字符串地址,并将其返回。
需要说明的是,我不太清楚题目中是要输出到屏幕还是哪里,所以就做了一个返回值,如果要输出的屏幕也是很简单的事情。还有就是边界值的问题,我们首先要分清楚系统是多少bits的,其实这个边界值的判断应该在函数外完成。还有就是题目要注意,也没说怎么注意,我只是做了一下unsigned,算是注意了吧,其实如果超出范围了,注意了也没用。
13、本题(2分)。下面是一个16x16的黑白图标:
static unsigned short stopwatch[] = {
0x07c6,
0x1ff7,
0x383b,
0x600c,
0x600c,
0xc006,
0xc006,
0xdf06,
0xc106,
0xc106,
0x610c,
0x610c,
0x3838,
0x1ff0,
0x07c0,
0x0000,
};
如何修改声明,可以使之在源代码中形象地表现出图形的模样。
我们需要明白一点,在做字模或者图形的时候,在黑白状态下,0代表白,1代表黑,那么好了,我们把字模变成二进制不就可以了。十六进制前缀是0x,二进制就是0b。以上面为例子,看看结果吧,是不是很有意思:
static unsigned short stopwatch[] = {
0b0000011111000110,
0b0001111111110111,
0b0011100000111011,
0b0110000000001100,
0b0110000000001100,
0b1100000000000110,
0b1100000000000110,
0b1101111100000110,
0b1100000100000110,
0b1100000100000110,
0b0110000100001100,
0b0110000100001100,
0b0011100000111000,
0b0001111111110000,
0b0000011111000000,
0b0000000000000000,
};
14、说出可以使用calendar[11][30]变量的四种类型定义。(5分)
如:int calendar[12][31]; // 二维数组
首先,我们的脑子里在对待数组和指针的时候,应该将两者紧紧的联系起来!我们把二者结合起来通俗的讲,数组名的意思就是指向具有N个连续字节空间的头地址;指针的意思就是指向的地址是具有N个连续字节空间的头地址,可以认为是一个数组名。不知道我说的够不够通俗,反正说完我反而晕了。
既然这样,如果一个一维数组可以用一个指针代替,那么二维数组就可以用一个指向指针的指针代替了。这也就是第一个答案:
int **calendar;
如果处于这个思考,我们完全可以再扩展出两种方式:一种是一个指针指向一个一维数组;另一个是一个一维数组中有若干个指针。形象的定义出来就是我们要的第二种和第三种答案:
int (*calendar)[31];
int *calendar[12];
好了,结合给出的int calendar[12][31];,不多不少正好四种,要是让我想第五种我都想不出来了。
最后想说一下,用指针方式变相定义数组的时候,一定要在定义后使用前分配空间,否则有可能空间是乱的,因为只告诉了编译器脑袋在哪里,并没告诉编译器身子有多长。
15、使用strcmp,当字符串相同时会返回''\0''。但''\0''一般作为逻辑假,因此下面的语句不容易理解:
if (!strcmp(s, "string")) return EQUATION;
如何经过简单修改,使之更易懂?(2分)
我不知道题目中说的''\0''是哪来的,但是我明白题目的意思了,我来以我的理解翻译一下:
strcmp这个函数是用来比较字符串的,当两个字符串相同的时候,返回值为0。但是一般情况下我们认为0是逻辑假,所以语句:if (!strcmp(s, "string")) return EQUATION; 让不懂strcmp的人比较纳闷:怎么要加“!”呢?因为加上!后,if才认为两个字符串是相同的。对于这个问题,理解了之后,再简单不过了:if (strcmp(s, "string")==0) return EQUATION; 。
16、编写一个自己的完全C语言版本的memset函数,并且评价这个实现的性能和可移植性。(5分)
memset这个函数的作用大致可以理解为将从指针指向的地址开始的指定字节长度的空间全部替换为指定的值。那么我们可以很轻松的用C来自己实现这个函数:
void *memset(void *position,void value,unsigned int count)
{
void *head=position;
while(count--)
{
*(char *)position=(char)value;
position=(char *)position+1;
}
return head;
}
相信大家都能写出来,只是方式不同罢了。在这个函数中,没有调用任何别的函数,完全靠C最基本的语句实现的,所以移植性应该很好,另外,在为memory的一个字节空间的set上,可以看到,除了while的递减外,只用到了两句话,可以说没法再精简了,所以性能应该说很好。至少我是这么觉得,嘿嘿。
17、在树和图这些数据结构中,通常使用指针来组织数据。如果我们要把这些数据保存到文件中,指针是没有意义的。我们该如何解决这个问题。(2分)
首先,这是一个面向对象的概念了。不写代码了,也没法写,就说说我的想法吧,想法最重要。
我记得我在上学的时候,C语言课上做过这么一个题目,大概意思是把一个数组中的数据写到文件中,然后再读回来恢复到数组中。实现的方法是用一个给定的分隔符将数组中各个数据分隔开,连分隔符一起写入文件,然后再读回来的时候识别出分隔符,将数据依次写入数组。具体实现的方法很多。
其实无论是树还是图,都是一种数据结构,只是多了些*lchild,*rchild,*next之类的指针,每一个struct其实都是一片连续的内存区域,也就是一串连续的数据,我们可以把这一串数据看做一个数据元素,如果为这些数据做一个索引,写入文件的时候我们就可以不去考虑指针的问题了,同样,从文件恢复数据的时候,按照这个索引重新建立指针就可以了。
这样的做法确实可行,但是如果自己去组织文件和结构显得很繁琐,所以我们可以利用数据库。有了数据库,我们就可以用数据库的列对应struct中的各个元素,如果struct中还有struct,那么就用关系型数据库,而且数据库有现成的ID索引(行),我们就不用自己造索引了,写数据库的时候按照数据的结构,写入数据库不同表的不同行中,读的时候也一样,只是最后要重新建立指针罢了。
不知道我的想法是否成熟,但是我是这么做的,虽然实际应用的次数很少。关于对象序列化我真的没什么研究,因为一直在用C,没有怎么研究过C++,这类的问题在《Thinking in C++》中应该有阐述。还有,如果有更好的办法一定告诉我!!
18、用2种不同的方法计算long变量的"1"bit的个数。(2分)
时间有限,代码我就不写全了,只写关键代码,说一下我最先想到的思路:
第一种方法:
for(i=sizeof(long)*8;i>=0;i--)
{if(num>>i&1) count++;}
这是用了位操作,先判断一个long型变量有多少位,然后不断位移进行与操作,如果位移后最低位是1,if为真,计数加一。如此循环,最后得到结果。
第二种方法:
i=sizeof(long)*8;
while(i)
{
if(num%2) count++;
num=num/2;
i--;
}
其实与前一种同出一辙,但是运用了除法和求余,原理差不多,不解释了。
其他的方法,我还想到了用typedef的位定义,虽然也是方法,不过挺麻烦的。至于别的,具体实现的方法太多了,原理其实都是差不多的。
19、任意给出一个C的基本数据类型,如何编码判断这个数据类型是有符号还是无符号的?(2分)
不得上机实验,写出下面代码的输出。解释这个行为是标准定义的,还是依赖实现的。(2分)
int i;
for (i = 0; i < 10; i++) {
int j = i;
printf ("%d\n", j);
}
第一个问题:
这仿佛是一个微软的面试题,用宏的办法判断比较简单,代码如下:
#define ISUNSIGNED(val) ((val)*0-1>0)
其实就是用到了有符号数可以小于0,但无符号数不可能小于0这个特性,不过这个宏对char或者其他类型的数据判断就无效了,当然谁也不会白痴到去判断一个char型的数据有没有符号。
第二个问题:
输出很简单:
0
1
2
3
4
5
6
7
8
9
至于标准定义还是依赖实现,我认为是ANSI C的标准定义,无论是for还是printf都是标准的ANSI C函数,因为当你运行这段代码的时候无需依赖任何头文件。
20、列出5种以上你所看过的C编程的书籍,并写简要书评。(5分)
对C的评价。如果要你改造一把菜刀,使之更加安全,你是否会使用这样的菜刀,为什么?(5分)
这个题目应该是最后放松的送分题了,没有标准答案,看的是个人的学习经历和对C的感悟。
我看过的C语言的书籍并不多,不到5本,看来为了凑数也要多看两本啊,现在让我深刻感受到了“书到用时方恨少”真正的含义!
我看过最多的,对我来说最重要的两本C语言的书是:老谭的《C程序设计》和两个米国人写的《新编C语言大全》。前者是“学电脑要从娃娃抓起”般的普及教材,同时也是各个中学、大学的C语言标准教材,内容相对比较少,而且没有涉及太深的知识,非常适合初学者;后者是我很久以前花了大价钱买的一本貌似很专业的书,确实比老谭写的详细的多,因为厚度就是老谭那本的两倍,很多东西都可以在那里找到。如果数据结构也能算的话,也算一本吧,感觉就是囫囵吞枣似的书籍,应付考试用的。要是再来两本C++的书就完美了,可惜我真没看过,或者看过也忘了名字了,惭愧……
对于C的评价,我简单的说一下自己的感觉,C语言之所以30多年来长盛不衰,因为其灵活且紧凑的代码结构,丰富的运算符和数据结构的表达,加上无与伦比的硬件操作能力,使其完美的兼顾了高级语言和低级语言的特点,同时也极大扩展了应用范围。一个优秀的编译器可以使其代码的执行率直逼汇编语言,而且又具备汇编语言不可比拟的可移植性。但是其数据的封装和语法的限制不够严格,在这点上不如其他高级语言,如C++就改善了许多。虽然指针的引入是C语言划时代的进步,但是其不安全性也逐渐显现出来,虽然C++做了改进,将指针保留了下来,但是高级语言发展到JAVA和.NET架构的时代,已经彻底取消了指针,这样做虽然提高了安全性,但是我们永远不要忘记指针给我们带来的快捷与便利。
最后一个菜刀问题,我不是很明白题目想说什么,如果菜刀是C,改造的菜刀是C++,那么对于安全性的改进我们没有理由不接受,因为事实也是如此。在这个时刻讲究安全性的时代,改进是必然了的,但是我们不要忘了,任何所谓的安全性都是基于严谨的思维方式,即便是更安全的C++,也是C写出来的。菜刀只是一个工具,可以切菜也可以切手指头,关键是你的刀功和安全意识好不好,而不是一味强调工具是否安全。
Linux运维工程师面试题
一、有文件file1
1、请用shell查询file1 里面空行的所在行号
awk ‘{if($0~/^$/)print NR}’ file
or
grep -n ^$ file |awk ‘BEGIN{FS=”:”}{print $1}’
2、编写ShellScript查询file1 以abc 结尾的行
grep abc$ file1
3、打印出file1 文件第1 到第3 行
sed -n ’1,3p’ file1
head -3 file1
二、如何将本地80 端口的请求转发到8080 端口,当前主机IP 为192.168.2.1
Iptables -A PREROUTING -d 192.168.2.1 -p tcp -m tcp ?dport 80 -j DNAT -to-destination 192.168.2.1:8080
三、crontab
在11 月份内,每天的早上6 点到12 点中,每隔2 小时执行一次/usr/bin/httpd.sh 怎么
实现
0 6-12/2 * 11 * /usr/bin/httpd.sh
四、编写个shell 脚本将/usr/local/test 目录下大于100K 的文件转移到/tmp 目录下
#!/bin/bash
for file in `ls /root`
do
if [ -f $file ]; then
if [ `ls -l $file|awk '{print $5}'` -gt 10000 ]; then
mv $file /tmp/
fi
fi
done
五、简述raid0 raid1 raid5 三种工作模式的工作原理及特点。
RAID 0:连续以位或字节为单位分割数据,并行读/写于多个磁盘上,因此具有很高的数据传输率,但它没有数据冗余,因此并不能算是真正的RAID 结构。RAID 0 只是单纯地提高性能,并没有为数据的可靠性提供保证,而且其中的一个磁盘失效将影响到所有数据。因此,RAID 0 不能应用于数据安全性要求高的场合。
RAID 1:它是通过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互为备份的数据。当原始数据繁忙时,可直接从镜像拷贝中读取数据,因此RAID 1 可以提高读取性能。RAID 1 是磁盘阵列中单位成本最高的,但提供了很高的数据安全性和可用性。当一个磁盘失效时,系统可以自动切换到镜像磁盘上读写 ,而不需要重组失效的数据。简单来说就是:镜象结构,类似于备份模式,一个数据被复制到两块硬盘上。
RAID10:高可靠性与高效磁盘结构一个带区结构加一个镜象结构,因为两种结构各有优缺点,因此可以相互补充。主要用于容量不大,但要求速度和差错控制的数据库中。
RAID5:分布式奇偶校验的独立磁盘结构,它的奇偶校验码存在于所有磁盘上,任何一个硬盘损坏,都可以根据其它硬盘上的校验位来重建损坏的数据。支持一块盘掉线后仍然正常运行。
六、oracle 数据库备份方式
物理备份:开启网络监听,备份数据库文件。
RMAN 备份:通过表空间文件在RMAN 模式对ORACLE 数据备份。
七、如何查看占用端口8080 的进程
lsof -i:8080
八、请写出apache2.X 版本的两种工作模式,以及各自工作原理。如何查看apache 当前所支持的模块,并且查看是工作在哪种模式下?
答案:
prefork(多进程,每个进程产生子进程)和worker(多进程,每个进程生成多个线程)
prefork 的工作原理是,控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers 设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32 个,直到满足MinSpareServers 设置的值为止。这就是预派生(prefork)的由来。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。
worker 是2.0 版中全新的支持多线程和多进程混合模型的MPM。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。但是,worker 也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性。这种MPM 的工作方式将是Apache 2.0 的发展趋势。
可以通过命令httpd -l 可以查看apache 当前的模块,如果带有worker.c 就是工作在worker 模式下,如果有prefork.c 就是工作在prefork.c 的模式下。
九、你使用过监控软件吗?说说其特点
使用nagios 对服务器进行监控,其特点可实时实现手机短信、电子邮件、MSN、飞信报警。使用cacti 对流量进行监控。
十、你对现在运维工程师的理解和以及对其工作的认识运维工程师在公司当中责任重大,需要保证时刻为公司及客户提供最高、最快、最稳定、最安全的服务。运维工程师的一个小小的失误,很有可能会对公司及客户造成重大损失,因此运维工程师的工作需要严谨及富有创新精神。
十一、linux 下常用的DNS服务软件是什么,举出几种常用的DNS记录,如果域名abc.com配置好了一台邮件服务器,IP 地址为202.106.0.20,我该如何做相关的解析?是否了解bind 的智能解析,如果了解请简述一下其原理
答案:
1)常用的DNS 软件是bind
2)A 记录 地址记录
MX 记录 邮件交换记录
CNAME 记录 别名域记录
3)修改abc.com 域名的配置文件,增加以下记录
IN MX 10 mail.abc.com.
mail IN A 202.106.0.20
4)bind 根据请求解析客户端的IP 地址,做出不同的解析,其原理是在配置文件中,设定了
view,在每个view 都有客户端的IP 地址段,bind 服务器根据请求解析客户端的IP 地址,
匹配不同的view,再根据该view 的配置,到相应的配置文件进行查询,将结果返回给请求
的客户端。
十二、通过apache 访问日志access.log 统计IP 和每个地址访问的次数,按访问量列出
前10 名。
日志格式样例如下
192.168.1.247 ? - [02/Jul/2010:23:44:59 +0800] “GET / HTTP/1.1″ 200 19
答案:
cat access_log | awk ‘{print $1}’ | uniq -c|sort -rn|head -10
//这个别的方法也能统计,但有些命令是必要的 awk,sort,uniq,主要看是否这些命令都
使用了。
十三、如何用MysqL 命令进行备份和恢复?以test 库为例,创建一个备份,并再用此备份
进行恢复。
MysqLdump -u root -p test > test.sql
MysqL -u root -p test < test.sql
//主要考对方msqldump > test.sql 和 MysqL < test.sql
十四、你认为在系统调优方面都包括哪些工作,以linux 为例,请简明阐述,并举一些参数
为例。
答案:
系统调优包括内核参数优化和应用优化2 个方面,对方只要从这两方面来说,就可以了,
尽量能有些经验的阐述。
有个文件如下:
http://a.domain.com/1.html
http://b.domain.com/1.html
http://c.domain.com/1.html
http://a.domain.com/2.html
http://b.domain.com/2.html
http://a.domain.com/3.html
要求:得到主机名(和域名),并统计哪个网址出现的次数,并排序。可以shell 或C。
得到的结果应该是:
3 a.domain.com
2 b.domain.com
1 c.domain.com
[root@mail ~]# awk ‘BEGIN{FS=”/”}{arr[$3]++}END{for(i in arr) print
arr[i],i}’ list| sort -r 答案
3 a.domain.com
2 b.domain.com
1 c.domain.com
挂载windows 的共享目录?
mount.cifs //IP/SHARE linux 的目录 --verbose -o user=username <--这个用户是
windows 下的用户--verbose 这个参数可以不加,它是显示过程的
例如mount.cifs //10.1.1.246/gongxiang /mnt --verbose -o user=gao
或者是mount -t cifs
umount /mnt 或umount.cifs /mnt -l <--取消挂载
图形界面:smb://IP
A B 网络是通的,最少列出五种传输文件的服务
nfs,ftp,scp,rsync,samba,http://
1.假设Apache 产生的日志文件名为access_log,在apache 正在运行时,执行命令mv
access_log access_log.bak,执行完后,请问新的apache 的日志会打印到哪里,为什么?
新的日志会打印在access_log.bak 中,因为apache 启动时会找到access_log 文件,
随时准备向文件中加入日志信息,
虽然此时文件被改名,但是由于服务正在运行,因为它的inode 节点的位置没有变,程序
打开的fd 仍然会指向原来那个inode,
不会因为文件名的改变而改变。apache 会继续向已改名的文件中追加日志,但是若重启
apache 服务,系统会检查access_log
文件是否存在,若不存在则创建。
2.在Shell 环境下,如何查看远程Linux 系统运行了多少时间?
2、监控主机执行: ssh user@被监控主机ip "uptime"
这样得到了被监控主机的uptime
3.处理以下文件内容,将域名取出并进行计数排序,如处理:
http://www.baidu.com/index.html
http://www.baidu.com/1.html
http://post.baidu.com/index.html
http://mp3.baidu.com/index.html
http://www.baidu.com/3.html
http://post.baidu.com/2.html
得到如下结果:
域名的出现的次数 域名
3 www.baidu.com
2 post.baidu.com
1 mp3.baidu.com
可以使用bash/perl/PHP/c 任意一种
3、[root@localhost shell]# cat file | sed -e ' s/http:\/\///' -e ' s/\/.*//' | sort |
uniq -c | sort -rn
3 www.baidu.com
2 post.baidu.com
1 mp3.baidu.com
[root@codfei4 shell]# awk -F/ '{print $3}' file |sort -r|uniq -c|awk '{print
$1"\t",$2}'
3 www.baidu.com
2 post.baidu.com
1 mp3.baidu.com
4.如果得到随机的字串,长度和字串中出现的字符表可定义,并将字串倒序显示,如
把0123456789 作为基准的字串字符表,产生一个6 位的字串642031,打印出的字串为
130246,可使用bash/perl/PHP/c 任意一种.
4、[root@localhost ~]# awk -v count=6 'BEGIN
{srand();str="0123456789";len=length(str);for(i=count;i>0;i--)
marry[i]=substr(str,int(rand()*len),1);for(i=count;i>0;i--)
printf("%c",marry[i]);printf("\n");for
(i=0;i<=count;i++) printf("%c",marry[i]);printf("\n")}'
838705
507838
5.如何查看当前Linux 系统的状态,如cpu 使用,内存使用,负载情况等.
5、Linux 系统中“/proc”是个伪文件目录,不占用系统空间,及时的反应出内存现在使用的
进程情况......其中许多文件都保存系统运行状态和相关信息
对于“/proc”中文件可使用文件查看命令浏览其内容,文件中包含系统特定信息:
cpuinfo 主机cpu 信息
filesystems 文件系统信息
meninfo 主机内存信息
version Linux 内存版本信息
diskstatus 磁盘负载情况
另外top 命令可以动态的显示当前系统进程用户的使用情况,而且是动态的显示出来,尤其
是在该命令显示出来的对上方对系统的情况进行汇总.
free 命令呢可以查看真实使用的内存 一般用free -m
使用lsof 、ps -aux 可以查看详细的每个进程的使用状况
dmesg 也是常用来查看系统性能的命令
#题目:有10 台被监控主机、一台监控机,在监控机上编写脚本,一旦某台被监控机器/
分区适用率大于80%, 就发邮件报警放到crontab 里面, 每10 分钟检查一次
#测试机器:虚拟机Linux as 4
#1.首先建立服务器间的信任关系。拿两台机器做测试
本机IP:192.168.1.6
[root@codfei ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y (以为我是第2 次建立关系所以此处覆盖原来的文件)
Enter passphrase (empty for no passphrase):(直接回车无须输入密钥)
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
04:37:13:2a:4b:10:af:c1:2b:03:3f:6b:27:ce:b9:62 root@codfei
[root@codfei ~]# cd .ssh/
[root@codfei .ssh]# ll
-rw------- 1 root root 883 Apr 25 17:51 id_rsa
-rw-r--r-- 1 root root 221 Apr 25 17:51 id_rsa.pub
-rw-r--r-- 1 root root 442 Apr 25 17:37 kNown_hosts
id_rsa 是密钥文件,id_rsa.pub 是公钥文件。
[root@codfei .ssh]# scp id_rsa.pub192.168.1.4:/root/.ssh/192.168.1.6
root@192.168.1.4's password:
id_rsa.pub 100% 221 0.2KB/s 00:00
这里把公钥文件取名为本机的ip 地址就是为了以后和更多的机器建立信任关系不发生混
淆。
现在登陆到192.168.1.4 机器
[root@codfei ~]# cd .ssh/
[root@codfei .ssh]# cat 192.168.1.6 >> authorized_keys
然后回到192.168.1.6 机器直接
[root@codfei .ssh]# ssh 192.168.1.4
Last login: Wed Aug 8 12:14:42 2007 from 192.168.1.6
这样就可以了,里面偶尔涉及到权限问题。一般./ssh 文件夹是755 authorized_keys 为
600 或者644
####脚本如下#######################
#!/bin/bash
#SCRIPT:df_check.sh
#Writeen by codfei Mon Sep 3 07:25:28 CST 2007
#PURPOSE:This script is used to monitor for full filesystems.
#######################Begining####################
####################
FSMAX="80"
remote_user='root' #####完全可以不用root
remote_ip=(192.168.1.5 192.168.1.6 192.168.1.7 192.168.1.8 192.168.1.9
192.168.1.10 192.168.1.11 192.168.1.12 192.168.1.13 192.168.1.14 ) ---->
这里填写你要监控的主机ip
ip_num='0'
while [ "$ip_num" -le "$(expr ${#remote_ip[@]} - 1)" ]
do
read_num='1'
ssh "$remote_user"@"${remote_ip[$ip_num]}" df -h > /tmp/diskcheck_tmp
grep '^/dev/*' /tmp/diskcheck_tmp|awk '{print $5}'|sed 's/\%//g' >
/tmp/diskcheck_num_tmp
while [ "$read_num" -le $(wc -l < /tmp/diskcheck_num_tmp) ]
do
size=$(sed -n "$read_num"'p' /tmp/diskcheck_num_tmp)
if [ "$size" -gt "$FSMAX" ]
then
$(grep '^/dev/*' /tmp/diskcheck_tmp|sed -n $read_num'p' >
/tmp/disk_check_mail)
$(echo ${remote_ip[$ip_num]} >> /tmp/disk_check_mail)
$(mail -s "diskcheck_alert" admin < /tmp/disk_check_mail)
fi
read_num=$(expr $read_num + 1)
done
ip_num=$(expr $ip_num + 1)
done
#############over################################
################让脚本每十分钟执行一次#############
在cron 表中加入
0/10 * * * * /home/codfei/diskcheck.sh 2>&1
################################################
##########################
比如, ext2 文件系统, 如果异常死机,开机如何修复文件系统?
如果异常关机,比如断电,通知机房的人开机之后,
我们需要远程修复、检查文件系统
除了/分区之外, 其他的分区:
umount /home
fsck -y /home
/ 分区需要开机之后, 由机房的人来扫描
随后我们再登录并扫描/home 等其他分区
如何查看一个进程所使用的文件句柄?
看这里面 /proc/进程号/fd/
的个数就行了
简单的比如如何查看apache 进程数
[root@localhost fd]# ps -ef|grep httpd|wc -l
1
如何统计apache 的每秒访问数?
tail access_log | awk '{print $1,$4}'
[root@localhost logs]# grep -c `date -d '3 second ago' +%T` access_log
0
################################################
1、/proc/sys 子目录的作用
该子目录的作用是报告各种不同的内核参数,并让您能交互地更改其中的某些。与 /proc
中所有其他文件不同,该目录中的某些文件可以写入,不过这仅针对 root。
其中的目录以及文件的详细列表将占据过多的篇幅,而且该目录的内容是依赖于系统的,而
大部分的文件也仅仅对某些特殊的应用程序有用。然而,以下是该子目录的两个最常见的用
途:
允许路由:即便是 Mandrakelinux 默认的内核也是允许路由的,您必需显式允许它这么
做。为此,您只要以 root 身份键入以下命令:
$ echo 1 >/proc/sys/net/ipv4/ip_forward
如果您要禁用路由,请将上述命令中的 1 改为 0。
阻止 IP 欺骗:IP 欺骗会让人认为某个来自于外部的某个数据包是来自于它到达的那个接
口。这一技术常被骇客(cracker)所使用。您可以让内核阻止这种入侵。请键入:
$ echo 1 >/proc/sys/net/ipv4/conf/all/rp_filter
这样,这种攻击就不再可能了。
这些改变仅当系统运行时有效。在系统重新启动之后,它们会改会它们的默认值。要在启动
时就改动这些值,您可以将您在 shell 提示符后键入的命令添加到 /etc/rc.d/rc.local 中
以免每次都键入它们。另一个方法是修改
/etc/sysctl.conf
2、将一个文本的奇数行和偶数行合并,第2 行和第3 行合并
[root@localhost bin]# cat 1
48 Oct 3bc1997 lpas 68.00 lvx2a 138
484 Jan 380sdf1 usp 78.00 deiv 344
483 nov 7pl1998 usp 37.00 kvm9d 644
320 aug der9393 psh 83.00 wiel 293
231 jul sdf9dsf sdfs 99.00 werl 223
230 nov 19dfd9d abd 87.00 sspan 230
219 sept 5ap1996 usp 65.00 lvx2c 189
216 Sept 3zl1998 usp 86.00 kvm9e 234
[root@localhost bin]# sed '$!N;s/\n/ /g' 1
48 Oct 3bc1997 lpas 68.00 lvx2a 138 484 Jan 380sdf1 usp 78.00 deiv 344
483 nov 7pl1998 usp 37.00 kvm9d 644 320 aug der9393 psh 83.00 wiel 293
231 jul sdf9dsf sdfs 99.00 werl 223 230 nov 19dfd9d abd 87.00 sspan 230
219 sept 5ap1996 usp 65.00 lvx2c 189 216 Sept 3zl1998 usp 86.00 kvm9e 234
[root@localhost bin]# sed -n -e 2p -e 3p 1|sed '$!N;s/\n/ /'
484 Jan 380sdf1 usp 78.00 deiv 344 483 nov 7pl1998 usp 37.00 kvm9d 644
3、read 命令5 秒后自动退出
[root@localhost bin]# read -t 5
4、自动ftp 上传
#!/bin/sh
ftp -n<<END_FTP
open 192.168.1.4
user codfei duibuqi //用户名codfei 密码duibuqi
binary
prompt off //关闭提示
mput test //上传test
close
bye
END_FTP
自动ssh 登陆 从A 到B 然后再到c
#!/usr/bin/expect -f
set timeout 30
spawn ssh codfei@B
expect "password:"
send "pppppp\r"
expect "]*"
send "ssh codfei@C\r"
expect "password:"
send "pppppp\r"
interact
5、#打印第一个域
[root@localhost bin]# cat 3
eqeqedadasdD
eqeqdadfdfDD
fdsfdsfQWEDD
DSADASDSADSA
[root@localhost bin]#
[root@localhost bin]#
[root@localhost bin]# awk -F "" '{print $1}' 3
e
e
f
D
6、实现字符串翻转
[root@localhost bin]# cat 8
qweqewqedadaddas
[root@localhost bin]# rev 8
saddadadeqweqewq
########################################第2 次电面
7、sed awk grep 哪个最好
我答的是 哪个掌握的精通,都很好,但是还是问我哪个最好,我只能说awk 了,对于行操
作和列操作都可以操作的很好。
8、grep -E -P 是什么意思
我说的是-E,--extended-regexp 采用规则表示式去解释样式。 -P 不太清楚
9、请介绍一下你对运维这个工作的理解,和应该具备的素质。
shell 脚本编程部分:
1.从a.log 文件中提取包含“WARNING”或”FATAL”,同时不包含“IGnor”的行,然后,
提取以“:”分割的第五个字段?
2.添加一个新组为class01,然后,添加属于这个组的30 个用户,用户名的形式为stdXX,
其中,XX 从01 到30?
3.在每个月的第一天备份并压缩/etc 目录下的所有内容,存放在/root/backup 目录里,
且文件名为如下形式yymmdd_etc,yy 为年,mm为月,dd 为日。shell 程序fileback
存放在/usr/bin 目录下?
4.用shell 编程,判断一文件是不是字符设备文件,如果是将其拷贝到/dev 目录下?
参考答案:
#!/bin/bash
directory=/dev
for file in anaconda-ks.cfg install.log install.log.syslog
do
if [ -f $file ]
then
cp $file $directory/$file.bak
echo " HI,$LOGNAME $file is backed up already in $directory !!"
fi
done
5.某系统管理员需要每天做一定的重复工作,编制一个解决方案:
(1).从下午4:50 删除/abc 目录下的全部子目录和全部文件;
(2).从早上8:00~下午6:00 每小时读取/xyz 目录下x1 文件中每行第一个域的全部数
据加入到/backup 目录下的back01.txt 文件内;
(3).每逢周一下午5:50 将/data 目录下的所有目录和文件归档并压缩为文件
backup.tar.gz;
(4).在下午5:55 将IDE 接口的CD-ROM ?载(假设CD-ROM 的设备名为hdc);
(5).在早上8:00 前开机后启动。
---------------------------------------
------------------
1、简述Apache 两种工作模式,以及它们之间的区别。
答案:最主要的两种模式是prefork 模式与worker 模式。prefork 每个子进程只有一个线
程,效率高但消耗内存大,是unix 下默认的模式;worker 模式每个子进程有多个线程,
内存消耗低,但一个线程崩溃会牵连其它同子进程的线程。
2、用iptables 添加一个规则允许192.168.0.123 访问本机3306 端口
iptables -I INPUT 1 -p tcp -m tcp --dport 3306 -s 192.168.0.123 -j ACCEPT
3、如何对一台Linux 服务器进行系统性能调优,列举出参数。
4、DNS 服务器的工作原理。
5、修改第一块网卡的路径是什么。
/etc/sysconfig/network-scripts/ifcfg-eth0
7、使用shell,建立class1 用户组,再批量建立stu1--stu30 的用户,并指定用户组为
class1。
vi autoaddusr
#!/usr/bin/PHP -q
<?PHP
exec("groupadd class1");
for($i=1; $i<=30; $i++){
exec("useradd -G class1 stu".$i);
}
?>
chmod +x autoaddusr
./autoaddusr
8、个人对该工作的未来如何规划,需要加强哪些能力。
首先,我有一颗真诚的心,遇事沉着冷静,不急不躁;
其次,我有相应的专业知识和工作经验。一年多的系统管理经历锻炼了我在这个行业的业务
能力,并对行业前景和发展动态有相应的了解;
最后,我会用踏实的作风在今后的工作中证明我自己的能力!
9、日常监控都需要监控哪些?
1)硬件:
cpu:/proc/cpuinfo
内存:/proc/meminfo
硬盘:fdisk -l
2)系统:
负载:/proc/loadavg
uptime 查看实时load average、swap
虚拟内存:vmstat(参数-s;2 4)
SUID,用户,进程
系统日志:tail -f /var/log/messages
logwatch --print --range Today --service SSHD --service pam_unix
3)网络:Host_Alive,Ping,端口,连接
1.如何将本地80 端口的请求转发到8080 端口,当前主机IP 为192.168.16.1,其中本地
网卡eth0:
答:
#iptables -t nat -A PREROUTING -d 192.168.16.1 -p tcp --dport 80 -j DNAT --to
192.168.16.1:8080
或者:
#iptables -t nat -A PREROUTING -i eth0 -d 192.168.16.1 -p tcp -m tcp --dport
80 -j REDIRECT --to-ports 8080
2.什么是NAT,常见分为那几种,DNAT 与SNAT 有什么不同,应用事例有那些?
3.包过滤防火墙与代理应用防火墙有什么区别,能列举几种相应的产品吗?
4.iptables 是否支持time 时间控制用户行为,如有请写出具体操作步骤
5.说出你知道的几种linux/unix 发行版本
6.列出linux 常见打包工具并写相应解压缩参数(至少三种)
7.计划每星期天早8 点服务器定时重启,如何实现?
8.列出作为完整邮件系统的软件,至少二类
9,当用户在浏览器当中输入一个网g 站,说说计算机对dns 解释经过那些流程?注:本机
跟本地dns 还没有缓存。
答: a.用户输入网址到浏览器
b.浏览器发出DNS 请求信息
c.计算机首先查询本机HOST 文件,看是否存在,存在直接返回结果,不存在,继续下一
步
d.计算机按照本地DNS 的顺序,向合法dns 服务器查询IP 结果,
e.合法dns 返回dns 结果给本地dns,本地dns 并缓存本结果,直到TTL 过期,才再次
查询此结果
f.返回IP 结果给浏览器
g.浏览器根据IP 信息,获取页面
10,我们都知道,dns 既采用了tcp 协议,又采用了udp 协议,什么时候采用tcp 协议?
什么时候采用udp 协议?为什么要这么设计?
答:这个题需要理解的东西比较的多,分一下几个方面
a,从数据包大小上分:UDP 的最大包长度是65507 个字节,响应dns 查询的时候数据包
长度超过512 个字节,而返回的只要前512 个字节,这时名字解释器通常使用TCP 从发
原来的请求。
b,从协议本身来分:大部分的情况下使用UDP 协议,大家都知道UDP 协议是一种不可靠
的协议,dns 不像其它的使用UDP 的Internet 应用 (如:TFTP,BOOTP 和SNMP 等),
大部分集中在局域网,dns 查询和响应需要经过广域网,分组丢失和往返时间的不确定性在
广域网比局域网上更大,这就要求dns 客户端需要好的重传和超时算法,这时候使用TCP
11,一个EXT3 的文件分区,当使用touch test.file 命令创建一个新文件时报错,报错的
信息是提示磁盘已满,但是采用df -h 命令查看磁盘大小时,只使用了,60%的磁盘空间,
为什么会出现这个情况,说说你的理由。
答:两种情况,一种是磁盘配额问题,另外一种就是EXT3 文件系统的设计不适合很多小
文件跟大文件的一种文件格式,出现很多小文件时,容易导致inode 耗尽了。
12,我们都知道FTP 协议有两种工作模式,说说它们的大概的一个工作流程?
FTP 两种工作模式:主动模式(Active FTP)和被动模式(Passive FTP)
在主动模式下,FTP 客户端随机开启一个大于1024 的端口N 向服务器的21 号端口发起
连接,然后开放N+1 号端口进行监听,并向服务器发出PORT N+1 命令。
服务器接收到命令后,会用其本地的FTP 数据端口(通常是20)来连接客户端指定的端口
N+1,进行数据传输。
在被动模式下,FTP 客户端随机开启一个大于1024 的端口N 向服务器的21 号端口发起
连接,同时会开启N+1 号端口。然后向服务器发送PASV 命令,通知服务器自己处于被动
模式。服务器收到命令后,会开放一个大于1024 的端口P 进行监听,然后用PORT P 命
令通知客户端,自己的数据端口是P。客户端收到命令后,会通过
N+1 号端口连接服务器的端口P,然后在两个端口之间进行数据传输。
总的来说,主动模式的FTP 是指服务器主动连接客户端的数据端口,被动模式的FTP 是指
服务器被动地等待客户端连接自己的数据端口。
被动模式的FTP 通常用在处于防火墙之后的FTP 客户访问外界FTp 服务器的情况,因为在
这种情况下,防火墙通常配置为不允许外界访问防火墙之
后主机,而只允许由防火墙之后的主机发起的连接请求通过。
因此,在这种情况下不能使用主动模式的FTP 传输,而被动模式的FTP 可以良好的工作。
13.编写个shell 脚本将当前目录下大于10K 的文件转移到/tmp 目录下
#/bin/sh
#Programm :
# Using for move currently directory to /tmp
for FileName in `ls -l |awk '$5>10240 {print $9}'`
do
mv $FileName /tmp
done
ls -al /tmp
echo "Done! "
14.apache 有几种工作模式,分别介绍下其特点,并说明什么情况下采用不同的工作模
式?
apache 主要有两种工作模式:prefork(apache 的默认安装模式)和worker(可以在编译
的时候加参数--with-mpm-worker 选择工作模式)
prefork 的特点是:(预派生)
1.这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销
2.可以防止意外的内存泄漏
3.在服务器负载下降的时候会自动减少子进程数
worker 的特点是:支持混合的多线程多进程的多路处理模块
如果对于一个高流量的HTTP 服务器,worker MPM 是一个比较好的选择,因为worker
MPM 占用的内存要比prefork 要小。
15.名词解释 HDLC,VTP,OSPF,RIP,DDOS,system
V,GNU,netscreen,ssh,smartd,apache,WAIT_TIME 等等
16.编写shell 脚本获取本机的网络地址。比如:本机的ip 地址是:
192.168.100.2/255.255.255.0,那么它的网络地址是
192.168.100.1/255.255.255.0
方法一:
1. #!/bin/bash
2. #This script print ip and network
3. file="/etc/sysconfig/network-scripts/ifcfg-eth0"
4. if [ -f $file ] ;then
5. IP=`grep "IPADDR" $file|awk -F"=" '{ print $2 }'`
6. MASK=`grep "NETMASK" $file|awk -F"=" '{ print $2 }'`
7. echo "$IP/$MASK"
8. exit 1
9. fi
方法二:
1. #!/bin/bash
2. #This programm will printf ip/network
3. #
4. IP=`ifconfig eth0 |grep 'inet ' |sed 's/^.*addr://g'|sed 's/ Bcast.*$//g'`
5. NETMASK=`ifconfig eth0 |grep 'inet '|sed 's/^.*Mask://g'`
6. echo "$IP/$NETMASK"
7. exit
17.在命令行下发一邮件,发件人:123@abc.com,收信人:abc@xyz.com
二简答题:
1.linux 下如何改IP地址,主机名及DNS
2.linux 下如何添加路由
3.简述linux 下编译内核的意义与步骤
4.简述Linux 启动过程
5.简述DDOS 攻击的原理
6.简述Tcp 三次握手的过程
7.简述VPN,常见有哪几种?
今天关于比特 | 某公司测试工程师面试:Linux命令的讲解已经结束,谢谢您的阅读,如果想了解更多关于2019软件测试工程师面试题集锦、Linux 运维工程师面试题整理、Linux工程师面试题C、Linux运维工程师面试题的相关知识,请在本站搜索。
本文标签: