Shusain 发布的文章

之前的教程中,我们已经学习了在机器上安装 git。本教程,我们将讨论如何使用 git,比如与 git 一起使用的各种命令。所以我们开始吧。

设置用户信息

这应该是安装完 git 的第一步。我们将添加用户信息 (用户名和邮箱),所以当我们提交代码时,会产生带有用户信息的提交信息,这使得跟踪提交过程变得更容易。要添加用户信息,命令是 git config

$ git config --global user.name "Daniel"
$ git config --global user.email "[email protected]"

添加完用户信息之后,通过运行下面命令,我们将检查这些信息是否成功更新。

$ git config --list

我们应该能够看到输出的用户信息。

GIT 命令

新建一个仓库

为了建立一个新仓库,运行如下命令:

$ git init

查找一个仓库

为了查找一个仓库,命令如下:

$ git grep "repository"

与远程仓库连接

为了与远程仓库连接,运行如下命令:

$ git remote add origin remote_server

然后检查所有配置的远程服务器,运行如下命令:

$ git remote -v

克隆一个仓库

为了从本地服务器克隆一个仓库,运行如下代码:

$ git clone repository_path

如果我们想克隆远程服务器上的一个仓库,那克隆这个仓库的命令是:

$ git clone repository_path

在仓库中列出分支

为了检查所有可用的和当前工作的分支列表,执行:

$ git branch

创建新分支

创建并使用一个新分支,命令是:

$ git checkout -b 'branchname'

删除一个分支

为了删除一个分支,执行:

$ git branch -d 'branchname'

为了删除远程仓库的一个分支,执行:

$ git push origin:'branchname'

切换到另一个分支

从当前分支切换到另一个分支,使用

$ git checkout 'branchname'

添加文件

添加文件到仓库,执行:

$ git add filename

文件状态

检查文件状态 (那些将要提交或者添加的文件),执行:

$ git status

提交变更

在我们添加一个文件或者对一个文件作出变更之后,我们通过运行下面命令来提交代码:

$ git commit -a

提交变更到 head 但不提交到远程仓库,命令是:

$ git commit -m "message"

推送变更

推送对该仓库 master 分支所做的变更,运行:

$ git push origin master

推送分支到仓库

推送对单一分支做出的变更到远程仓库,运行:

$ git push origin 'branchname'

推送所有分支到远程仓库,运行:

$ git push -all origin

合并两个分支

合并另一个分支到当前活动分支,使用命令:

$ git merge 'branchname'

从远端服务器合并到本地服务器

从远端服务器下载/拉取变更到到本地服务器的工作目录,运行:

$ git pull 

检查合并冲突

查看对库文件的合并冲突,运行:

$ git diff -base 'filename'

查看所有冲突,运行:

$ git diff

如果我们在合并之前想预览所有变更,运行:

$ git diff 'source-branch' 'target-branch' 

创建标记

创建标记来标志任一重要的变更,运行:

$ git tag 'tag number' 'commit id' 

通过运行以下命令,我们可以查找 commit id :

$ git log

推送标记

推送所有创建的标记到远端服务器,运行:

$ git push -tags origin

恢复做出的变更

如果我们想用 head 中最后一次变更来替换对当前工作树的变更,运行:

$ git checkout -'filename'

我们也可以从远端服务器获取最新的历史,并且将它指向本地仓库的 master 分支,而不是丢弃掉所有本地所做所有变更。为了这么做,运行:

$ git fetch origin
$ git reset -hard master

好了,伙计们。这些就是我们使用 git 服务器的命令。我们将会很快为大家带来更有趣的教程。如果你希望我们对某个特定话题写一个教程,请通过下面的评论箱告诉我们。像往常一样, 欢迎您的各种意见和建议。


via: http://linuxtechlab.com/beginners-to-pro-guide-for-git-commands/

作者:Shusain 译者:liuxinyu123 校对:wxy

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

正则表达式 Regular expressions (简写为 regex 或者 regexp)基本上是定义一种搜索模式的字符串,可以被用来执行“搜索”或者“搜索并替换”操作,也可以被用来验证像密码策略等条件。

正则表达式是一个我们可利用的非常强大的工具,并且使用正则表达式的优点是它能在几乎所有计算机语言中被使用。所以如果你使用 Bash 脚本或者创建一个 python 程序时,我们可以使用正则表达式,或者也可以写一个单行搜索查询。

在这篇教程中,我们将会学习一些正则表达式的基本概念,并且学习如何在 Bash 中通过 grep 使用它们,但是如果你希望在其他语言如 python 或者 C 中使用它们,你只能使用正则表达式部分。那么让我们通过正则表达式的一个例子开始吧,

正则表达式看起来像 /t[aeiou]l/ 这个样子。

但这是什么意思呢?它意味着所提到的正则表达式将寻找一个词,它以 t 开始,在中间包含字母 a e i o u 中任意一个,并且字母 l 最为最后一个字符。它可以是 teltal 或者 til,可以匹配一个单独的词或者其它单词像 tiltbrutal 或者 telephone 的一部分。

grep 使用正则表达式的语法是 $ grep "regex_search_term" file_location

如果不理解,不要担心,这只是一个例子,来展示可以利用正则表达式获取什么,相信我,这是最简单的例子。我们可以从正则表达式中获取更多。现在我们将从正则表达式基础的开始。

基础的正则表示式

现在我们开始学习一些被称为 元字符 MetaCharacters 的特殊字符。它们可以帮助我们创建更复杂的正则表达式搜索项。下面提到的是基本元字符的列表,

  • . 点将匹配任意字符
  • [ ] 将匹配一个字符范围
  • [^ ] 将匹配除了括号中提到的那个之外的所有字符
  • * 将匹配零个或多个前面的项
  • + 将匹配一个或多个前面的项
  • ? 将匹配零个或一个前面的项
  • {n} 将匹配 n 次前面的项
  • {n,} 将匹配 n 次或更多前面的项
  • {n,m} 将匹配在 n 和 m 次之间的项
  • {,m} 将匹配少于或等于 m 次的项
  • \ 是一个转义字符,当我们需要在我们的搜索中包含一个元字符时使用

现在我们将用例子讨论所有这些元字符。

. (点)

它用于匹配出现在我们搜索项中的任意字符。举个例子,我们可以使用点如:

$ grep "d.g" file1

这个正则表达式意味着我们在名为 ‘file1’ 的文件中查找的词以 d 开始,以 g结尾,中间可以有 1 个字符的字符串。同样,我们可以使用任意数量的点作为我们的搜索模式,如 T......h,这个查询项将查找一个词,以 T 开始,以 h 结尾,并且中间可以有任意 6 个字符。

[ ]

方括号用于定义字符范围。例如,我们需要搜索一些特别的单词而不是匹配任何字符,

$ grep "N[oen]n" file2

这里,我们正寻找一个单词,以 N开头,以 n 结尾,并且中间只能有 oe 或者 n 中的一个。 在方括号中我们可以提到单个到任意数量的字符。

我们在方括号中也可以定义像 a-e或者 1-18 作为匹配字符的列表。

[^ ]

这就像正则表达式的 not 操作。当使用 [^ ] 时,它意味着我们的搜索将包括除了方括号内提到的所有字符。例如,

$ grep "St[^1-9]d" file3

这意味着我们可以拥有所有这样的单词,它们以 St 开始,以字母 d 结尾,并且不得包含从 19 的任何数字。

到现在为止,我们只使用了仅需要在中间查找单个字符的正则表达式的例子,但是如果我们需要更多字符该怎么办呢。假设我们需要找到以一个字符开头和结尾的所有单词,并且在中间可以有任意数量的字符。这就是我们使用乘数元字符如 + *? 的地方。

{n}{n,m}{n,} 或者 {,m} 也是可以在我们的正则表达式项中使用的其他乘数元字符。

* (星号)

以下示例匹配字母 k 的任意出现次数,包括一次没有:

$ grep "lak*" file4

它意味着我们可以匹配到 lakela 或者 lakkkk

+

以下模式要求字符串中的字母 k 至少被匹配到一次:

$ grep "lak+" file5

这里 k 在我们的搜索中至少需要发生一次,所以我们的结果可以为 lake 或者 lakkkk,但不能是 la

?

在以下模式匹配中

$ grep "ba?b" file6

匹配字符串 bbbab,使用 ? 乘数,我们可以有一个或零个字符的出现。

非常重要的提示

当使用乘数时这是非常重要的,假设我们有一个正则表达式

$ grep "S.*l" file7

我们得到的结果是 smallsilly,并且我们也得到了 Shane is a little to play ball。但是为什么我们得到了 Shane is a little to play ball?我们只是在搜索中寻找单词,为什么我们得到了整个句子作为我们的输出。

这是因为它满足我们的搜索标准,它以字母 s 开头,中间有任意数量的字符并以字母 l 结尾。那么,我们可以做些什么来纠正我们的正则表达式来只是得到单词而不是整个句子作为我们的输出。

我们在正则表达式中需要增加 ? 元字符,

$ grep "S.*?l" file7

这将会纠正我们正则表达式的行为。

\

\ 是当我们需要包含一个元字符或者对正则表达式有特殊含义的字符的时候来使用。例如,我们需要找到所有以点结尾的单词,所以我们可以使用:

$ grep "S.*\\." file8

这将会查找和匹配所有以一个点字符结尾的词。

通过这篇基本正则表达式教程,我们现在有一些关于正则表达式如何工作的基本概念。在我们的下一篇教程中,我们将学习一些高级的正则表达式的概念。同时尽可能多地练习,创建正则表达式并试着尽可能多的在你的工作中加入它们。如果有任何疑问或问题,您可以在下面的评论区留言。


via: http://linuxtechlab.com/bash-scripting-learn-use-regex-basics/

作者:SHUSAIN 译者:kimii 校对:wxy

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

在本文中,我们将学习通过使用 NAT 技术将安装有 RHEL/CentOS 6 & 7 的机器转变成路由器来用。 我们都知道,路由器是一个工作在第三层的网络设备,用于将两个或多个网络连接在一起,即,将局域网连接上广域网上或者局域网直接互联。 路由器非常昂贵,尤其对于小型组织来说更是如此,这可能是我们关注路由器的一个原因。 与其使用专用硬件,不如让我们用 Linux 机器转换成路由器来用。

RHEL/CentOS 6 和 7 上的操作过程我们都会讲。但在开始之前, 让我们先看看需要准备那些东西。

前期条件

1、 一台装有 RHEL/CentOS 6 或 7 的机器

2、两块分别配有本地 IP 和外网 IP 的网卡

我们需要为两个网卡都分配 IP 地址,一个本地网络的 IP(由我们的网络管理员提供),另一个是互联网 IP(由 ISP 提供)。 像这样:

Ifcfg-en0s3 192.168.1.1 (LAN IP address)
Ifcfg-en0s5 10.1.1.1  (WAN IP address)

注意 不同 Linux 发行版的网卡名是不一样的。

现在准备工作完成了,可以进行配置了。

步骤 1 启用 IP 转发

第一步,我们启用 IP 转发。 这一步在 RHEL/CentOS 6 和 7 上是相同的。 运行

$ sysctl -w net.ipv4.ip_forward=1

但是这样会在系统重启后恢复。要让重启后依然生效需要打开

$ vi /etc/sysctl.conf

然后输入下面内容,

net.ipv4.ip_forward = 1

保存并退出。现在系统就启用 IP 转发了。

步骤 2 配置 IPtables/Firewalld 的规则

下一步我们需要启动 IPtables/firewalld 服务并配置 NAT 规则,

$ systemctl start firewalld (For Centos/RHEL 7)
$ service iptables start  (For Centos/RHEL 6)

然后运行下面命令来配置防火墙的 NAT 规则:

CentOS/RHEL 6
$ iptables -t nat -A POSTROUTING -o XXXX -j MASQUERADE
$ service iptables restart 
CentOS/RHEL 7
$ firewall-cmd  -permanent -direct -passthrough ipv4 -t nat -I POSTROUTING -o XXXX -j MASQUERADE -s 192.168.1.0/24
$ systemctl restart firewalld

这里,XXXX 是配置有外网 IP 的那个网卡名称。 这就将 Linux 机器配置成了路由器了, 下面我们就可以配置客户端然后测试路由器了。

步骤 3 配置客户端

要测试路由器,我们需要在客户端的网关设置成内网 IP, 本例中就是 192.168.1.1。 因此不管客户机是 Windows 还是 Linux, 请先确保网关是 192.168.1.1。 完成后, 打开终端或命令行并 ping 一个网站来测试客户端是否能访问互联网了:

$ ping google.com

我们也可以通过网络浏览器访问网站的方式来检查。


via: http://linuxtechlab.com/turning-centosrhel-6-7-machine-router/

作者:Shusain 译者:lujun9972 校对:wxy

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

Vagrant 是一个用来创建和管理虚拟机环境的工具,常用于建设开发环境。 它在 Docker、VirtualBox、Hyper-V、Vmware、AWS 等技术的基础上构建了一个易于使用且易于复制、重建的环境。

Vagrant Boxes 简化了软件配置部分的工作,并且完全解决了软件开发项目中经常遇到的“它能在我机器上工作”的问题,从而提高开发效率。

在本文中,我们会在 Linux 机器上学习使用 VirtualBox 来配置 Vagrant Boxes。

前置条件

Vagrant 是基于虚拟化环境运行的,这里我们使用 VirtualBox 来提供虚拟化环境。 关于如何安装 VirutalBox 我们在“在 Linux 上安装 VirtualBox” 中有详细描述,请阅读该文并安装 VirtualBox。

安装好 VirtualBox 后,下一步就是配置 Vagrant 了。

安装

VirtualBox 准备好后,我们来安装最新的 vagrant 包。 在写本文的时刻, Vagrant 的最新版本为 2.0.0。 使用下面命令下载最新的 rpm 文件:

$ wget https://releases.hashicorp.com/vagrant/2.0.0/vagrant_2.0.0_x86_64.rpm

然后安装这个包:

$ sudo yum install vagrant_2.0.0_x86_64.rpm

如果是 Ubuntu,用下面这个命令来下载最新的 vagrant 包:

$ wget https://releases.hashicorp.com/vagrant/2.0.0/vagrant_2.0.0_x86_64.deb

然后安装它,

$ sudo dpkg -i vagrant_2.0.0_x86_64.deb

安装结束后,就该进入配置环节了。

配置

首先,我们需要创建一个目录给 vagrant 来安装我们需要的操作系统,

$ mkdir /home/dan
$ cd /home/dan/vagrant

注意: 推荐在你的用户主目录下创建 vagrant,否则你可能会遇到本地用户相关的权限问题。

现在执行下面命令来安装操作系统,比如 CentOS:

$ sudo vagrant init centos/7

如果要安装 Ubuntu 则运行:

$ sudo vagrant init ubuntu/trusty64

vagrant boxes

这还会在存放 vagrant OS 的目录中创建一个叫做 Vagrantfile 的配置文件。它包含了一些关于操作系统、私有 IP 网络、转发端口、主机名等信息。 若我们需要创建一个新的操作系统, 也可以编辑这个问题。

一旦我们用 vagrant 创建/修改了操作系统,我们可以用下面命令启动它:

$ sudo vagrant up

这可能要花一些时间,因为这条命令要构建操作系统,它需要从网络上下载所需的文件。 因此根据互联网的速度, 这个过程可能会比较耗时。

vagrant boxes

这个过程完成后,你就可以使用下面这些命令来管理 vagrant 实例了。

启动 vagrant 服务器:

$ sudo vagrant up

关闭服务器:

$ sudo vagrant halt

完全删除服务器:

$ sudo vagrant destroy

使用 ssh 访问服务器:

$ sudo vagrant ssh

我们可以从 Vagrant Box 的启动过程中得到 ssh 的详细信息(参见上面的截屏)。

如果想看创建的 vagrant OS,可以打开 VirtualBox,然后你就能在 VirtualBox 创建的虚拟机中找到它了。 如果在 VirtualBox 中没有找到, 使用 sudo 权限打开 virtualbox, 然后应该就能看到了。

vagrant boxes

注意:Vagrant 官方网站上可以下载预先配置好的 Vagrant OS。

这就是本文的内容了。如有疑问请在下方留言,我们会尽快回复。


via: http://linuxtechlab.com/creating-vagrant-virtual-boxes-virtualbox/

作者:Shusain 译者:lujun9972 校对:wxy

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

为了保护数据不被泄漏,我们使用软件和硬件防火墙来限制外部未经授权的访问,但是数据泄露也可能发生在内部。 为了消除这种可能性,机构会限制和监测访问互联网,同时禁用 USB 存储设备。

在本教程中,我们将讨论三种不同的方法来禁用 Linux 机器上的 USB 存储设备。所有这三种方法都在 CentOS 6&7 机器上通过测试。那么让我们一一讨论这三种方法。

(另请阅读: Ultimate guide to securing SSH sessions

方法 1 – 伪安装

在本方法中,我们往配置文件中添加一行 install usb-storage /bin/true, 这会让安装 usb-storage 模块的操作实际上变成运行 /bin/true, 这也是为什么这种方法叫做伪安装的原因。 具体来说就是,在文件夹 /etc/modprobe.d 中创建并打开一个名为 block_usb.conf (也可能叫其他名字) ,

$ sudo vim /etc/modprobe.d/block_usb.conf

然后将下行内容添加进去:

install usb-storage /bin/true

最后保存文件并退出。

方法 2 – 删除 USB 驱动

这种方法要求我们将 USB 存储的驱动程序(usb_storage.ko)删掉或者移走,从而达到无法再访问 USB 存储设备的目的。 执行下面命令可以将驱动从它默认的位置移走:

$ sudo mv /lib/modules/$(uname -r)/kernel/drivers/usb/storage/usb-storage.ko /home/user1

现在在默认的位置上无法再找到驱动程序了,因此当 USB 存储器连接到系统上时也就无法加载到驱动程序了,从而导致磁盘不可用。 但是这个方法有一个小问题,那就是当系统内核更新的时候,usb-storage 模块会再次出现在它的默认位置。

方法 3 - 将 USB 存储器纳入黑名单

我们也可以通过 /etc/modprobe.d/blacklist.conf 文件将 usb-storage 纳入黑名单。这个文件在 RHEL/CentOS 6 是现成就有的,但在 7 上可能需要自己创建。 要将 USB 存储列入黑名单,请使用 vim 打开/创建上述文件:

$ sudo vim /etc/modprobe.d/blacklist.conf

并输入以下行将 USB 纳入黑名单:

blacklist usb-storage

保存文件并退出。usb-storage 就在就会被系统阻止加载,但这种方法有一个很大的缺点,即任何特权用户都可以通过执行以下命令来加载 usb-storage 模块,

$ sudo modprobe usb-storage

这个问题使得这个方法不是那么理想,但是对于非特权用户来说,这个方法效果很好。

在更改完成后重新启动系统,以使更改生效。请尝试用这些方法来禁用 USB 存储,如果您遇到任何问题或有什么疑问,请告知我们。


via: http://linuxtechlab.com/disable-usb-storage-linux/

作者:Shusain 译者:lujun9972 校对:wxy

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

netstat 是一个告诉我们系统中所有 tcp/udp/unix socket 连接状态的命令行工具。它会列出所有已经连接或者等待连接状态的连接。 该工具在识别某个应用监听哪个端口时特别有用,我们也能用它来判断某个应用是否正常的在监听某个端口。

netstat 命令还能显示其它各种各样的网络相关信息,例如路由表, 网卡统计信息, 虚假连接以及多播成员等。

本文中,我们会通过几个例子来学习 netstat。

(推荐阅读: 通过示例学习使用 CURL 命令 )

1 - 检查所有的连接

使用 a 选项可以列出系统中的所有连接,

$ netstat -a

这会显示系统所有的 tcp、udp 以及 unix 连接。

2 - 检查所有的 tcp/udp/unix socket 连接

使用 t 选项只列出 tcp 连接,

$ netstat -at

类似的,使用 u 选项只列出 udp 连接,

$ netstat -au

使用 x 选项只列出 Unix socket 连接,

$ netstat -ax

3 - 同时列出进程 ID/进程名称

使用 p 选项可以在列出连接的同时也显示 PID 或者进程名称,而且它还能与其他选项连用,

$ netstat -ap

4 - 列出端口号而不是服务名

使用 n 选项可以加快输出,它不会执行任何反向查询(LCTT 译注:这里原文有误),而是直接输出数字。 由于无需查询,因此结果输出会快很多。

$ netstat -an

5 - 只输出监听端口

使用 l 选项只输出监听端口。它不能与 a 选项连用,因为 a 会输出所有端口,

$ netstat -l

6 - 输出网络状态

使用 s 选项输出每个协议的统计信息,包括接收/发送的包数量,

$ netstat -s

7 - 输出网卡状态

使用 I 选项只显示网卡的统计信息,

$ netstat -i

8 - 显示 多播组 multicast group 信息

使用 g 选项输出 IPV4 以及 IPV6 的多播组信息,

$ netstat -g

9 - 显示网络路由信息

使用 r 输出网络路由信息,

$ netstat -r

10 - 持续输出

使用 c 选项持续输出结果

$ netstat -c

11 - 过滤出某个端口

grep 连用来过滤出某个端口的连接,

$ netstat -anp | grep 3306

12 - 统计连接个数

通过与 wcgrep 命令连用,可以统计指定端口的连接数量

$ netstat -anp | grep 3306 | wc -l

这会输出 mysql 服务端口(即 3306)的连接数。

这就是我们简短的案例指南了,希望它带给你的信息量足够。 有任何疑问欢迎提出。


via: http://linuxtechlab.com/learn-use-netstat-with-examples/

作者:Shusain 译者:lujun9972 校对:wxy

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