标签 面试 下的文章

面试可能会有压力,但 58% 的公司告诉 Dice 和 Linux 基金会,他们需要在未来几个月内聘请开源人才。学习如何提出正确的问题。

Dice 和 Linux 基金会的年度开源工作报告揭示了开源专业人士的前景以及未来一年的招聘活动。在今年的报告中,86% 的科技专业人士表示,了解开源推动了他们的职业生涯。然而,当在他们自己的组织内推进或在别处申请新职位的时候,有这些经历会发生什么呢?

面试新工作绝非易事。除了在准备新职位时还要应付复杂的工作,当面试官问“你有什么问题要问吗?”时,适当的回答更增添了压力。

在 Dice,我们从事职业、建议,并将技术专家与雇主连接起来。但是我们也在公司里雇佣技术人才来开发开源项目。实际上,Dice 平台基于许多 Linux 发行版,我们利用开源数据库作为我们搜索功能的基础。总之,如果没有开源软件,我们就无法运行 Dice,因此聘请了解和热爱开源软件的专业人士至关重要。

多年来,我在面试中了解到提出好问题的重要性。这是一个了解你的潜在新雇主的机会,以及更好地了解他们是否与你的技能相匹配。

这里有三个要问的重要问题,以及其重要的原因:

1、 公司对员工在空闲时间致力于开源项目或编写代码的立场是什么?

这个问题的答案会告诉正在面试的公司的很多信息。一般来说,只要它与你在该公司所从事的工作没有冲突,公司会希望技术专家为网站或项目做出贡献。在公司之外允许这种情况,也会在技术组织中培养出一种创业精神,并教授技术技能,否则在正常的日常工作中你可能无法获得这些技能。

2、 项目如何区分优先级?

由于所有的公司都成为了科技公司,所以在创新的客户面对技术项目与改进平台本身之间往往存在着分歧。你会努力保持现有的平台最新么?或者致力于公众开发新产品?根据你的兴趣,答案可以决定公司是否适合你。

3、 谁主要决定新产品,开发者在决策过程中有多少投入?

这个问题是了解谁负责公司创新(以及与他/她有多少联系),还有一个是了解你在公司的职业道路。在开发新产品之前,一个好的公司会和开发人员和开源人才交流。这看起来不用多想,但有时会错过这步,意味着在新产品发布之前协作环境的不同或者混乱的过程。

面试可能会有压力,但是 58% 的公司告诉 Dice 和 Linux 基金会他们需要在未来几个月内聘用开源人才,所以记住高需求会让像你这样的专业人士成为雇员。以你想要的方向引导你的事业。

现在下载完整的 2017 年开源工作报告。


via: https://www.linux.com/blog/os-jobs/2017/12/3-essential-questions-ask-your-next-tech-interview

作者:Brian Hostetter 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Shilpa Nair 刚于2015年毕业。她之后去了一家位于 Noida,Delhi 的国家新闻电视台,应聘实习生的岗位。在她去年毕业季的时候,常逛 Tecmint 寻求作业上的帮助。从那时开始,她就常去 Tecmint。

Linux Interview Questions on RPM

有关 RPM 方面的 Linux 面试题

所有的问题和回答都是 Shilpa Nair 根据回忆重写的。

“大家好!我是来自 Delhi 的Shilpa Nair。我不久前才顺利毕业,正寻找一个实习的机会。在大学早期的时候,我就对 UNIX 十分喜爱,所以我也希望这个机会能适合我,满足我的兴趣。我被提问了很多问题,大部分都是关于 RedHat 包管理的基础问题。”

下面就是我被问到的问题,和对应的回答。我仅贴出了与 RedHat GNU/Linux 包管理相关的,也是主要被提问的。

1,Linux 里如何查找一个包安装与否?假设你需要确认 ‘nano’ 有没有安装,你怎么做?

回答:为了确认 nano 软件包有没有安装,我们可以使用 rpm 命令,配合 -q 和 -a 选项来查询所有已安装的包

# rpm -qa nano
或
# rpm -qa | grep -i nano

nano-2.3.1-10.el7.x86_64

同时包的名字必须是完整的,不完整的包名会返回到提示符,不打印任何东西,就是说这包(包名字不全)未安装。下面的例子会更好理解些:

我们通常使用 vim 替代 vi 命令。当时如果我们查找安装包 vi/vim 的时候,我们就会看到标准输出上没有任何结果。

# vi
# vim

尽管如此,我们仍然可以像上面一样运行 vi/vim 命令来清楚地知道包有没有安装。只是因为我们不知道它的完整包名才不能找到的。如果我们不确切知道完整的文件名,我们可以使用通配符:

# rpm -qa vim*

vim-minimal-7.4.160-1.el7.x86_64

通过这种方式,我们可以获得任何软件包的信息,安装与否。

2. 你如何使用 rpm 命令安装 XYZ 软件包?

回答:我们可以使用 rpm 命令安装任何的软件包(*.rpm),像下面这样,选项 -i(安装),-v(冗余或者显示额外的信息)和 -h(在安装过程中,打印#号显示进度)。

# rpm -ivh peazip-1.11-1.el6.rf.x86_64.rpm

Preparing...                          ################################# [100%]
Updating / installing...
   1:peazip-1.11-1.el6.rf             ################################# [100%]

如果要升级一个早期版本的包,应加上 -U 选项,选项 -v 和 -h 可以确保我们得到用 # 号表示的冗余输出,这增加了可读性。

3. 你已经安装了一个软件包(假设是 httpd),现在你想看看软件包创建并安装的所有文件和目录,你会怎么做?

回答:使用选项 -l(列出所有文件)和 -q(查询)列出 httpd 软件包安装的所有文件(Linux 哲学:所有的都是文件,包括目录)。

# rpm -ql httpd

/etc/httpd
/etc/httpd/conf
/etc/httpd/conf.d
...

4. 假如你要移除一个软件包,叫 postfix。你会怎么做?

回答:首先我们需要知道什么包安装了 postfix。查找安装 postfix 的包名后,使用 -e(擦除/卸载软件包)和 -v(冗余输出)两个选项来实现。

# rpm -qa postfix*

postfix-2.10.1-6.el7.x86_64

然后移除 postfix,如下:

# rpm -ev postfix-2.10.1-6.el7.x86_64

Preparing packages...
postfix-2:3.0.1-2.fc22.x86_64

5. 获得一个已安装包的具体信息,如版本,发行号,安装日期,大小,总结和一个简短的描述。

回答:我们通过使用 rpm 的选项 -qi,后面接包名,可以获得关于一个已安装包的具体信息。

举个例子,为了获得 openssh 包的具体信息,我需要做的就是:

# rpm -qi openssh

[root@tecmint tecmint]# rpm -qi openssh
Name        : openssh
Version     : 6.8p1
Release     : 5.fc22
Architecture: x86_64
Install Date: Thursday 28 May 2015 12:34:50 PM IST
Group       : Applications/Internet
Size        : 1542057
License     : BSD
....

6. 假如你不确定一个指定包的配置文件在哪,比如 httpd。你如何找到所有 httpd 提供的配置文件列表和位置。

回答: 我们需要用选项 -c 接包名,这会列出所有配置文件的名字和他们的位置。

# rpm -qc httpd

/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf.modules.d/00-base.conf
/etc/httpd/conf/httpd.conf
/etc/sysconfig/httpd

相似地,我们可以列出所有相关的文档文件,如下:

# rpm -qd httpd

/usr/share/doc/httpd/ABOUT_APACHE
/usr/share/doc/httpd/CHANGES
/usr/share/doc/httpd/LICENSE
...

我们也可以列出所有相关的证书文件,如下:

# rpm -qL openssh

/usr/share/licenses/openssh/LICENCE

忘了说明上面的选项 -d 和 -L 分别表示 “文档” 和 “证书”,抱歉。

7. 你找到了一个配置文件,位于‘/usr/share/alsa/cards/AACI.conf’,现在你不确定该文件属于哪个包。你如何查找出包的名字?

回答:当一个包被安装后,相关的信息就存储在了数据库里。所以使用选项 -qf(-f 查询包拥有的文件)很容易追踪谁提供了上述的包。

# rpm -qf /usr/share/alsa/cards/AACI.conf
alsa-lib-1.0.28-2.el7.x86_64

类似地,我们可以查找(谁提供的)关于任何子包,文档和证书文件的信息。

8. 你如何使用 rpm 查找最近安装的软件列表?

回答:如刚刚说的,每一样被安装的文件都记录在了数据库里。所以这并不难,通过查询 rpm 的数据库,找到最近安装软件的列表。

我们通过运行下面的命令,使用选项 -last(打印出最近安装的软件)达到目的。

# rpm -qa --last

上面的命令会打印出所有安装的软件,最近安装的软件在列表的顶部。

如果我们关心的是找出特定的包,我们可以使用 grep 命令从列表中匹配包(假设是 sqlite ),简单如下:

# rpm -qa --last | grep -i sqlite

sqlite-3.8.10.2-1.fc22.x86_64                 Thursday 18 June 2015 05:05:43 PM IST

我们也可以获得10个最近安装的软件列表,简单如下:

# rpm -qa --last | head

我们可以重定义一下,输出想要的结果,简单如下:

# rpm -qa --last | head -n 2

上面的命令中,-n 代表数目,后面接一个常数值。该命令是打印2个最近安装的软件的列表。

9. 安装一个包之前,你如果要检查其依赖。你会怎么做?

回答:检查一个 rpm 包(XYZ.rpm)的依赖,我们可以使用选项 -q(查询包),-p(指定包名)和 -R(查询/列出该包依赖的包,嗯,就是依赖)。

# rpm -qpR gedit-3.16.1-1.fc22.i686.rpm 

/bin/sh
/usr/bin/env
glib2(x86-32) >= 2.40.0
gsettings-desktop-schemas
gtk3(x86-32) >= 3.16
gtksourceview3(x86-32) >= 3.16
gvfs
libX11.so.6
...

10. rpm 是不是一个前端的包管理工具呢?

回答不是!rpm 是一个后端管理工具,适用于基于 Linux 发行版的 RPM (此处指 Redhat Package Management)。

YUM,全称 Yellowdog Updater Modified,是一个 RPM 的前端工具。YUM 命令自动完成所有工作,包括解决依赖和其他一切事务。

最近,DNF(YUM命令升级版)在Fedora 22发行版中取代了 YUM。尽管 YUM 仍然可以在 RHEL 和 CentOS 平台使用,我们也可以安装 dnf,与 YUM 命令共存使用。据说 DNF 较于 YUM 有很多提高。

知道更多总是好的,保持自我更新。现在我们移步到前端部分来谈谈。

11. 你如何列出一个系统上面所有可用的仓库列表。

回答:简单地使用下面的命令,我们就可以列出一个系统上所有可用的仓库列表。

# yum repolist
或
# dnf repolist

Last metadata expiration check performed 0:30:03 ago on Mon Jun 22 16:50:00 2015.
repo id       repo name                      status
*fedora       Fedora 22 - x86_64             44,762
ozonos        Repository for Ozon OS         61
*updates      Fedora 22 - x86_64 - Updates   

上面的命令仅会列出可用的仓库。如果你需要列出所有的仓库,不管可用与否,可以这样做。

# yum repolist all
或
# dnf repolist all

Last metadata expiration check performed 0:29:45 ago on Mon Jun 22 16:50:00 2015.
repo id           repo name                       status
*fedora           Fedora 22 - x86_64              enabled: 44,762
fedora-debuginfo  Fedora 22 - x86_64 - Debug      disabled
fedora-source     Fedora 22 - Source              disabled
ozonos            Repository for Ozon OS          enabled:     61
*updates          Fedora 22 - x86_64 - Updates    enabled:  5,018
updates-debuginfo Fedora 22 - x86_64 - Updates - Debug

12. 你如何列出一个系统上所有可用并且安装了的包?

回答:列出一个系统上所有可用的包,我们可以这样做:

# yum list available
或
# dnf list available

ast metadata expiration check performed 0:34:09 ago on Mon Jun 22 16:50:00 2015.
Available Packages
0ad.x86_64                 0.0.18-1.fc22                   fedora 
0ad-data.noarch            0.0.18-1.fc22                   fedora 
0install.x86_64            2.6.1-2.fc21                    fedora 
0xFFFF.x86_64              0.3.9-11.fc22                   fedora 
2048-cli.x86_64            0.9-4.git20141214.723738c.fc22  fedora 
2048-cli-nocurses.x86_64   0.9-4.git20141214.723738c.fc22  fedora 
....

而列出一个系统上所有已安装的包,我们可以这样做。

# yum list installed
或
# dnf list installed

Last metadata expiration check performed 0:34:30 ago on Mon Jun 22 16:50:00 2015.
Installed Packages
GeoIP.x86_64                    1.6.5-1.fc22       @System
GeoIP-GeoLite-data.noarch       2015.05-1.fc22     @System
NetworkManager.x86_64           1:1.0.2-1.fc22     @System
NetworkManager-libnm.x86_64     1:1.0.2-1.fc22     @System
aajohan-comfortaa-fonts.noarch  2.004-4.fc22       @System
....

而要同时满足两个要求的时候,我们可以这样做。

# yum list
或
# dnf list

Last metadata expiration check performed 0:32:56 ago on Mon Jun 22 16:50:00 2015.
Installed Packages
GeoIP.x86_64                    1.6.5-1.fc22       @System
GeoIP-GeoLite-data.noarch       2015.05-1.fc22     @System
NetworkManager.x86_64           1:1.0.2-1.fc22     @System
NetworkManager-libnm.x86_64     1:1.0.2-1.fc22     @System
aajohan-comfortaa-fonts.noarch  2.004-4.fc22       @System
acl.x86_64                      2.2.52-7.fc22      @System
....

13. 你会怎么在一个系统上面使用 YUM 或 DNF 分别安装和升级一个包与一组包?

回答:安装一个包(假设是 nano),我们可以这样做,

  # yum install nano

而安装一组包(假设是 Haskell),我们可以这样做,

  # yum groupinstall 'haskell'

升级一个包(还是 nano),我们可以这样做,

  # yum update nano

而为了升级一组包(还是 haskell),我们可以这样做,

# yum groupupdate 'haskell'

14. 你会如何同步一个系统上面的所有安装软件到稳定发行版?

回答:我们可以一个系统上(假设是 CentOS 或者 Fedora)的所有包到稳定发行版,如下,

 # yum distro-sync      [在 CentOS/ RHEL]
 或
 # dnf distro-sync      [在 Fedora 20之后版本]

似乎来面试之前你做了相当不多的功课,很好!在进一步交谈前,我还想问一两个问题。

15. 你对 YUM 本地仓库熟悉吗?你尝试过建立一个本地 YUM 仓库吗?让我们简单看看你会怎么建立一个本地 YUM 仓库。

回答:首先,感谢你的夸奖。回到问题,我必须承认我对本地 YUM 仓库十分熟悉,并且在我的本地主机上也部署过,作为测试用。

1、 为了建立本地 YUM 仓库,我们需要安装下面三个包:

# yum install deltarpm  python-deltarpm  createrepo

2、 新建一个目录(假设 /home/$USER/rpm),然后复制 RedHat/CentOS DVD 上的 RPM 包到这个文件夹下

# mkdir /home/$USER/rpm
# cp /path/to/rpm/on/DVD/*.rpm /home/$USER/rpm

3、 新建基本的库头文件如下。

# createrepo -v /home/$USER/rpm

4、 在路径 /etc/yum.repo.d 下创建一个 .repo 文件(如 abc.repo):

cd /etc/yum.repos.d && cat << EOF abc.repo
[local-installation]name=yum-local
baseurl=file:///home/$USER/rpm
enabled=1
gpgcheck=0
EOF

重要:用你的用户名替换掉 $USER。

以上就是创建一个本地 YUM 仓库所要做的全部工作。我们现在可以从这里安装软件了,相对快一些,安全一些,并且最重要的是不需要 Internet 连接。

好了!面试过程很愉快。我已经问完了。我会将你推荐给 HR。你是一个年轻且十分聪明的候选者,我们很愿意你加入进来。如果你有任何问题,你可以问我。

:谢谢,这确实是一次愉快的面试,我感到今天非常幸运,可以搞定这次面试...

显然,不会在这里结束。我问了很多问题,比如他们正在做的项目。我会担任什么角色,负责什么,,,balabalabala

小伙伴们,这之后的 3 天会经过 HR 轮,到时候所有问题到时候也会被写成文档。希望我当时表现不错。感谢你们所有的祝福。

谢谢伙伴们和 Tecmint,花时间来编辑我的面试经历。我相信 Tecmint 好伙伴们做了很大的努力,必要要赞一个。当我们与他人分享我们的经历的时候,其他人从我们这里知道了更多,而我们自己则发现了自己的不足。

这增加了我们的信心。如果你最近也有任何类似的面试经历,别自己蔵着。分享出来!让我们所有人都知道。你可以使用如下的表单来与我们分享你的经历。


via: http://www.tecmint.com/linux-rpm-package-management-interview-questions/

作者:Avishek Kumar 译者:wi-cuckoo 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

Nishita Agarwal是Tecmint的用户,她将分享关于她刚刚经历的一家公司(印度的一家私人公司Pune)的面试经验。在面试中她被问及许多不同的问题,但她是iptables方面的专家,因此她想分享这些关于iptables的问题和相应的答案给那些以后可能会进行相关面试的人。

Linux防火墙Iptables面试问题

所有的问题和相应的答案都基于Nishita Agarwal的记忆并经过了重写。

“嗨,朋友!我叫Nishita Agarwal。我已经取得了理学学士学位,我的专业集中在UNIX和它的变种(BSD,Linux)。它们一直深深的吸引着我。我在存储方面有1年多的经验。我正在寻求职业上的变化,并将供职于印度的Pune公司。”

下面是我在面试中被问到的问题的集合。我已经把我记忆中有关iptables的问题和它们的答案记录了下来。希望这会对您未来的面试有所帮助。

1. 你听说过Linux下面的iptables和Firewalld么?知不知道它们是什么,是用来干什么的?

答案 : iptables和Firewalld我都知道,并且我已经使用iptables好一段时间了。iptables主要由C语言写成,并且以GNU GPL许可证发布。它是从系统管理员的角度写的,最新的稳定版是iptables 1.4.21。iptables通常被用作类UNIX系统中的防火墙,更准确的说,可以称为iptables/netfilter。管理员通过终端/GUI工具与iptables打交道,来添加和定义防火墙规则到预定义的表中。Netfilter是内核中的一个模块,它执行包过滤的任务。

Firewalld是RHEL/CentOS 7(也许还有其他发行版,但我不太清楚)中最新的过滤规则的实现。它已经取代了iptables接口,并与netfilter相连接。

2. 你用过一些iptables的GUI或命令行工具么?

答案 : 虽然我既用过GUI工具,比如与Webmin结合的Shorewall;以及直接通过终端访问iptables,但我必须承认通过Linux终端直接访问iptables能给予用户更高级的灵活性、以及对其背后工作更好的理解的能力。GUI适合初级管理员,而终端适合有经验的管理员。

3. 那么iptables和firewalld的基本区别是什么呢?

答案 : iptables和firewalld都有着同样的目的(包过滤),但它们使用不同的方式。iptables与firewalld不同,在每次发生更改时都刷新整个规则集。通常iptables配置文件位于‘/etc/sysconfig/iptables‘,而firewalld的配置文件位于‘/etc/firewalld/‘。firewalld的配置文件是一组XML文件。以XML为基础进行配置的firewalld比iptables的配置更加容易,但是两者都可以完成同样的任务。例如,firewalld可以在自己的命令行界面以及基于XML的配置文件下使用iptables。

4. 如果有机会的话,你会在你所有的服务器上用firewalld替换iptables么?

答案 : 我对iptables很熟悉,它也工作的很好。如果没有任何需求需要firewalld的动态特性,那么没有理由把所有的配置都从iptables移动到firewalld。通常情况下,目前为止,我还没有看到iptables造成什么麻烦。IT技术的通用准则也说道“为什么要修一件没有坏的东西呢?”。上面是我自己的想法,但如果组织愿意用firewalld替换iptables的话,我不介意。

5. 你看上去对iptables很有信心,巧的是,我们的服务器也在使用iptables。

iptables使用的表有哪些?请简要的描述iptables使用的表以及它们所支持的链。

答案 : 谢谢您的赞赏。至于您问的问题,iptables使用的表有四个,它们是:

  • Nat 表
  • Mangle 表
  • Filter 表
  • Raw 表

Nat表 : Nat表主要用于网络地址转换。根据表中的每一条规则修改网络包的IP地址。流中的包仅遍历一遍Nat表。例如,如果一个通过某个接口的包被修饰(修改了IP地址),该流中其余的包将不再遍历这个表。通常不建议在这个表中进行过滤,由NAT表支持的链称为PREROUTING 链,POSTROUTING 链和OUTPUT 链。

Mangle表 : 正如它的名字一样,这个表用于校正网络包。它用来对特殊的包进行修改。它能够修改不同包的头部和内容。Mangle表不能用于地址伪装。支持的链包括PREROUTING 链,OUTPUT 链,Forward 链,Input 链和POSTROUTING 链。

Filter表 : Filter表是iptables中使用的默认表,它用来过滤网络包。如果没有定义任何规则,Filter表则被当作默认的表,并且基于它来过滤。支持的链有INPUT 链,OUTPUT 链,FORWARD 链。

Raw表 : Raw表在我们想要配置之前被豁免的包时被使用。它支持PREROUTING 链和OUTPUT 链。

6. 简要谈谈什么是iptables中的目标值(能被指定为目标),他们有什么用

答案 : 下面是在iptables中可以指定为目标的值:

  • ACCEPT : 接受包
  • QUEUE : 将包传递到用户空间 (应用程序和驱动所在的地方)
  • DROP : 丢弃包
  • RETURN : 将控制权交回调用的链并且为当前链中的包停止执行下一调用规则

7. 让我们来谈谈iptables技术方面的东西,我的意思是说实际使用方面

你怎么检测在CentOS中安装iptables时需要的iptables的rpm?

答案 : iptables已经被默认安装在CentOS中,我们不需要单独安装它。但可以这样检测rpm:

# rpm -qa iptables

iptables-1.4.21-13.el7.x86_64

如果您需要安装它,您可以用yum来安装。

# yum install iptables-services

8. 怎样检测并且确保iptables服务正在运行?

答案 : 您可以在终端中运行下面的命令来检测iptables的状态。

# service status iptables           [On CentOS 6/5]
# systemctl status iptables         [On CentOS 7]

如果iptables没有在运行,可以使用下面的语句

---------------- 在CentOS 6/5下 ---------------- 
# chkconfig --level 35 iptables on
# service iptables start

---------------- 在CentOS 7下 ---------------- 
# systemctl enable iptables 
# systemctl start iptables 

我们还可以检测iptables的模块是否被加载:

# lsmod | grep ip_tables

9. 你怎么检查iptables中当前定义的规则呢?

答案 : 当前的规则可以简单的用下面的命令查看:

# iptables -L

示例输出

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

10. 你怎样刷新所有的iptables规则或者特定的链呢?

答案 : 您可以使用下面的命令来刷新一个特定的链。

# iptables --flush OUTPUT

要刷新所有的规则,可以用:

# iptables --flush

11. 请在iptables中添加一条规则,接受所有从一个信任的IP地址(例如,192.168.0.7)过来的包。

答案 : 上面的场景可以通过运行下面的命令来完成。

# iptables -A INPUT -s 192.168.0.7 -j ACCEPT 

我们还可以在源IP中使用标准的斜线和子网掩码:

# iptables -A INPUT -s 192.168.0.7/24 -j ACCEPT 
# iptables -A INPUT -s 192.168.0.7/255.255.255.0 -j ACCEPT

12. 怎样在iptables中添加规则以ACCEPT,REJECT,DENY和DROP ssh的服务?

答案 : 但愿ssh运行在22端口,那也是ssh的默认端口,我们可以在iptables中添加规则来ACCEPT ssh的tcp包(在22号端口上)。

# iptables -A INPUT -p tcp --dport 22 -j ACCEPT 

REJECT ssh服务(22号端口)的tcp包。

# iptables -A INPUT -p tcp --dport 22 -j REJECT

DENY ssh服务(22号端口)的tcp包。

# iptables -A INPUT -p tcp --dport 22 -j DENY

DROP ssh服务(22号端口)的tcp包。

# iptables -A INPUT -p tcp --dport 22 -j DROP

13. 让我给你另一个场景,假如有一台电脑的本地IP地址是192.168.0.6。你需要封锁在21、22、23和80号端口上的连接,你会怎么做?

答案 : 这时,我所需要的就是在iptables中使用‘multiport‘选项,并将要封锁的端口号跟在它后面。上面的场景可以用下面的一条语句搞定:

# iptables -A INPUT -s 192.168.0.6 -p tcp -m multiport --dport 22,23,80,8080 -j DROP

可以用下面的语句查看写入的规则。

# iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited
DROP       tcp  --  192.168.0.6          anywhere             multiport dports ssh,telnet,http,webcache

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

面试官 : 好了,我问的就是这些。你是一个很有价值的雇员,我们不会错过你的。我将会向HR推荐你的名字。如果你有什么问题,请问我。

作为一个候选人我不愿不断的问将来要做的项目的事以及公司里其他的事,这样会打断愉快的对话。更不用说HR轮会不会比较难,总之,我获得了机会。

同时我要感谢Avishek和Ravi(我的朋友)花时间帮我整理我的面试。

朋友!如果您有过类似的面试,并且愿意与数百万Tecmint读者一起分享您的面试经历,请将您的问题和答案发送到[email protected]

谢谢!保持联系。如果我能更好的回答我上面的问题的话,请记得告诉我。


via: http://www.tecmint.com/linux-firewall-iptables-interview-questions-and-answers/

作者:Avishek Kumar 译者:wwy-hust 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

我们为你的面试准备选择了 70 个你可能遇到的 shell 脚本面试问题及解答。了解脚本或至少知道基础知识对系统管理员来说至关重要,它也有助于你在工作环境中自动完成很多任务。在过去的几年里,我们注意到所有的 linux 工作职位都要求脚本技能。

1) 如何向脚本传递参数 ?

./script argument

例子 : 显示文件名称脚本

./show.sh file1.txt

cat show.sh
#!/bin/bash
echo $1

(LCTT 译注:谢谢某匿名访客的提醒,原题有误,修改之。)

2) 如何在脚本中使用参数 ?

第一个参数 : $1,第二个参数 : $2

例子 : 脚本会复制文件(arg1) 到目标地址(arg2)

./copy.sh file1.txt /tmp/

cat copy.sh
#!/bin/bash
cp $1 $2

3) 如何计算传递进来的参数 ?

$#

4) 如何在脚本中获取脚本名称 ?

$0

5) 如何检查之前的命令是否运行成功 ?

$?

6) 如何获取文件的最后一行 ?

tail -1

7) 如何获取文件的第一行 ?

head -1

8) 如何获取一个文件每一行的第三个元素 ?

awk '{print $3}'

9) 假如文件中每行第一个元素是 FIND,如何获取第二个元素

awk '{ if ($1 == "FIND") print $2}'

10) 如何调试 bash 脚本

将 -xv 参数加到 #!/bin/bash 后

例子:

#!/bin/bash –xv

11) 举例如何写一个函数 ?

function example() {
echo "Hello world!"
}

12) 如何向连接两个字符串 ?

V1="Hello"
V2="World"
V3=${V1}${V2}
echo $V3

输出

HelloWorld
据匿名网友评论,本题原答案有误,已经修正。

13) 如何进行两个整数相加 ?

V1=1
V2=2
let V3=$V1+$V2
echo $V3

输出

3

据 @kashu 的意见,本题的更佳回答为:

两个整数相加,还有若干种方法实现:

A=5
B=6

echo $(($A+$B))  # 方法 2
echo $[$A+$B]    # 方法 3
expr $A + $B     # 方法 4
echo $A+$B | bc  # 方法 5
awk 'BEGIN{print '"$A"'+'"$B"'}'   # 方法 6

14) 如何检查文件系统中是否存在某个文件 ?

if [ -f /var/log/messages ]
then
echo "File exists"
fi

15) 写出 shell 脚本中所有循环语法 ?

for 循环 :

for i in $( ls ); do
echo item: $i
done

while 循环 :

#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 10 ]; do
echo The counter is $COUNTER
let COUNTER=COUNTER+1
done

until 循环 :

#!/bin/bash
COUNTER=20
until [ $COUNTER -lt 10 ]; do
echo COUNTER $COUNTER
let COUNTER-=1
done

16) 每个脚本开始的 #!/bin/sh 或 #!/bin/bash 表示什么意思 ?

这一行说明要使用的 shell。#!/bin/bash 表示脚本使用 /bin/bash。对于 python 脚本,就是 #!/usr/bin/python。(LCTT译注:这一行称之为释伴行。)

17) 如何获取文本文件的第 10 行 ?

head -10 file|tail -1

18) bash 脚本文件的第一个符号是什么

#

19) 命令:[ -z "" ] && echo 0 || echo 1 的输出是什么

0

20) 命令 “export” 有什么用 ?

使变量在子 shell 中可用。

21) 如何在后台运行脚本 ?

在脚本后面添加 “&”。

据 @kashu 的意见,更好的答案是:

nohup command &

大部分时间我们可能是远程使用Linux,我碰到过由于网络断线使得在后台运行的command &没了...

22) "chmod 500 script" 做什么 ?

使脚本所有者拥有可执行权限。

23) ">" 做什么 ?

重定向输出流到文件或另一个流。

24) & 和 && 有什么区别

  • & - 希望脚本在后台运行的时候使用它
  • && - 当前一个脚本成功完成才执行后面的命令/脚本的时候使用它

25) 什么时候要在 [ condition ] 之前使用 “if” ?

当条件满足时需要运行多条命令的时候。

26) 命令: name=John && echo 'My name is $name' 的输出是什么

My name is $name

27) bash shell 脚本中哪个符号用于注释 ?

#

28) 命令: echo ${new:-variable} 的输出是什么

variable

29) ' 和 " 引号有什么区别 ?

  • ' - 当我们不希望把变量转换为值的时候使用它。
  • " - 会计算所有变量的值并用值代替。

30) 如何在脚本文件中重定向标准输出和标准错误流到 log.txt 文件 ?

在脚本文件中添加 "exec >log.txt 2>&1" 命令。

31) 如何只用 echo 命令获取字符串变量的一部分 ?

echo ${variable:x:y}
x - 起始位置
y - 长度

例子:

variable="My name is Petras, and I am developer."
echo ${variable:11:6} # 会显示 Petras

32) 如果给定字符串 variable="User:123:321:/home/dir",如何只用 echo 命令获取 home\_dir ?

echo ${variable#*:*:*:}

echo ${variable##*:}

33) 如何从上面的字符串中获取 “User” ?

echo ${variable%:*:*:*}

echo ${variable%%:*}

34) 如何使用 awk 列出 UID 小于 100 的用户 ?

awk -F: '$3<100' /etc/passwd

35) 写程序为用户计算主组数目并显示次数和组名

cat /etc/passwd|cut -d: -f4|sort|uniq -c|while read c g
do
{ echo $c; grep :$g: /etc/group|cut -d: -f1;}|xargs -n 2
done

36) 如何在 bash shell 中更改标准的域分隔符为 ":" ?

IFS=":"

37) 如何获取变量长度 ?

${#variable}

38) 如何打印变量的最后 5 个字符 ?

echo ${variable: -5}

39) ${variable:-10} 和 ${variable: -10} 有什么区别?

  • ${variable:-10} - 如果之前没有给 variable 赋值则输出 10;如果有赋值则输出该变量
  • ${variable: -10} - 输出 variable 的最后 10 个字符

40) 如何只用 echo 命令替换字符串的一部分 ?

echo ${variable//pattern/replacement}

41) 哪个命令将命令替换为大写 ?

tr '[:lower:]' '[:upper:]'

42) 如何计算本地用户数目 ?

wc -l /etc/passwd|cut -d" " -f1 或者 cat /etc/passwd|wc -l

43) 不用 wc 命令如何计算字符串中的单词数目 ?

set ${string}
echo $#

44) "export $variable" 或 "export variable" 哪个正确 ?

export variable

45) 如何列出第二个字母是 a 或 b 的文件 ?

ls -d ?[ab]*

46) 如何将整数 a 加到 b 并赋值给 c ?

c=$((a+b))

c=`expr $a + $b`

c=`echo "$a+$b"|bc`

47) 如何去除字符串中的所有空格 ?

echo $string|tr -d " "

48) 重写这个命令,将输出变量转换为复数: item="car"; echo "I like $item" ?

item="car"; echo "I like ${item}s"

49) 写出输出数字 0 到 100 中 3 的倍数(0 3 6 9 …)的命令 ?

for i in {0..100..3}; do echo $i; done

for (( i=0; i<=100; i=i+3 )); do echo "Welcome $i times"; done

50) 如何打印传递给脚本的所有参数 ?

echo $*

echo $@

51) [ $a == $b ] 和 [ $a -eq $b ] 有什么区别

  • [ $a == $b ] - 用于字符串比较
  • [ $a -eq $b ] - 用于数字比较

52) = 和 == 有什么区别

  • = - 用于为变量赋值
  • == - 用于字符串比较

53) 写出测试 $a 是否大于 12 的命令 ?

[ $a -gt 12 ]

54) 写出测试 $b 是否小于等于 12 的命令 ?

[ $b -le 12 ]

55) 如何检查字符串是否以字母 "abc" 开头 ?

[[ $string == abc* ]]

56) [[ $string == abc\* ]] 和 [[ $string == "abc*" ]] 有什么区别

  • [[ $string == abc* ]] - 检查字符串是否以字母 abc 开头
  • [[ $string == "abc*" ]] - 检查字符串是否完全等于 abc*

57) 如何列出以 ab 或 xy 开头的用户名 ?

egrep "^ab|^xy" /etc/passwd|cut -d: -f1

58) bash 中 $! 表示什么意思 ?

后台最近执行命令的 PID.

59) $? 表示什么意思 ?

前台最近命令的结束状态。

60) 如何输出当前 shell 的 PID ?

echo $$

61) 如何获取传递给脚本的参数数目 ?

echo $#

(LCTT 译注:和第3题重复了。)

62) $\* 和 $@ 有什么区别

  • $* - 以一个字符串形式输出所有传递到脚本的参数
  • $@ - 以 $IFS 为分隔符列出所有传递到脚本中的参数

63) 如何在 bash 中定义数组 ?

array=("Hi" "my" "name" "is")

64) 如何打印数组的第一个元素 ?

echo ${array[0]}

65) 如何打印数组的所有元素 ?

echo ${array[@]}

66) 如何输出所有数组索引 ?

echo ${!array[@]}

67) 如何移除数组中索引为 2 的元素 ?

unset array[2]

68) 如何在数组中添加 id 为 333 的元素 ?

array[333]="New_element"

69) shell 脚本如何获取输入的值 ?

a) 通过参数

./script param1 param2

b) 通过 read 命令

read -p "Destination backup Server : " desthost

70) 在脚本中如何使用 "expect" ?

/usr/bin/expect << EOD
spawn rsync -ar ${line} ${desthost}:${destpath}
expect "*?assword:*"
send "${password}\r"
expect eof
EOD

祝你好运 !! 如果你有任何疑问或者问题需要解答都可以在下面的评论框中写下来。让我们知道这对你的面试有所帮助:-)


via: http://linoxide.com/linux-shell-script/shell-scripting-interview-questions-answers/

作者:Petras Liumparas 译者:ictlyh 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

这是关于文件列表命令的第二篇文章,继续探讨‘ls’命令的其他方面。该系列的第一篇文章受到了社区的高度关注,如果你错过了该系列的第一部分,可以访问以下地址:

这篇文章通过样例来很好地展现‘ls’命令的深入应用,我们加倍小心地来写这篇文章来保持其简洁可理解性,同时又能提供最全面的服务。

10 Interview Questions on ls Command

10 ‘ls’ 命令面试的问题

16. 假如你想要以长列表的形式列出目录中的内容,但是不打印文件创建者名称以及文件所属组。看看输出有何不同之处。

a. ls 命令在与‘-l’选项一起使用时会将文件以长列表格式输出。

# ls -l

List Files in- Long List Format

以长格式列出文件

b. ls 命令在与‘-l’和‘--author’一起使用时,会将文件以长列表格式输出并带有文件创建者的名称信息。

# ls -l --author

List Files By Author

列出文件的创建者

c. ls 命令在与‘-g’选项 一起将会列出文件名但是不带属主名称。

# ls -g

List Files Without Printing Owner Name

列出文件但不列出属主

d. ls 命令在与'-G'和‘-l’选项一起将会使用长列表格式列出文件名称但是不带文件所属组名称。

# ls -Gl

List Files Without Printing Group

列出文件但是不列出所属组

17. 使用易读格式打印出当前目录中的文件以及文件夹的大小,你会如何做?

这里我们需要使用'-h'选项(人类可阅读的、易读的)同‘-l’或‘-s’选项与ls命令一起使用来得到想要的输出。

# ls -hl

List Files in Human Readable Format

以易读格式的长列表列出文件

# ls -hs

List File Sizes in Long List Format

以易读格式的短列表列出文件

注意: ‘-h’选项使用1024(计算机中的标准)的幂,文件或文件夹的大小分别以K,M和G作为输出单位。

18. 既然‘-h’选项是使用1024的幂作为标准来输出大小,那么ls命令是否还支持其他的幂值呢?

存在一个选项 ‘--si’与选项‘-h’相似,不同之处在于前者以使用1000的幂,后者使用1024的幂。

# ls --si

所以'--si'也可以与‘-l’选项一起使用来按照1000的幂来输出文件夹的大小,并且以长列表格式显示。

# ls --si -l

(LCTT 译注:此处原文参数有误,附图也不对,因此删除之。--si 参数是双连线参数,而且有的版本的 ls 并不支持该参数)

19. 假如要你使用逗号‘,’作为分隔符来打印一个目录中的内容,可以吗? 对于长列表形式也可行吗?

当然!linux的ls命令当与其选项‘-m’一起使用时可以在打印目录内容时以逗号‘,’分割。由于逗号分割的内容是水平填充的,ls命令不能在垂直列出内容时使用逗号来分割内容。

# ls -m

Print Contents of Directory by Comma

以逗号分隔显示内容

当使用长列表格式时,‘-m’选项就没有什么效果了。

# ls -ml

Listing Content Horizontally

长列表不能使用逗号分隔列表

20. 有办法将目录的内容逆序打印出来吗?

可以!上面的情形可以轻松地通过'-r'选项搞定,该选项将输出顺序倒置。这个选项也可以与‘-l’选项一起使用。

# ls -r

List Content in Reverse Order

逆序列出

# ls -rl

Long List Content in Reverse Order

逆序长列表

21. 如果你被分配一个任务,来递归地打印各个子目录,你会如何应付?注意,只针对子目录而不是文件哦。

小意思!使用“-R”选项就可以轻轻松松拿下,它也可以更进一步地与其他选项如‘-l’和‘-m’选项等组合使用。

# ls -R

Print Sub Directories in Recursively

递归列出子目录

22. 如何按照文件大小对其进行排序?

linux命令行选项'-S'赋予了ls命令这个超能力。按照文件大小从大到小的顺序排序:

# ls -S

Sort Files with ls Command 按文件大小排序

按照文件大小从小到大的顺序排序。

# ls -Sr

Sort Files in Descending Order

从小到大的排序

23. 按照一行一个文件列出目录中的内容,并且不带额外信息的方式

选项‘-1’在此可以解决这个问题,使用‘-1’选项来使用ls命令可以将目录中的内容按照一行一个文件并且不带额外信息的方式进行输出。

# ls -1

List Files Without Information

不带其他信息,一行一个列出文件

24. 现在委派给你一个任务,你必须将目录中的内容输出到终端而且需要使用双引号引起来,你会如何做?

有一个选项‘-Q’会将ls命令的输出内容用双引号引起来。

# ls -Q

Print Files with Double Quotes

输出的文件名用引号引起来

25. 想象一下你正在与一个包含有很多文件和文件夹的目录打交道,你需要使目录名显示在文件名之前,你如何做?

# ls --group-directories-first

Print Directories First

目录优先显示

先点到为止,我们会马上提供该系列文章的下一部分。别换频道,关注我们。 另外别忘了在下面的评论中提出你们宝贵的反馈信息,喜欢就分享,帮助我们得到更好的传播吧!


via: http://www.tecmint.com/ls-interview-questions/

作者:Ravi Saive 译者:theo-l 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

Unix或类Unix系统中的“文件列表”命令“ls”是最基础并且使用的最广泛的命令行中工具之一。它是一个POSIX兼容工具,在GNU基本工具集以及BSD各种变体上都可以使用。“ls”命令可以结合大量的选项来达到想要的结果。

这篇文章的目的在于通过相关的样例来深入讨论文件列表命令。

15 ls Command Questions

15个“ls”命令问题。

1. 如何列出目录中的文件?

答:linux文件列表命令“ls”就是干这个的。

# ls

List Files

列出文件

同时,我们也可以使用“echo(回显)”命令与一个通配符(*)参数来雷锤目录中的所有文件。

# echo *

List All Files

列出所有的文件。

2. 如何只使用echo命令来只列出所有目录?

# echo */

List All Directories

列出所有的目录

3. 怎样列出一个目录中的所有文件, 包括隐藏的以“.”开头的文件?

答:我们需要将“-a”选项与“ls”命令一起使用。

# ls -a

List All Hidden Files

列出所有的隐藏文件。

4. 如何列出目录中除了 “当前目录 .”和“父目录 ..”之外的所有文件,包括隐藏文件?

答: 我们需要将“-A”选项与“ls”命令一起使用

# ls -A

Do Not List Implied

别列出指代当前目录和父目录的文件

5. 如何使用长格式打印出当前目录内容?

答: 我们需要将“-l”选项与“ls”命令一起使用。

# ls -l

List Files Long

列出文件的长格式。

上面的样例中,其输出结果看起来向下面这样。

drwxr-xr-x  5 avi tecmint      4096 Sep 30 11:31 Binary

上面的drwxr-xr-x 是文件的权限,分别代表了文件所有者,所属组以及“整个世界”。 所有者具有读(r),写(w)以及执行(x)等权限。 该文件所属组具有读(r)和执行(x)但是没有写的权限,整个世界的其他可以访问到该文件的人也具有相同权限。

  • 开头的‘d’意味着这是一个目录
  • 数字'5'表示链接数为5
  • 文件 Binary归属于用户 “avi”以及用户组 "tecmint"
  • Sep 30 11:31 表示文件最后一次的访问日期与时间。

6. 假如让你来将目录中的内容以长格式列表打印,并且显示出隐藏的“点文件”,你会如何实现?

答: 我们需要同时将"-a"和"-l"选项与“ls”命令一起使用(LCTT 译注:单字符选项可以合并写)。

# ls -la

Print Content of Directory

打印目录内容

此外,如果我们不想列出“当前目录”和"父目录",可以将“-A”和“-l”选项同“ls”命令一起使用。

# ls -lA

7. 如何找到每个文件的创建者?

答: 我们需要结合 “--author”和 "-l"选项来打印出每个文件的创建者。

# ls --author -l

List Author Files

列出文件创建者。

8. 如何对用转义字符打印出非显示字符?

答:我们只需要使用“-b”选项来对非显示字符进行转义打印

# ls -b

Print Escape Character

9. 用指定特定的单位格式来列出文件和目录的大小,你会如何实现?

答: 在此可以同时使用选项“-block-size=scale”和“-l”,但是我们需要用特定的单位如M,K等来替换‘scale’参数。

# ls --block-size=M -l
# ls --block-size=K -l

List File Scale Format

列出文件大小单位格式。

10. 列出目录中的文件,但是不显示备份文件,即那些文件名以‘~’结尾的文件

答: 选项‘-B’赶来救驾。

# ls -B

List File Without Backup

列出非备份文件

11. 将目录中的所有文件按照名称进行排序,并显示其最后修改时间信息?

答: 为了实现这个需求,我们需要同时将“-c”和"-l"选项与命令一起使用。

# ls -cl

Sort Files

文件排序

12. 将目录中的文件按照修改时间进行排序,并显示相关联的信息。

答: 我们需要同时使用3个选项:'-l','-t','-c' 来对文件使用修改时间排序,最新的修改时间排在最前。

# ls -ltc

Sort Files by Modification

按照修改时间对文件排序。

13. 如何控制‘ls’命令的输出颜色的有无?

答: 需要使用选项‘--color=parameter’,参数具有三种不同值,“auto(自动)”,“always(一直)”,“never(无色)”。

# ls --color=never
# ls --color=auto
# ls --color=always

ls Colorful Output

ls的输出颜色

14. 假如只需要列出目录本身,而不是目录的内容,你会如何做?

答:在此“-d”选项就会显得很顺手。

# ls -d

List Directory Entries

列出目录本身

15. 为长格式列表命令"ls -l"创建一个别名“ll”,并将其结果输出到一个文件而不是标准输出中。

答:在上述的这个场景中,我们需要将别名添加到.bashrc文件中,然后使用重定向操作符将输出写入到文件而不是标准输出中。我们将会使用编辑器nano。

# ls -a
# nano .bashrc
# ll >> ll.txt
# nano ll.txt

Create Alias for ls command

为ls命令创建别名。

先到此为止,别忘了在下面的评论中提出你们的宝贵意见,我会再次带着另外的有趣的文章在此闪亮登场。

参考阅读:


via: http://www.tecmint.com/ls-command-interview-questions/

作者:Avishek Kumar 译者:theo-l 校对:校对者ID

本文由 LCTT 原创翻译,Linux中国 荣誉推出