Pradeep Kumar 发布的文章

函数是一段可复用的代码。我们通常把重复的代码放进函数中并且在不同的地方去调用它。库是函数的集合。我们可以在库中定义经常使用的函数,这样其它脚本便可以不再重复代码而使用这些函数。

本文我们将讨论诸多关于函数的内容和一些使用技巧。为了方便演示,我将在 Ubuntu 系统上使用 Bourne Again SHell (Bash)

调用函数

在 Shell 中调用函数和调用其它命令是一模一样的。例如,如果你的函数名称为 my_func,你可以在命令行中像下面这样执行它:

$ my_func

如果你的函数接收多个参数,那么可以像下面这样写(类似命令行参数的使用):

$ my_func arg1 arg2 arg3

定义函数

我们可以用下面的语法去定义一个函数:

function function_name {
    Body of function
}

函数的主体可以包含任何有效的命令、循环语句和其它函数或脚本。现在让我们创建一个简单的函数,它向屏幕上显示一些消息(注:直接在命令行里写)。

function print_msg {
    echo "Hello, World"
}

现在,让我们执行这个函数:

$ print_msg
Hello, World

不出所料,这个函数在屏幕上显示了一些消息。

在上面的例子中,我们直接在终端里创建了一个函数。这个函数也可以保存到文件中。如下面的例子所示。

#!/bin/bash
function print_msg {
    echo "Hello, World"
}
print_msg

我们已经在 function.sh 文件中定义了这个函数。现在让我们执行这个脚本:

$ chmod +x function.sh
$ ./function.sh
Hello, World

你可以看到,上面的输出和之前的是一模一样的。

更多函数用法

在上一小节中我们定义了一个非常简单的函数。然而在软件开发的过程中,我们需要更多高级的函数,它可以接收多个参数并且带有返回值。在这一小节中,我们将讨论这种函数。

向函数传递参数

我们可以像调用其它命令那样给函数提供参数。我们可以在函数里使用美元 $ 符号访问到这些参数。例如,$1 表示第一个参数,$2 代表第二个参数,以此类推。

让我们修改下之前的函数,让它以参数的形式接收信息。修改后的函数就像这样:

function print_msg {
    echo "Hello $1"
}

在上面的函数中我们使用 $1 符号访问第一个参数。让我们执行这个函数:

$ print_msg "LinuxTechi"

执行完后,生成如下信息:

Hello LinuxTechi

从函数中返回数值

跟其它编程语言一样,Bash 提供了返回语句让我们可以向调用者返回一些数值。让我们举例说明:

function func_return_value {
    return 10
}

上面的函数向调用者返回 10。让我们执行这个函数:

$ func_return_value
$ echo "Value returned by function is: $?"

当你执行完,将会产生如下的输出结果:

Value returned by function is: 10

提示:在 Bash 中使用 $? 去获取函数的返回值。

函数技巧

目前我们已经对 Bash 中的函数有了一些了解。现在让我们创建一些非常有用的 Bash 函数,它们可以让我们的生活变得更加轻松。

Logger

让我们创建一个 logger 函数,它可以输出带有日期和时间的 log 信息。

function log_msg {
    echo "[`date '+ %F %T'` ]: $@"
}

执行这个函数:

$ log_msg "This is sample log message"

执行完,就会生成如下信息:

[ 2018-08-16 19:56:34 ]: This is sample log message

显示系统信息

让我们创建一个显示 GNU/Linux 信息的函数

function system_info {
    echo "### OS information ###"
    lsb_release -a

    echo
    echo "### Processor information ###"
    processor=`grep -wc "processor" /proc/cpuinfo`
    model=`grep -w "model name" /proc/cpuinfo  | awk -F: '{print $2}'`
    echo "Processor = $processor"
    echo "Model     = $model"

    echo
    echo "### Memory information ###"
    total=`grep -w "MemTotal" /proc/meminfo | awk '{print $2}'`
    free=`grep -w "MemFree" /proc/meminfo | awk '{print $2}'`
    echo "Total memory: $total kB"
    echo "Free memory : $free kB"
}

执行完后会生成以下信息:

### OS information ###
No LSB modules are available.
Distributor ID:           Ubuntu
Description:   Ubuntu 18.04.1 LTS
Release:         18.04
Codename:    bionic

### Processor information ###
Processor = 1
Model     =  Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz

### Memory information ###
Total memory: 4015648 kB
Free memory : 2915428 kB

在当前目录下查找文件或者目录

下面的函数从当前目录下查找文件或者目录:

function search {
    find . -name $1
}

让我们使用下面的命令查找 dir4 这个目录:

$ search dir4

当你执行完命令后,将会产生如下输出:

./dir1/dir2/dir3/dir4

数字时钟

下面的函数在终端里创建了一个简单的数字时钟:

function digital_clock {
    clear
    while [ 1 ]
    do
        date +'%T'
        sleep 1
        clear
    done
}

函数库

库是函数的集合。将函数定义在文件里并在当前环境中导入那个文件,这样可以创建函数库。

假设我们已经在 utils.sh 中定义好了所有函数,接着在当前的环境下使用下面的命令导入函数:

$ source utils.sh

之后你就可以像调用其它 Bash 命令那样执行库中任何的函数了。

总结

本文我们讨论了诸多可以提升效率的实用技巧。我希望这篇文章能够启发你去创造自己的技巧。


via: https://www.linuxtechi.com/define-use-functions-linux-shell-script/

作者:Pradeep Kumar 选题:lujun9972 译者:LuuMing 校对:pityonline

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

KVM(基于内核的虚拟机)是一款为类 Linux 系统提供的开源的全虚拟化解决方案,KVM 使用虚拟化扩展(如 Intel VTAMD-V)提供虚拟化功能。无论何时我们在任何 Linux 机器上安装 KVM,都会通过加载诸如 kvm-intel.ko(基于 Intel 的机器)和 kvm-amd.ko(基于 amd 的机器)的内核模块,使其成为 管理程序 hyervisor (LCTT 译注:一种监控和管理虚拟机运行的核心软件层)。

KVM 允许我们安装和运行多个虚拟机(Windows 和 Linux)。我们可以通过 virt-manager 的图形用户界面或使用 virt-installvirsh 命令在命令行界面来创建和管理基于 KVM 的虚拟机。

在本文中,我们将讨论如何在 Ubuntu 18.04 LTS 服务器上安装和配置 KVM 管理程序。我假设你已经在你的服务器上安装了 Ubuntu 18.04 LTS 。接下来登录到您的服务器执行以下步骤。

第一步:确认您的硬件是否支持虚拟化

执行 egrep 命令以验证您的服务器的硬件是否支持虚拟化,

linuxtechi@kvm-ubuntu18-04:~$ egrep -c '(vmx|svm)' /proc/cpuinfo
1

如果输出结果大于 0,就意味着您的硬件支持虚拟化。重启,进入 BIOS 设置中启用 VT 技术。

现在使用下面的命令安装 kvm-ok 实用程序,该程序用于确定您的服务器是否能够运行硬件加速的 KVM 虚拟机。

linuxtechi@kvm-ubuntu18-04:~$ sudo apt install cpu-checker

运行 kvm-ok 命令确认输出结果,

linuxtechi@kvm-ubuntu18-04:~$ sudo kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used

第二步:安装 KVM 及其依赖包

运行下面的 apt 命令安装 KVM 及其依赖项:

linuxtechi@kvm-ubuntu18-04:~$ sudo apt update
linuxtechi@kvm-ubuntu18-04:~$ sudo apt install qemu qemu-kvm libvirt-bin  bridge-utils  virt-manager

只要上图相应的软件包安装成功,那么你的本地用户(对于我来说是 linuxtechi)将被自动添加到 libvirtd 群组。

第三步:启动并启用 libvirtd 服务

我们在 Ubuntu 18.04 服务器上安装 qemu 和 libvirtd 软件包之后,它就会自动启动并启用 libvirtd 服务,如果 libvirtd 服务没有开启,则运行以下命令开启,

linuxtechi@kvm-ubuntu18-04:~$ sudo service libvirtd start
linuxtechi@kvm-ubuntu18-04:~$ sudo update-rc.d libvirtd enable

现在使用下面的命令确认 libvirtd 服务的状态,

linuxtechi@kvm-ubuntu18-04:~$ service libvirtd status

输出结果如下所示:

第四步:为 KVM 虚拟机配置桥接网络

只有通过桥接网络,KVM 虚拟机才能访问外部的 KVM 管理程序或主机。在Ubuntu 18.04中,网络由 netplan 实用程序管理,每当我们新安装一个 Ubuntu 18.04 系统时,会自动创建一个名称为 /etc/netplan/50-cloud-init.yaml 文件,其配置了静态 IP 和桥接网络,netplan 实用工具将引用这个文件。

截至目前,我已经在此文件配置了静态 IP,文件的具体内容如下:

network:
  ethernets:
    ens33:
      addresses: [192.168.0.51/24]
      gateway4: 192.168.0.1
      nameservers:
        addresses: [192.168.0.1]
      dhcp4: no
      optional: true
  version: 2

我们在这个文件中添加桥接网络的配置信息,

linuxtechi@kvm-ubuntu18-04:~$ sudo vi /etc/netplan/50-cloud-init.yaml

network:
  version: 2
  ethernets:
    ens33:
      dhcp4: no
      dhcp6: no

  bridges:
    br0:
      interfaces: [ens33]
      dhcp4: no
      addresses: [192.168.0.51/24]
      gateway4: 192.168.0.1
      nameservers:
        addresses: [192.168.0.1]

正如你所看到的,我们已经从接口(ens33)中删除了 IP 地址,并将该 IP 添加到 br0 中,并且还将接口(ens33)添加到 br0。使用下面的 netplan 命令使更改生效,

linuxtechi@kvm-ubuntu18-04:~$ sudo netplan apply

如果您想查看 debug 日志请使用以下命令,

linuxtechi@kvm-ubuntu18-04:~$ sudo netplan --debug  apply

现在使用以下方法确认网络桥接状态:

linuxtechi@kvm-ubuntu18-04:~$ sudo networkctl status -a

linuxtechi@kvm-ubuntu18-04:~$ ifconfig

第五步:创建虚拟机(使用 virt-manager 或 virt-install 命令)

有两种方式创建虚拟机:

  • virt-manager(图形化工具)
  • virt-install(命令行工具)

使用 virt-manager 创建虚拟机

通过执行下面的命令启动 virt-manager

linuxtechi@kvm-ubuntu18-04:~$ sudo virt-manager

创建一个新的虚拟机:

点击“下一步”然后选择 ISO 镜像文件,我使用的是 RHEL 7.3 iso 镜像。

点击“下一步”。

在接下来的几个窗口中,系统会提示要求您为 VM 分配内存,处理器数量和磁盘空间。

并指定虚拟机名字和桥接网络名:

点击“结束”。

RHEL7-3-Installation-Virt-Manager

接下来只需要按照屏幕指示安装系统。

使用virt-install命令从命令行界面创建虚拟机

使用下面的 virt-install 命令从终端创建一个虚拟机,它将在命令行界面中开始安装,并根据您对虚拟机的名字,说明,ISO 文件位置和桥接配置的设置创建虚拟机。

linuxtechi@kvm-ubuntu18-04:~$ sudo virt-install  -n DB-Server  --description "Test VM for Database"  --os-type=Linux  --os-variant=rhel7  --ram=1096  --vcpus=1  --disk path=/var/lib/libvirt/images/dbserver.img,bus=virtio,size=10  --network bridge:br0 --graphics none  --location /home/linuxtechi/rhel-server-7.3-x86_64-dvd.iso --extra-args console=ttyS0

本文到此为止,我希望这篇文章能帮助你能够在 Ubuntu 18.04 服务器上成功安装 KVM。 除此之外,KVM 也是 Openstack 默认的管理程序。

阅读更多:“如何使用 virsh 命令创建,还原和删除 KVM 虚拟机快照”。


via: https://www.linuxtechi.com/install-configure-kvm-ubuntu-18-04-server/

作者:Pradeep Kumar 选题:lujun9972 译者:wyxplus 校对:wxy

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

在虚拟化平台上进行系统管理工作时,经常需要在开始重大操作比如部署补丁和代码前先设置一个虚拟机 快照 snapshot

虚拟机快照是特定时间点的虚拟机磁盘的副本。换句话说,快照保存了给定的时间点虚拟机的状态和数据。

我们可以在哪里使用虚拟机快照?

如果你在使用基于 KVM 虚拟机管理程序 hypervisor ,那么可以使用 virsh 命令获取虚拟机或域快照。快照在一种情况下变得非常有用,当你已经在虚拟机上安装或应用了最新的补丁,但是由于某些原因,虚拟机上的程序变得不稳定,开发团队想要还原所有的更改和补丁。如果你在应用补丁之前设置了虚拟机的快照,那么可以使用快照将虚拟机恢复到之前的状态。

注意:我们只能对磁盘格式为 Qcow2 的虚拟机的进行快照,并且 kvm 的 virsh 命令不支持 raw 磁盘格式,请使用以下命令将原始磁盘格式转换为 qcow2。

# qemu-img convert -f raw -O qcow2 image-name.img image-name.qcow2

创建 KVM 虚拟机(域)快照

我假设 KVM 管理程序已经在 CentOS 7 / RHEL 7 机器上配置好了,并且有虚拟机正在运行。我们可以使用下面的 virsh 命令列出虚拟机管理程序中的所有虚拟机,

[root@kvm-hypervisor ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 94    centos7.0                      running
 101   overcloud-controller           running
 102   overcloud-compute2             running
 103   overcloud-compute1             running
 114   webserver                      running
 115   Test-MTN                       running

假设我们想创建 webserver 虚拟机的快照,运行下面的命令,

语法:

# virsh snapshot-create-as –domain {vm_name} –name {snapshot_name} –description “enter description here”
[root@kvm-hypervisor ~]# virsh snapshot-create-as --domain webserver --name webserver_snap --description "snap before patch on 4Feb2018"
Domain snapshot webserver_snap created

创建快照后,我们可以使用下面的命令列出与虚拟机相关的快照:

[root@kvm-hypervisor ~]# virsh snapshot-list webserver
 Name                 Creation Time             State
------------------------------------------------------------
 webserver_snap       2018-02-04 15:05:05 +0530 running
[root@kvm-hypervisor ~]#

要列出虚拟机快照的详细信息,请运行下面的 virsh 命令:

[root@kvm-hypervisor ~]# virsh snapshot-info --domain webserver --snapshotname webserver_snap
Name:           webserver_snap
Domain:         webserver
Current:        yes
State:          running
Location:       internal
Parent:         -
Children:       0
Descendants:    0
Metadata:       yes

我们可以使用下面的 qemu-img 命令查看快照的大小:

[root@kvm-hypervisor ~]# qemu-img info /var/lib/libvirt/images/snaptestvm.img

qemu-img-command-output-kvm

还原 KVM 虚拟机快照

假设我们想要将 webserver 虚拟机还原到我们在上述步骤中创建的快照。使用下面的 virsh 命令将 Webserver 虚拟机恢复到其快照 webserver\_snap 时。

语法:

# virsh snapshot-revert {vm_name} {snapshot_name}
[root@kvm-hypervisor ~]# virsh snapshot-revert webserver webserver_snap

删除 KVM 虚拟机快照

要删除 KVM 虚拟机快照,首先使用 virsh snapshot-list 命令获取虚拟机的快照详细信息,然后使用 virsh snapshot-delete 命令删除快照。如下示例所示:

[root@kvm-hypervisor ~]# virsh snapshot-list --domain webserver
 Name                 Creation Time             State
------------------------------------------------------------
 webserver_snap       2018-02-04 15:05:05 +0530 running
[root@kvm-hypervisor ~]# virsh snapshot-delete --domain webserver --snapshotname webserver_snap
Domain snapshot webserver_snap deleted

这就是本文的全部内容,我希望你们能够了解如何使用 virsh 命令来管理 KVM 虚拟机快照。请分享你的反馈,并不要犹豫地分享给你的技术朋友

touch 命令用于创建空文件,也可以更改 Unix 和 Linux 系统上现有文件时间戳。这里所说的更改时间戳意味着更新文件和目录的访问以及修改时间。

让我们来看看 touch 命令的语法和选项:

语法

# touch {选项} {文件}

touch 命令中使用的选项:

touch-command-options

在这篇文章中,我们将介绍 Linux 中 9 个有用的 touch 命令示例。

示例:1 使用 touch 创建一个空文件

要在 Linux 系统上使用 touch 命令创建空文件,键入 touch,然后输入文件名。如下所示:

[root@linuxtechi ~]# touch devops.txt
[root@linuxtechi ~]# ls -l devops.txt
-rw-r--r--. 1 root root 0 Mar 29 22:39 devops.txt

示例:2 使用 touch 创建批量空文件

可能会出现一些情况,我们必须为某些测试创建大量空文件,这可以使用 touch 命令轻松实现:

[root@linuxtechi ~]# touch sysadm-{1..20}.txt

在上面的例子中,我们创建了 20 个名为 sysadm-1.txtsysadm-20.txt 的空文件,你可以根据需要更改名称和数字。

示例:3 改变/更新文件和目录的访问时间

假设我们想要改变名为 devops.txt 文件的访问时间,在 touch 命令中使用 -a 选项,然后输入文件名。如下所示:

[root@linuxtechi ~]# touch -a devops.txt

现在使用 stat 命令验证文件的访问时间是否已更新:

[root@linuxtechi ~]# stat devops.txt
  File: 'devops.txt'
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 67324178    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2018-03-29 23:03:10.902000000 -0400
Modify: 2018-03-29 22:39:29.365000000 -0400
Change: 2018-03-29 23:03:10.902000000 -0400
 Birth: -

改变目录的访问时间:

假设我们在 /mnt 目录下有一个 nfsshare 文件夹,让我们用下面的命令改变这个文件夹的访问时间:

[root@linuxtechi ~]# touch -m /mnt/nfsshare/
[root@linuxtechi ~]# stat /mnt/nfsshare/
  File: '/mnt/nfsshare/'
  Size: 6               Blocks: 0          IO Block: 4096   directory
Device: fd00h/64768d    Inode: 2258        Links: 2
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:mnt_t:s0
Access: 2018-03-29 23:34:38.095000000 -0400
Modify: 2018-03-03 10:42:45.194000000 -0500
Change: 2018-03-29 23:34:38.095000000 -0400
 Birth: -

示例:4 更改访问时间而不用创建新文件

在某些情况下,如果文件存在,我们希望更改文件的访问时间,并避免创建文件。在 touch 命令中使用 -c 选项即可,如果文件存在,那么我们可以改变文件的访问时间,如果不存在,我们也可不会创建它。

[root@linuxtechi ~]# touch -c sysadm-20.txt
[root@linuxtechi ~]# touch -c winadm-20.txt
[root@linuxtechi ~]# ls -l winadm-20.txt
ls: cannot access winadm-20.txt: No such file or directory

示例:5 更改文件和目录的修改时间

touch 命令中使用 -m 选项,我们可以更改文件和目录的修改时间。

让我们更改名为 devops.txt 文件的更改时间:

[root@linuxtechi ~]# touch -m devops.txt

现在使用 stat 命令来验证修改时间是否改变:

[root@linuxtechi ~]# stat devops.txt
  File: 'devops.txt'
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 67324178    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2018-03-29 23:03:10.902000000 -0400
Modify: 2018-03-29 23:59:49.106000000 -0400
Change: 2018-03-29 23:59:49.106000000 -0400
 Birth: -

同样的,我们可以改变一个目录的修改时间:

[root@linuxtechi ~]# touch -m /mnt/nfsshare/

使用 stat 交叉验证访问和修改时间:

[root@linuxtechi ~]# stat devops.txt
  File: 'devops.txt'
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 67324178    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2018-03-30 00:06:20.145000000 -0400
Modify: 2018-03-30 00:06:20.145000000 -0400
Change: 2018-03-30 00:06:20.145000000 -0400
 Birth: -

示例:7 将访问和修改时间设置为特定的日期和时间

每当我们使用 touch 命令更改文件和目录的访问和修改时间时,它将当前时间设置为该文件或目录的访问和修改时间。

假设我们想要将特定的日期和时间设置为文件的访问和修改时间,这可以使用 touch 命令中的 -c-t 选项来实现。

日期和时间可以使用以下格式指定:

{CCYY}MMDDhhmm.ss

其中:

  • CC – 年份的前两位数字
  • YY – 年份的后两位数字
  • MM – 月份 (01-12)
  • DD – 天 (01-31)
  • hh – 小时 (00-23)
  • mm – 分钟 (00-59)

让我们将 devops.txt 文件的访问和修改时间设置为未来的一个时间(2025 年 10 月 19 日 18 时 20 分)。

[root@linuxtechi ~]# touch -c -t 202510191820 devops.txt

使用 stat 命令查看更新访问和修改时间:

stat-command-output-linux

根据日期字符串设置访问和修改时间,在 touch 命令中使用 -d 选项,然后指定日期字符串,后面跟文件名。如下所示:

[root@linuxtechi ~]# touch -c -d "2010-02-07 20:15:12.000000000 +0530" sysadm-29.txt

使用 stat 命令验证文件的状态:

[root@linuxtechi ~]# stat sysadm-20.txt
  File: ‘sysadm-20.txt’
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 67324189    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2010-02-07 20:15:12.000000000 +0530
Modify: 2010-02-07 20:15:12.000000000 +0530
Change: 2018-03-30 10:23:31.584000000 +0530
 Birth: -

注意:在上述命令中,如果我们不指定 -c,如果系统中不存在该文件那么 touch 命令将创建一个新文件,并将时间戳设置为命令中给出的。

示例:8 使用参考文件设置时间戳(-r)

touch 命令中,我们可以使用参考文件来设置文件或目录的时间戳。假设我想在 devops.txt 文件上设置与文件 sysadm-20.txt 文件相同的时间戳,touch 命令中使用 -r 选项可以轻松实现。

语法:

# touch -r {参考文件} 真正文件
[root@linuxtechi ~]# touch -r sysadm-20.txt devops.txt

示例:9 在符号链接文件上更改访问和修改时间

默认情况下,每当我们尝试使用 touch 命令更改符号链接文件的时间戳时,它只会更改原始文件的时间戳。如果你想更改符号链接文件的时间戳,则可以使用 touch 命令中的 -h 选项来实现。

语法:

# touch -h {符号链接文件}
[root@linuxtechi opt]# ls -l /root/linuxgeeks.txt
lrwxrwxrwx. 1 root root 15 Mar 30 10:56 /root/linuxgeeks.txt -> linuxadmins.txt
[root@linuxtechi ~]# touch -t 203010191820 -h linuxgeeks.txt
[root@linuxtechi ~]# ls -l linuxgeeks.txt
lrwxrwxrwx. 1 root root 15 Oct 19  2030 linuxgeeks.txt -> linuxadmins.txt

这就是本教程的全部了。我希望这些例子能帮助你理解 touch 命令。请分享你的宝贵意见和评论。


via: https://www.linuxtechi.com/9-useful-touch-command-examples-linux/

作者:Pradeep Kumar 译者:MjSeven 校对:wxy

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

概览

sudo 表示 “superuser do”。 它允许已验证的用户以其他用户的身份来运行命令。其他用户可以是普通用户或者超级用户。然而,大部分时候我们用它来以提升的权限来运行命令。

sudo 命令与安全策略配合使用,默认安全策略是 sudoers,可以通过文件 /etc/sudoers 来配置。其安全策略具有高度可拓展性。人们可以开发和分发他们自己的安全策略作为插件。

与 su 的区别

在 GNU/Linux 中,有两种方式可以用提升的权限来运行命令:

  • 使用 su 命令
  • 使用 sudo 命令

su 表示 “switch user”。使用 su,我们可以切换到 root 用户并且执行命令。但是这种方式存在一些缺点:

  • 我们需要与他人共享 root 的密码。
  • 因为 root 用户为超级用户,我们不能授予受控的访问权限。
  • 我们无法审查用户在做什么。

sudo 以独特的方式解决了这些问题。

  1. 首先,我们不需要妥协来分享 root 用户的密码。普通用户使用他们自己的密码就可以用提升的权限来执行命令。
  2. 我们可以控制 sudo 用户的访问,这意味着我们可以限制用户只执行某些命令。
  3. 除此之外,sudo 用户的所有活动都会被记录下来,因此我们可以随时审查进行了哪些操作。在基于 Debian 的 GNU/Linux 中,所有活动都记录在 /var/log/auth.log 文件中。

本教程后面的部分阐述了这些要点。

实际动手操作 sudo

现在,我们对 sudo 有了大致的了解。让我们实际动手操作吧。为了演示,我使用 Ubuntu。但是,其它发行版本的操作应该是相同的。

允许 sudo 权限

让我们添加普通用户为 sudo 用户吧。在我的情形中,用户名为 linuxtechi

1) 按如下所示编辑 /etc/sudoers 文件:

$ sudo visudo

2) 添加以下行来允许用户 linuxtechi 有 sudo 权限:

linuxtechi ALL=(ALL) ALL

上述命令中:

  • linuxtechi 表示用户名
  • 第一个 ALL 指示允许从任何终端、机器访问 sudo
  • 第二个 (ALL) 指示 sudo 命令被允许以任何用户身份执行
  • 第三个 ALL 表示所有命令都可以作为 root 执行

以提升的权限执行命令

要用提升的权限执行命令,只需要在命令前加上 sudo,如下所示:

$ sudo cat /etc/passwd

当你执行这个命令时,它会询问 linuxtechi 的密码,而不是 root 用户的密码。

以其他用户执行命令

除此之外,我们可以使用 sudo 以另一个用户身份执行命令。例如,在下面的命令中,用户 linuxtechi 以用户 devesh 的身份执行命令:

$ sudo -u devesh whoami
[sudo] password for linuxtechi:
devesh

内置命令行为

sudo 的一个限制是 —— 它无法使用 Shell 的内置命令。例如, history 记录是内置命令,如果你试图用 sudo 执行这个命令,那么会提示如下的未找到命令的错误:

$ sudo history
[sudo] password for linuxtechi:
sudo: history: command not found

访问 root shell

为了克服上述问题,我们可以访问 root shell,并在那里执行任何命令,包括 Shell 的内置命令。

要访问 root shell, 执行下面的命令:

$ sudo bash

执行完这个命令后——您将观察到提示符变为井号(#)。

技巧

这节我们将讨论一些有用的技巧,这将有助于提高生产力。大多数命令可用于完成日常任务。

以 sudo 用户执行之前的命令

让我们假设你想用提升的权限执行之前的命令,那么下面的技巧将会很有用:

$ sudo !4

上面的命令将使用提升的权限执行历史记录中的第 4 条命令。

在 Vim 里面使用 sudo 命令

很多时候,我们编辑系统的配置文件时,在保存时才意识到我们需要 root 访问权限来执行此操作。因为这个可能让我们丢失我们对文件的改动。没有必要惊慌,我们可以在 Vim 中使用下面的命令来解决这种情况:

:w !sudo tee %

上述命令中:

  • 冒号 (:) 表明我们处于 Vim 的退出模式
  • 感叹号 (!) 表明我们正在运行 shell 命令
  • sudotee 都是 shell 命令
  • 百分号 (%) 表明从当前行开始的所有行

使用 sudo 执行多个命令

至今我们用 sudo 只执行了单个命令,但我们可以用它执行多个命令。只需要用分号 (;) 隔开命令,如下所示:

$ sudo -- bash -c 'pwd; hostname; whoami'

上述命令中

  • 双连字符 (--) 停止命令行切换
  • bash 表示要用于执行命令的 shell 名称
  • -c 选项后面跟着要执行的命令

无密码运行 sudo 命令

当第一次执行 sudo 命令时,它会提示输入密码,默认情形下密码被缓存 15 分钟。但是,我们可以避免这个操作,并使用 NOPASSWD 关键字禁用密码认证,如下所示:

linuxtechi ALL=(ALL) NOPASSWD: ALL

限制用户执行某些命令

为了提供受控访问,我们可以限制 sudo 用户只执行某些命令。例如,下面的行只允许执行 echols 命令 。

linuxtechi ALL=(ALL) NOPASSWD: /bin/echo /bin/ls

深入了解 sudo

让我们进一步深入了解 sudo 命令。

$ ls -l /usr/bin/sudo
-rwsr-xr-x 1 root root 145040 Jun 13  2017 /usr/bin/sudo

如果仔细观察文件权限,则发现 sudo 上启用了 setuid 位。当任何用户运行这个二进制文件时,它将以拥有该文件的用户权限运行。在所示情形下,它是 root 用户。

为了演示这一点,我们可以使用 id 命令,如下所示:

$ id
uid=1002(linuxtechi) gid=1002(linuxtechi) groups=1002(linuxtechi)

当我们不使用 sudo 执行 id 命令时,将显示用户 linuxtechi 的 id。

$ sudo id
uid=0(root) gid=0(root) groups=0(root)

但是,如果我们使用 sudo 执行 id 命令时,则会显示 root 用户的 id。

结论

从这篇文章可以看出 —— sudo 为普通用户提供了更多受控访问。使用这些技术,多用户可以用安全的方式与 GNU/Linux 进行交互。


via: https://www.linuxtechi.com/quick-tips-sudo-command-linux-systems/

作者:Pradeep Kumar 译者:szcf-weiya 校对:wxy

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

一年又一年,我们一直在使用 ifconfig 命令来执行网络相关的任务,比如检查和配置网卡信息。但是 ifconfig 已经不再被维护,并且在最近版本的 Linux 中被废除了! ifconfig 命令已经被 ip 命令所替代了。

ip 命令跟 ifconfig 命令有些类似,但要强力的多,它有许多新功能。ip 命令完成很多 ifconfig 命令无法完成的任务。

本教程将会讨论 ip 命令的 12 中最常用法,让我们开始吧。

案例 1:检查网卡信息

检查网卡的诸如 IP 地址,子网等网络信息,使用 ip addr show 命令:

[linuxtechi@localhost]$ ip addr show

或

[linuxtechi@localhost]$ ip a s

这会显示系统中所有可用网卡的相关网络信息,不过如果你想查看某块网卡的信息,则命令为:

[linuxtechi@localhost]$ ip addr show enp0s3

这里 enp0s3 是网卡的名字。

IP-addr-show-commant-output

案例 2:启用/禁用网卡

使用 ip 命令来启用一个被禁用的网卡:

[linuxtechi@localhost]$ sudo ip link set enp0s3 up

而要禁用网卡则使用 down 触发器:

[linuxtechi@localhost]$ sudo ip link set enp0s3 down

案例 3:为网卡分配 IP 地址以及其他网络信息

要为网卡分配 IP 地址,我们使用下面命令:

[linuxtechi@localhost]$ sudo ip addr add 192.168.0.50/255.255.255.0 dev enp0s3

也可以使用 ip 命令来设置广播地址。默认是没有设置广播地址的,设置广播地址的命令为:

[linuxtechi@localhost]$ sudo  ip addr add broadcast 192.168.0.255 dev enp0s3

我们也可以使用下面命令来根据 IP 地址设置标准的广播地址:

[linuxtechi@localhost]$  sudo ip addr add 192.168.0.10/24 brd + dev enp0s3

如上面例子所示,我们可以使用 brd 代替 broadcast 来设置广播地址。

案例 4:删除网卡中配置的 IP 地址

若想从网卡中删掉某个 IP,使用如下 ip 命令:

[linuxtechi@localhost]$ sudo ip addr del 192.168.0.10/24 dev enp0s3

案例 5:为网卡添加别名(假设网卡名为 enp0s3)

添加别名,即为网卡添加不止一个 IP,执行下面命令:

[linuxtechi@localhost]$  sudo ip addr add 192.168.0.20/24 dev enp0s3 label enp0s3:1

ip-command-add-alias-linux

案例 6:检查路由/默认网关的信息

查看路由信息会给我们显示数据包到达目的地的路由路径。要查看网络路由信息,执行下面命令:

[linuxtechi@localhost]$  ip route show

ip-route-command-output

在上面输出结果中,我们能够看到所有网卡上数据包的路由信息。我们也可以获取特定 IP 的路由信息,方法是:

[linuxtechi@localhost]$ sudo ip route get 192.168.0.1

案例 7:添加静态路由

我们也可以使用 IP 来修改数据包的默认路由。方法是使用 ip route 命令:

[linuxtechi@localhost]$ sudo ip route add default via 192.168.0.150/24

这样所有的网络数据包通过 192.168.0.150 来转发,而不是以前的默认路由了。若要修改某个网卡的默认路由,执行:

[linuxtechi@localhost]$ sudo ip route add 172.16.32.32 via 192.168.0.150/24 dev enp0s3

案例 8:删除默认路由

要删除之前设置的默认路由,打开终端然后运行:

[linuxtechi@localhost]$  sudo ip route del 192.168.0.150/24

注意: 用上面方法修改的默认路由只是临时有效的,在系统重启后所有的改动都会丢失。要永久修改路由,需要修改或创建 route-enp0s3 文件。将下面这行加入其中:

[linuxtechi@localhost]$  sudo vi /etc/sysconfig/network-scripts/route-enp0s3

172.16.32.32 via 192.168.0.150/24 dev enp0s3

保存并退出该文件。

若你使用的是基于 Ubuntu 或 debian 的操作系统,则该要修改的文件为 /etc/network/interfaces,然后添加 ip route add 172.16.32.32 via 192.168.0.150/24 dev enp0s3 这行到文件末尾。

案例 9:检查所有的 ARP 记录

ARP,是 地址解析协议 Address Resolution Protocol 的缩写,用于将 IP 地址转换为物理地址(也就是 MAC 地址)。所有的 IP 和其对应的 MAC 明细都存储在一张表中,这张表叫做 ARP 缓存。

要查看 ARP 缓存中的记录,即连接到局域网中设备的 MAC 地址,则使用如下 ip 命令:

[linuxtechi@localhost]$  ip neigh

ip-neigh-command-linux

案例 10:修改 ARP 记录

删除 ARP 记录的命令为:

[linuxtechi@localhost]$ sudo ip neigh del 192.168.0.106 dev enp0s3

若想往 ARP 缓存中添加新记录,则命令为:

[linuxtechi@localhost]$ sudo ip neigh add 192.168.0.150 lladdr 33:1g:75:37:r3:84 dev enp0s3 nud perm

这里 nud 的意思是 “neghbour state”(网络邻居状态),它的值可以是:

  • perm - 永久有效并且只能被管理员删除
  • noarp - 记录有效,但在生命周期过期后就允许被删除了
  • stale - 记录有效,但可能已经过期
  • reachable - 记录有效,但超时后就失效了

案例 11:查看网络统计信息

通过 ip 命令还能查看网络的统计信息,比如所有网卡上传输的字节数和报文数,错误或丢弃的报文数等。使用 ip -s link 命令来查看:

[linuxtechi@localhost]$ ip -s link

ip-s-command-linux

案例 12:获取帮助

若你想查看某个上面例子中没有的选项,那么你可以查看帮助。事实上对任何命令你都可以寻求帮助。要列出 ip 命令的所有可选项,执行:

[linuxtechi@localhost]$ ip help

记住,ip 命令是一个对 Linux 系统管理来说特别重要的命令,学习并掌握它能够让配置网络变得容易。本教程就此结束了,若有任何建议欢迎在下面留言框中留言。


via: https://www.linuxtechi.com/ip-command-examples-for-linux-users/

作者:Pradeep Kumar 译者:lujun9972 校对:wxy

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