分类 技术 下的文章

你也许听说过这个词很多次或者你可能已经在使用它了。在这篇文章中我将会清晰的告诉你 NTP 服务器和客户端的安装。

之后我们将会了解 Chrony NTP 客户端的安装

什么是 NTP 服务?

NTP 意即 网络时间协议 Network Time Protocol 。它是通过网络在计算机系统之间进行时钟同步的网络协议。换言之,它可以让那些通过 NTP 或者 Chrony 客户端连接到 NTP 服务器的系统保持时间上的一致(它能保持一个精确的时间)。

NTP 在公共互联网上通常能够保持时间延迟在几十毫秒以内的精度,并在理想条件下,它能在局域网下达到低于一毫秒的延迟精度。

它使用用户数据报协议(UDP)在端口 123 上发送和接受时间戳。它是个 C/S 架构的应用程序。

NTP 客户端

NTP 客户端将其时钟与网络时间服务器同步。

Chrony 客户端

Chrony 是 NTP 客户端的替代品。它能以更精确的时间更快的同步系统时钟,并且它对于那些不总是在线的系统很有用。

为什么我们需要 NTP 服务?

为了使你组织中的所有服务器与基于时间的作业保持精确的时间同步。

为了说明这点,我将告诉你一个场景。比如说,我们有两个服务器(服务器 1 和服务器 2)。服务器 1 通常在 10:55 完成离线作业,然后服务器 2 在 11:00 需要基于服务器 1 完成的作业报告去运行其他作业。

如果两个服务器正在使用不同的时间(如果服务器 2 时间比服务器 1 提前,服务器 1 的时间就落后于服务器 2),然后我们就不能去执行这个作业。为了达到时间一致,我们应该安装 NTP。

希望上述能清除你对于 NTP 的疑惑。

在这篇文章中,我们将使用下列设置去测试。

  • NTP 服务器: 主机名:CentOS7.2daygeek.com,IP:192.168.1.8,OS:CentOS 7
  • NTP 客户端: 主机名:Ubuntu18.2daygeek.com,IP:192.168.1.5,OS:Ubuntu 18.04

NTP 服务器端:如何在 Linux 上安装 NTP?

因为它是 C/S 架构,所以 NTP 服务器端和客户端的安装包没有什么不同。在发行版的官方仓库中都有 NTP 安装包,因此可以使用发行版的包管理器安装它。

对于 Fedora 系统,使用 DNF 命令 去安装 ntp。

$ sudo dnf install ntp

对于 Debian/Ubuntu 系统,使用 APT-GET 命令 或者 APT 命令 去安装 ntp。

$ sudo apt install ntp

对基于 Arch Linux 的系统,使用 Pacman 命令 去安装 ntp。

$ sudo pacman -S ntp

对 RHEL/CentOS 系统,使用 YUM 命令 去安装 ntp。

$ sudo yum install ntp

对于 openSUSE Leap 系统,使用 Zypper 命令 去安装 ntp。

$ sudo zypper install ntp

如何在 Linux 上配置 NTP 服务器?

安装 NTP 软件包后,请确保在服务器端的 /etc/ntp.conf 文件中取消以下配置的注释。

默认情况下,NTP 服务器配置依赖于 X.distribution_name.pool.ntp.org。 如果有必要,可以使用默认配置,也可以访问https://www.ntppool.org/zone/@站点,根据你所在的位置(特定国家/地区)进行更改。

比如说如果你在印度,然后你的 NTP 服务器将是 0.in.pool.ntp.org,并且这个地址适用于大多数国家。

# vi /etc/ntp.conf

restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict -6 ::1
server 0.asia.pool.ntp.org
server 1.asia.pool.ntp.org
server 2.asia.pool.ntp.org
server 3.asia.pool.ntp.org
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
driftfile /var/lib/ntp/drift
keys /etc/ntp/keys

我们仅允许 192.168.1.0/24 子网的客户端访问这个 NTP 服务器。

由于默认情况下基于 RHEL7 的发行版的防火墙是打开的,因此要允许 ntp 服务通过。

# firewall-cmd --add-service=ntp --permanent
# firewall-cmd --reload

更新配置后要重启服务:

对于 sysvinit 系统。基于 Debian 的系统需要去运行 ntp 而不是 ntpd

# service ntpd restart
# chkconfig ntpd on

对于 systemctl 系统。基于 Debian 的需要去运行 ntpntpd

# systemctl restart ntpd
# systemctl enable ntpd

NTP 客户端:如何在 Linux 上安装 NTP 客户端?

正如我在这篇文章中前面所说的。NTP 服务器端和客户端的安装包没有什么不同。因此在客户端上也安装同样的软件包。

对于 Fedora 系统,使用 DNF 命令 去安装 ntp。

$ sudo dnf install ntp

对于 Debian/Ubuntu 系统,使用 APT-GET 命令 或者 APT 命令 去安装 ntp。

$ sudo apt install ntp

对基于 Arch Linux 的系统,使用 Pacman 命令 去安装 ntp。

$ sudo pacman -S ntp

对 RHEL/CentOS 系统,使用 YUM 命令 去安装 ntp。

$ sudo yum install ntp

对于 openSUSE Leap 系统,使用 Zypper 命令 去安装 ntp。

$ sudo zypper install ntp

我已经在 CentOS7.2daygeek.com` 这台主机上安装和配置了 NTP 服务器,因此将其附加到所有的客户端机器上。

# vi /etc/ntp.conf
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict -6 ::1
server CentOS7.2daygeek.com prefer iburst
driftfile /var/lib/ntp/drift
keys /etc/ntp/keys

更新配置后重启服务:

对于 sysvinit 系统。基于 Debian 的系统需要去运行 ntp 而不是 ntpd

# service ntpd restart
# chkconfig ntpd on

对于 systemctl 系统。基于 Debian 的需要去运行 ntpntpd

# systemctl restart ntpd
# systemctl enable ntpd

重新启动 NTP 服务后等待几分钟以便从 NTP 服务器获取同步的时间。

在 Linux 上运行下列命令去验证 NTP 服务的同步状态。

# ntpq –p
或
# ntpq -pn

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*CentOS7.2daygee 133.243.238.163  2 u   14   64   37    0.686    0.151  16.432

运行下列命令去得到 ntpd 的当前状态。

# ntpstat
synchronised to NTP server (192.168.1.8) at stratum 3
   time correct to within 508 ms
   polling server every 64 s

最后运行 date 命令。

# date
Tue Mar 26 23:17:05 CDT 2019

如果你观察到 NTP 中输出的时间偏移很大。运行下列命令从 NTP 服务器手动同步时钟。当你执行下列命令的时候,确保你的 NTP 客户端应该为未活动状态。(LCTT 译注:当时间偏差很大时,客户端的自动校正需要花费很长时间才能逐步追上,因此应该手动运行以更新)

# ntpdate –uv CentOS7.2daygeek.com

via: https://www.2daygeek.com/install-configure-ntp-server-ntp-client-in-linux/

作者:Magesh Maruthamuthu 选题:lujun9972 译者:arrowfeng 校对:wxy

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

Fedora 发行版是一个功能齐全的操作系统,有出色的图形化桌面环境。用户可以很容易地通过单击动作来完成任何典型任务。所有这些美妙的易用性掩盖了其底层强大的命令行细节。本文是向你展示一些常见命令行实用程序的系列文章的一部分。让我们进入 shell 来看看 cut

通常,当你在命令行中工作时,你处理的是文本文件。有时这些文件可能很长,虽然可以完整地阅读它们,但是可能会耗费大量时间,并且容易出错。在本文中,你将学习如何从文本文件中提取内容,并从中获取你所需的信息。

重要的是要意识到,在 Fedora 中有许多方法可以完成类似的命令行任务。例如,Fedora 仓库含有用于解析和处理文本的完整语言系统。此外,还有多个命令行实用程序可用于 shell 中任何可能的用途。本文只关注使用其中几个实用程序选项,从文件中提取一些信息并以可读的格式呈现。

cut 使用

为了演示这个例子,在系统上使用一个标准的大文件,如 /etc/passwd。正如本系列的前一篇文章所示,你可以执行 cat 命令来查看整个文件:

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
...

此文件包含系统上所有所有账户的信息。它有一个特定的格式:

name:password:user-id:group-id:comment:home-directory:shell

假设你只想要系统上所有账户名的列表,如果你只能从每一行中删除 “name” 值。这就是 cut 命令派上用场的地方!它一次处理一行输入,并提取该行的特定部分。

cut 命令提供了以不同方式选择一行的部分的选项,在本示例中需要两个,-d-f-d 选项允许你声明用于分隔行中值的分隔符。在本例中,冒号(:)用于分隔值。-f 选项允许你选择要提取哪些字段值。因此,在本例中,输入的命令是:

$ cut -d: -f1 /etc/passwd
root
bin
daemon
adm
...

太棒了,成功了!但是你将输出打印到标准输出,在终端会话中意味着它需要占据屏幕。如果你需要稍后完成另一项任务所需的信息,这该怎么办?如果有办法将 cut 命令的输出保存到文本文件中,那就太好了。对于这样的任务,shell 有一个简单的内置功能,重定向功能(>)。

$ cut -d: -f1 /etc/passwd > names.txt

这会将 cut 的输出放到一个名为 names.txt 的文件中,你可以使用 cat 来查看它的内容:

$ cat names.txt
root
bin
daemon
adm
...

使用两个命令和一个 shell 功能,可以很容易地使用 cat 从一个文件进行识别、提取和重定向一些信息,并将其保存到另一个文件以供以后使用。


via: https://fedoramagazine.org/command-line-quick-tips-cutting-content-out-of-files/

作者:Stephen Snow 选题:lujun9972 译者:MjSeven 校对:wxy

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

创建自定义 Prometheus 集成以跟踪最大的云端提供商:地球母亲。

 title=

开源监控系统 Prometheus 集成了跟踪多种类型的时间序列数据,但如果没有集成你想要的数据,那么很容易构建一个。一个经常使用的例子使用云端提供商的自定义集成,它使用提供商的 API 抓取特定的指标。但是,在这个例子中,我们将与最大云端提供商集成:地球。

幸运的是,美国政府已经测量了天气并为集成提供了一个简单的 API。获取红帽总部下一个小时的天气预报很简单。

import requests
HOURLY_RED_HAT = "<https://api.weather.gov/gridpoints/RAH/73,57/forecast/hourly>"
def get_temperature():
    result = requests.get(HOURLY_RED_HAT)
    return result.json()["properties"]["periods"][0]["temperature"]

现在我们已经完成了与地球的集成,现在是确保 Prometheus 能够理解我们想要内容的时候了。我们可以使用 Prometheus Python 库中的 gauge 创建一个注册项:红帽总部的温度。

from prometheus_client import CollectorRegistry, Gauge
def prometheus_temperature(num):
    registry = CollectorRegistry()
    g = Gauge("red_hat_temp", "Temperature at Red Hat HQ", registry=registry)
    g.set(num)
    return registry

最后,我们需要以某种方式将它连接到 Prometheus。这有点依赖 Prometheus 的网络拓扑:是 Prometheus 与我们的服务通信更容易,还是反向更容易。

第一种是通常建议的情况,如果可能的话,我们需要构建一个公开注册入口的 Web 服务器,并配置 Prometheus 收刮(scrape)它。

我们可以使用 Pyramid 构建一个简单的 Web 服务器。

from pyramid.config import Configurator
from pyramid.response import Response
from prometheus_client import generate_latest, CONTENT_TYPE_LATEST
def metrics_web(request):
    registry = prometheus_temperature(get_temperature())
    return Response(generate_latest(registry),
                               content_type=CONTENT_TYPE_LATEST)
config = Configurator()
config.add_route('metrics', '/metrics')
config.add_view(metrics_web, route_name='metrics')
app = config.make_wsgi_app()

这可以使用任何 Web 网关接口(WSGI)服务器运行。例如,假设我们将代码放在 earth.py 中,我们可以使用 python -m twisted web --wsgi earth.app 来运行它。

或者,如果我们的代码连接到 Prometheus 更容易,我们可以定期将其推送到 Prometheus 的推送网关

import time
from prometheus_client import push_to_gateway
def push_temperature(url):
    while True:
        registry = prometheus_temperature(get_temperature())
        push_to_gateway(url, "temperature collector", registry)
        time.sleep(60*60)

这里的 URL 是推送网关的 URL。它通常以 :9091 结尾。

祝你构建自定义 Prometheus 集成成功,以便跟踪一切!


via: https://opensource.com/article/19/4/weather-python-prometheus

作者:Moshe Zadka 选题:lujun9972 译者:geekpi 校对:wxy

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

是否正在使用基于 Ubuntu 的系统,然后发现无法连接网络?你一定会很惊讶,很多的问题都可以简单地通过重启服务解决。

在这篇文章中,我会介绍在 Ubuntu 或者其他 Linux 发行版中重启网络的几种方法,你可以根据自身需要选择对应的方法。这些方法基本分为两类:

Ubuntu Restart Network

通过命令行方式重启网络

如果你使用的 Ubuntu 服务器版,那么你已经在使用命令行终端了。如果你使用的是桌面版,那么你可以通过快捷键 Ctrl+Alt+T Ubuntu 键盘快捷键 打开命令行终端。

在 Ubuntu 中,有多个命令可以重启网络。这些命令,一部分或者说大部分,也适用于在 Debian 或者其他的 Linux 发行版中重启网络。

1、network manager 服务

这是通过命令行方式重启网络最简单的方法。它相当于是通过图形化界面重启网络(重启 Network-Manager 服务)。

sudo service network-manager restart

此时,网络图标会消失一会儿然后重新显示。

2、systemd

service 命令仅仅是这个方式的一个封装(同样的也是 init.d 系列脚本和 Upstart 相关命令的封装)。systemctl 命令的功能远多于 service 命令。通常我更喜欢使用这个命令。

sudo systemctl restart NetworkManager.service

这时,网络图标又会消失一会儿。 如果你想了解 systemctl 的其他选项, 可以参考 man 帮助文档。

3、nmcli

这是 Linux 上可以管理网络的另一个工具。这是一个功能强大而且实用的工具。很多系统管理员都喜欢使用该工具,因为它非常容易使用。

这种方法有两个操作步骤:关闭网络,再开启网络。

sudo nmcli networking off

这样就会关闭网络,网络图标会消失。接下来,再开启网络:

sudo nmcli networking on

你可以通过 man 帮助文档了解 nmcli 的更多用法。

4、ifup & ifdown

这两个命令直接操作网口,切换网口是否可以收发包的状态。这是 Linux 中最应该了解的网络命令 之一。

使用 ifdown 关闭所有网口,再使用 ifup 重新启用网口。

通常推荐的做法是将这两个命令一起使用。

sudo ifdown -a && sudo ifup -a

注意:这种方法不会让网络图标从系统托盘中消失,另外,各种网络连接也会断。

补充工具: nmtui

这是系统管理员们常用的另外一种方法。它是在命令行终端中管理网络的文本菜单工具。

nmtui

打开如下菜单:

nmtui Menu

注意:在 nmtui 中,可以通过 updown 方向键选择选项。

选择 “Activate a connection”:

nmtui Menu Select "Activate a connection"

按下回车键,打开 “connections” 菜单。

nmtui Connections Menu

接下来,选择前面带星号(*)的网络。在这个例子中,就是 MGEO72。

Select your connection in the nmtui connections menu.

按下回车键。 这就将“停用”你的网络连接。

nmtui Connections Menu with no active connection

选择你要连接的网络:

Select the connection you want in the nmtui connections menu.

按下回车键。这样就重新激活了所选择的网络连接。

nmtui Connections Menu

按下 Tab 键两次,选择 “Back”:

Select "Back" in the nmtui connections menu.

按下回车键,回到 nmtui 的主菜单。

nmtui Main Menu

选择 “Quit” :

nmtui Quit Main Menu

退出该界面,返回到命令行终端。

就这样,你已经成功重启网络了。

通过图形化界面重启网络

显然,这是 Ubuntu 桌面版用户重启网络最简单的方法。如果这个方法不生效,你可以尝试使用前文提到的命令行方式重启网络。

NM 小程序是 NetworkManager 的系统托盘程序标志。我们将使用它来重启网络。

首先,查看顶部状态栏。你会在系统托盘找到一个网络图标 (因为我使用 Wi-Fi,所以这里是一个 Wi-Fi 图标)。

接下来,点击该图标(也可以点击音量图标或电池图标)。打开菜单。选择 “Turn Off” 关闭网络。

Restart network in Ubuntu

网络图标会在状态栏中消失,这表示你已经成功关闭网络了。

再次点击系统托盘重新打开菜单,选择 “Turn On”,重新开启网络。

Restarting network in Ubuntu

恭喜!你现在已经重启你的网络了。

其他提示:刷新可用网络列表

如果你已经连接上一个网络,但是你想连接到另外一个网络,你如何刷新 WiFi 列表,查找其他可用的网络呢?我来向你展示一下。

Ubuntu 没有可以直接 “刷新 WiFi 网络” 的选项,它有点隐蔽。

你需要再次打开配置菜单,然后点击 “Select Network” 。

Refresh wifi network list in Ubuntu

选择对应的网络修改你的 WiFi 连接。

你无法马上看到可用的无线网络列表。打开网络列表之后,大概需要 5 秒才会显示其它可用的无线网络。

Select another wifi network in Ubuntu

等待大概 5 秒钟,看到其他可用的网络。

现在,你就可以选择你想要连接的网络,点击连接。这样就完成了。

总结

重启网络连接是每个 Linux 用户在使用过程中必须经历的事情。

我们希望这些方法可以帮助你处理这样的问题!

你是如何重启或管理你的网络的?我们是否还有遗漏的?请在下方留言。


via: https://itsfoss.com/restart-network-ubuntu

作者:Sergiu 选题:lujun9972 译者:bodhix 校对:wxy

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

你应该意识到你的默认网关是你的路由器的 IP 地址。一般这是在安装过程中由操作系统自动检测的,如果没有,你可能需要改变它。如果你的系统不能 ping 自身,那么很可能是一个网关问题,你必须修复它。在网络中,当你有多个网络适配器或路由器时,这种情况可能会发生。

网关是一个扮演着入口点角色的路由器,可以从一个网络传递网络数据到另一个网络。

下面是一些可能帮助你收集到与该话题相似的一些信息。

这可以通过下面的四个命令完成。

  • route 命令:被用来显示和操作 IP 路由表。
  • ip 命令:类似于 ifconfig,常用于设置静态 IP 地址、路由 & 默认网关,等等。
  • netstat 命令:是一个命令行工具,用来显示网络连接相关的信息(包括入站和出站的),例如路由表、伪装连接、多播成员和网络接口。
  • routel 命令:被用来以好看的输出格式列出路由。

1)在 Linux 中如何使用 route 命令检查默认的网关或者路由 IP 地址?

route 命令被用来显示和操作 IP 路由表。

它主要用于通过一个已经配置的接口给特定的主机或者网络设置静态的路由。

当使用 add 或者 del 选项时,route 修改路由表。没有这些选项,route 显示路由表的当前内容。

# route
或
# route -n

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         www.routerlogin 0.0.0.0         UG    600    0        0 wlp8s0
192.168.1.0     0.0.0.0         255.255.255.0   U     600    0        0 wlp8s0

2)如何在 Linux 中使用 ip 命令检查默认网关或者路由 IP 地址?

IP 命令 类似于 ifconfig,常用于配置静态 IP 地址、路由 & 默认网关,等等。

ifconfig 命令因为多年没有维护而被遗弃了,即使它仍然在大多数 Linux 发行版上可获得。

ifconfig 命令已经被 ip 命令替代了,ip 命令是非常强大的,只要一个命令就能执行几个网络管理任务。

ip 命令工具附带在 iproute2 包中。在主要的 Linux 发行版中都默认预装了 iproute2 。

如果没有,你可以在你的终端中在包管理器的帮助下通过指定 iproute2 来安装它。

# ip r
或
# ip route
或
# ip route show

default via 192.168.1.1 dev wlp8s0 proto dhcp metric 600
192.168.1.0/24 dev wlp8s0 proto kernel scope link src 192.168.1.6 metric 600

3)如何在 Linux 中使用 netstat 命令检查默认网关或者路由 IP 地址?

netstat 代表 Network Statistics,是一个用来显示网络连接相关的信息(包括入站和出站)的命令行工具,例如路由表、伪装连接,多播成员和网络接口。

它列出所有的 tcp、udp 套接字连接和 unix 套接字连接。

它在网络中被用来诊断网络问题并判断网络中的流量总量来作为性能测量指标。

# netstat -r

Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         www.routerlogin 0.0.0.0         UG        0 0          0 wlp8s0
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 wlp8s0

4)如何在 Linux 中使用 routel 命令检查默认网关或者路由 IP 地址?

它用来以好看的输出格式列出路由信息。这些程序是一系列你可以用来替代 iproute2 的帮助脚本(routelroutef)。

routel 脚本以一种被认为更容易解释并且等价于 route 输出列表的格式来输出路由信息。

如果 routef 脚本不加任何参数,将仅仅简单的将路由表清空。小心!这意味着删除所有的路由,让你的网络不再可用。

# routel
         target            gateway          source    proto    scope    dev tbl
        default        192.168.1.1                     dhcp          wlp8s0
   192.168.1.0/ 24                     192.168.1.6   kernel     link wlp8s0
      127.0.0.0          broadcast       127.0.0.1   kernel     link     lo local
     127.0.0.0/ 8            local       127.0.0.1   kernel     host     lo local
      127.0.0.1              local       127.0.0.1   kernel     host     lo local
127.255.255.255          broadcast       127.0.0.1   kernel     link     lo local
    192.168.1.0          broadcast     192.168.1.6   kernel     link wlp8s0 local
    192.168.1.6              local     192.168.1.6   kernel     host wlp8s0 local
  192.168.1.255          broadcast     192.168.1.6   kernel     link wlp8s0 local
            ::1                                      kernel              lo
        fe80::/ 64                                   kernel          wlp8s0
            ::1              local                   kernel              lo local
fe80::ad00:2f7e:d882:5add              local                   kernel          wlp8s0 local
        ff00::/ 8                                                    wlp8s0 local

如果你只想打印默认的网关那么使用下面的格式。

# routel | grep default
        default        192.168.1.1                     dhcp          wlp8s0

via: https://www.2daygeek.com/check-find-default-gateway-or-router-ip-address-in-linux/

作者:Magesh Maruthamuthu 选题:lujun9972 译者:warmfrog 校对:wxy

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

在之前的该系列的部分中,你学习了有关目录访问目录的权限是如何工作的。你在这些文章中学习的大多数内容都可应用于文件,除了如何让一个文件变成可执行文件。

因此让我们在开始之前先解决这个问题。

不需要 .exe 扩展名

在其他操作系统中,一个文件的性质通常由它的后缀决定。如果一个文件有一个 .jpg 扩展,操作系统会认为它是一幅图像;如果它以 .wav 结尾,它是一个音频文件;如果它在文件名末尾以 .exe 结尾,它就是一个你可以执行的程序。

这导致了严重的问题,比如说木马可以伪装成文档文件。幸运的是,在 Linux 下事物不是这样运行的。可以确定的是,你可能会看到有些可执行文件是以 .sh 结尾暗示它们是可执行的脚本,但是这大部分是为了便于人眼找到文件,就像你使用 ls --color 将可执行文件的名字以亮绿色显示的方式相同。

事实上大多数应用根本没有扩展名。决定一个文件是否是一个真正程序的是 x (指可执行的)位。你可以通过运行以下命令使任何文件变得可执行,

chmod a+x some_program

而不管它的扩展名是什么或者是否存在。在上面命令中的 x 设置了 x 位,a 说明你为所有用户设置它。你同样可以为一组用户设置成拥有这个文件(g+x),或者只为一个用户——拥有者——设置 (u+x)。

尽管我们会在该系列之后的部分包含从命令行创建和运行脚本的内容,并学习通过输入它的路径并在结尾加上程序名的方式运行一个程序:

path/to/directory/some_program

或者,如果你当前在相同目录,你可以使用:

./some_program

还有其他方式可以使你的程序在目录树的任意位置运行 (提示:查询 $PATH 环境变量),但是当我们讨论 shell 脚本的时候你会读到这些。

复制、移动、链接

明显地,从命令行修改和处理文件有很多的方式,而不仅仅是处理它们的权限。当你试图打开一个不存在的文件是,大多数应用会创建一个新文件。如果 test.txt 当前并不存在,下列命令:

nano test.txt
vim test.txt

nanovim 是流行的命令行文本编辑器)都将为你创建一个空的 test.txt 文件来编辑。

你可以通过 “触摸” (touch)来创建一个空的文件,

touch test.txt

会创建一个文件,但是不会在任何应用中打开它。

你可以使用 cp 来拷贝一个文件到另一个位置,或者使用一个不同的名字:

cp test.txt copy_of_test.txt

你也可以拷贝一堆文件:

cp *.png /home/images

上面的命令拷贝当前目录下的所有 PNG 文件到相对你的主目录下的 images/ 目录。在你尝试之前 images/ 目录必须存在, 不然 cp 将显示一个错误。同样的,警惕,当你复制一个文件到一个已经包含相同名字的文件的目录时,cp 会静默地用新文件覆盖老的文件。

你可以使用:

cp -i *.png /home/images

如果你想要 cp 命令在有任何危险时警告你 (-i 选项代表交互式的)。

你同样可以复制整个目录,但是为了做到这样,你需要 -r 选项:

cp -rv directory_a/ directory_b

-r 选项代表递归,意味着 cp 会向下探索目录 directory_a,复制所有的文件和子目录下内部包含的。我个人喜欢包含 -v 选项,因为它使 cp 冗长而啰嗦,意味着它会显示你当前它正在做什么而不是仅仅静默的复制然后存在。

mv 命令移动东西。也就是说,它移动文件从一个位置到另一个位置。最简单的形式,mv 表现的更像 cp

mv test.txt new_test.txt

上面的命令使 new_test.txt 出现,test.txt 消失。

mv *.png /home/images

移动当前目录下所有的 PNG 文件到相对于你的主目录的 images/ 目录。同样的你必须小心你没有意外的覆盖已存在的文件。使用

mv -i *.png /home/images

如果你想站在安全的角度,你可以使用与 cp 相同的方式。

除了移动与拷贝的不同外,另一个 mvcp 之间的不同是当你移动目录时:

mv directory_a/ directory_b

不需要添加递归的标志。这是因为你实际做的是重命名一个目录,与第一个例子相同,你做的是重命名文件。实际上,即使你从一个目录到另一个目录 “移动” 一个文件,只要两个目录在相同的存储设备和分区,你就是在重命名文件。

你可以做一个实验来证明。 time 是一个工具来让你测量一个命令花费多久来执行。找一个非常大的文件,可以是几百 MB 甚至 几 GB (例如一个长视频),像下方这样尝试拷贝到另一个目录:

$ time cp hefty_file.mkv another_directory/
real 0m3,868s
user 0m0,016s
sys 0m0,887s

下面是 time 的输出。需要关注的是第一行, real 时间。它花费了几乎 4 秒来拷贝 355 MB 的 hefty_file.mkvanother_directory/ 目录。

现在让我们尝试移动它:

$ time mv hefty_file.mkv another_directory/
real 0m0,004s
user 0m0,000s
sys 0m0,003s

移动几乎是瞬时的!这是违反直觉的,因为看起来 mv 必须复制这个文件然后删除原来的。这是 mv 对比 cp 命令必须做的两件事。但是,实际上,mv 快了 1000 倍。

这是因为文件系统结构中,它的所有目录树,只为了让用户便利而存在。在每个分区的开始,有一个称作分区表的东西告诉操作系统在实际的物理磁盘上去哪找每个文件。在磁盘上,数据没有分为目录甚至是文件。作为替代的是轨道、扇区和簇。当你在相同分区 “移动” 一个文件时,操作系统实际做的仅仅是在分区表中改变了那个文件的入口,但它仍然指向磁盘上相同的簇信息。

是的!移动是一个谎言!至少在相同分区下是。如果你试图移动一个文件到一个不同的分区或者不同的设备, mv 仍然很快,但可以察觉到它比在相同分区下移动文件慢了。这是因为实际上发生了复制和清除数据。

重命名

有几个不同的命令行 rename 工具。没有一个像 cpmv 那样固定,并且它们工作的方式都有一点不同,相同的一点是它们都被用来改变文件名的部分。

在 Debian 和 Ubuntu 中, 默认的 rename 工具使用 正则表达式(字符组成的字符串模式)来大量的改变目录中的文件。命令:

rename 's/\.JPEG$/.jpg/' *

将改变所有扩展名为 JPEG 的文件为 jpg。文件 IMG001.JPEG 变成 IMG001.jpgmy_pic.JPEG 变成 my_pic.jpg,等等。

另一个 rename 版本默认在 Manjaro 上可获得,这是一个 Arch 的衍生版,更简单,但是可能没有那么强大:

rename .JPEG .jpg *

这和你之前看到的上面做相同的重命名操作。在这个版本,.JPEG 是你想改变的字符组成的字符串,.jpg 是你想要改变成为的,* 表示当前目录下的所有文件。

基本原则是如果你所做的仅仅是重命名一个文件或者目录,你最好用 mv,这是因为 mv 在所有分发版上都是可靠一致的。

了解更多

查看 mvcp 的 man 页面了解更多。运行

man cp

或者 man mv

来阅读这些命令自带的所有选项,这些使他们使用起来更强大和安全。


via: https://www.linux.com/blog/2018/8/linux-beginners-moving-things-around

作者:Paul Brown 选题:lujun9972 译者:warmfrog 校对:wxy

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