分类 技术 下的文章

Kubernetes 是一个开源容器编排平台,已成为大规模管理容器化应用的首选解决方案。虽然 Kubernetes 提供了强大的命令行工具来管理集群,但有时可视化界面可以使监控和管理部署变得更加容易。Kubernetes 仪表板是一个基于 Web 的用户界面,可让你可视化 Kubernetes 集群并与之交互。

在这篇博文中,我们将逐步引导你完成安装和访问 Kubernetes Dashboard 的过程,使你能够简化 Kubernetes 管理任务。

先决条件:

在安装 Kubernetes Dashboard 之前,请确保你有一个正在运行的 Kubernetes 集群并具有必要的管理访问权限。

安装 Kubernetes 仪表板

为集群安装 Kubernetes 仪表板的简单方法是通过 Helm Chart。Kubernetes 仪表板现在依赖于 cert-manager 和 nginx-ingress-controller。幸运的是,可以使用 Helm Chart 自动安装这些依赖项。但是,如果你已经安装了这些组件,则可以在安装 Chart 时通过设置标志 –set=nginx.enabled=false 和 –set=cert-manager.enabled=false 来禁用它们的安装。

事不宜迟,让我们进入安装步骤。

1)安装 Helm

使用终端或命令提示符访问集群的主节点。如果没有安装,请安装 helm。运行以下命令。

$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh

2)添加 Kubernetes 仪表板 Helm 仓库

运行以下 helm 命令来添加仪表板仓库:

$ helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
$ helm repo list

3)安装 Kubernetes 仪表板

要使用 helm 安装 Kubernetes 仪表板,请运行以下命令:

$ helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard

上面的输出确认仪表板已部署在 Kubernetes-dashboard 命名空间中。因此,要访问仪表板,请运行:

$ kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard-nginx-controller 8443:443

现在,打开运行上述命令的系统的 Web 浏览器,输入以下 URL:

https://localhost:8443

点击“ 接受风险并继续 Accept the Risk and Continue ”。

正如你在上面看到的,我们需要一个令牌才能登录。因此,让我们在下一步中生成所需的令牌。

4)为 Kubernetes 仪表板生成令牌

再打开一个到主节点的 SSH 会话,创建一个服务帐户并使用以下 yaml 文件分配所需的权限:

$ vi k8s-dashboard-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system

保存并退出文件。

接下来通过运行以下命令创建服务帐户:

$ kubectl create -f k8s-dashboard-account.yaml
serviceaccount/admin-user created
clusterrolebinding.rbac.authorization.k8s.io/admin-user created
$

现在,为管理员用户生成令牌,运行:

$ kubectl -n kube-system  create token admin-user

复制此令牌并返回浏览器,将其粘贴到“ 输入令牌 Enter token ”字段中,如下所示:

点击“ 登录 Login ”。

5) 访问 Kubernetes 仪表板

当我们点击上面的“登录”时,我们将看到以下仪表板:

太好了,你现在已登录 Kubernetes 仪表板。以下是一些需要探索的关键特性和功能:

  • 集群概览:获取集群运行状况、资源利用率和运行 Pod 的概览。
  • 工作负载:查看和管理你的部署、副本集、有状态集和守护程序集。
  • 服务:监控和管理你的服务,包括负载均衡器和外部端点。
  • 配置:探索你的配置映射、密钥和持久卷声明。
  • 存储:管理持久卷和存储类。
  • 命名空间:在命名空间之间切换以查看和管理不同项目或团队的资源。

这就是这篇文章的全部内容,我希望你发现它有用且内容丰富。请在下面的评论部分发表你的疑问和反馈。

(题图:MJ/1bd0efb0-d4ee-4c8b-854a-49dbf38c5dd7)


via: https://www.linuxtechi.com/how-to-install-kubernetes-dashboard/

作者:Pradeep Kumar 选题:lkxed 译者:geekpi 校对:wxy

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

揭开 Linux 中退出码的神秘面纱。了解什么是退出码,以及为什么和如何使用它们。

退出码(退出状态)可以告诉我们最后一次执行的命令的状态。在命令结束以后,我们可以知道命令是成功完成的还是以错误结束的。

其基本思想是,程序返回退出代码 0 时表示执行成功,没有问题。代码 1 或 0 以外的任何代码都被视为不成功。

退出码除了 0 和 1 外还有很多值,我将在本文介绍它们。

Linux Shell 中的各种退出码

我们来快速了解一下 Linux Shell 中的主要退出码:

退出码解释
0命令成功执行
1通用错误代码
2命令(或参数)使用不当
126权限被拒绝(或)无法执行
127未找到命令,或 PATH 错误
128+n命令被信号从外部终止,或遇到致命错误
130通过 Ctrl+C 或 SIGINT 终止(终止代码 2 或键盘中断)
143通过 SIGTERM 终止(默认终止)
255/*退出码超过了 0-255 的范围,因此重新计算(LCTT 译注:超过 255 后,用退出码对 256 取模)
? 130(SIGINT 或 ^C)和 143(SIGTERM)等终止信号是非常典型的,它们属于 128+n 信号,其中 n 代表终止码。

在简单了解了退出码之后,我们来看看它们的用法。

获取退出码

前一个命令执行的退出码存储在 特殊变量 $? 中。你可以通过运行以下命令来获取:

echo $?

我们在所有演示中都将使用它来获取退出代码。

请注意,exit 命令支持以带着前一条命令相同的退出码退出。

退出码 0

退出码 0 表示命令执行无误,这是完成命令的理想状态。

例如,我们运行这样一条基本命令

neofetch 

echo $?

这个退出码 0 表示特定命令已成功执行,仅此而已。让我们再演示几个例子。

你可以尝试 终止一个进程;它也会返回代码 0。

pkill lxappearance

查看文件内容也会返回退出码 0,这仅意味着 cat 命令执行成功。

退出码 1

退出码 1 也很常见。它通常表示命令以一般错误结束。

例如,在没有 sudo 权限的情况下使用 软件包管理器,就会返回代码 1。在 Arch Linux 中,如果我运行下面的命令:

pacman -Sy

它会返回 1, 表示上一条命令运行出错。

exit code 1 (impermissible operation resulted in this code)

? 如果你在基于 Ubuntu 的发行版中尝试这样做(不使用 sudo 执行 apt update),运行后会得到错误码 100,表示你是在没有权限的情况下运行 apt。100 不是标准错误码,而是 apt 特有的错误码。

虽然这是一般的理解,但我们也可以将其解释为 “不被允许的操作”。

除以 0 等操作也会返回错误码 1。

Division by zero results in code 1

退出码 2

这个退出码出现在当执行的命令有语法错误时。滥用命令参数也会导致此错误。

一般来说,它表示由于使用不当,命令无法执行。

例如,我在一个本应只有一个连字符的选项上添加了两个连字符,那么此时会出现退出码 2。

grep --z file.txt

Invalid argument resulted in exit code 2

当权限被拒绝时,比如访问 /root 文件夹,就会出现错误码 2。

Permission denied gives out code 2

退出码 126

126 是一个特殊的退出码,它用于表示命令或脚本因权限错误而未被执行。

当你尝试执行没有执行权限的 Shell 脚本时,就会出现这个错误。

请注意,该退出码只出现在没有足够权限的脚本或命令的“执行”中,这与一般的权限被拒绝错误不同。

因此,不要把它与你之前看到的退出码为 2 的示例混淆。在那个示例中,运行的是 ls 命令,权限问题出自它试图执行的目录。而本例中权限问题来自脚本本身。

退出码 127

这是另一个常见的退出码。退出码 127 指的是“未找到命令”。它通常发生在执行的命令有错别字或所需的可执行文件不在 $PATH 变量中时。

例如,当我尝试执行一个不带路径的脚本时,经常会看到这个错误。

Script executed without the path gives "command not found" or code 127

当你想运行的可执行文件不在 $PATH 变量中时,也会出现退出码 127。你可以通过 在 PATH 变量中添加命令的目录 来纠正这种情况。

当你输入不存在的命令时,也会得到这样的退出码。

Unmount is not a command, and Screenfetch is not installed, which resulted in code 127

退出码 128+n 系列

当应用程序或命令因致命错误而终止或执行失败时,将产生 128 系列退出码(128+n),其中 n 为信号编号。

n 包括所有类型的终止代码,如 SIGTERM、SIGKILL 等。

退出码 130 或 SIGINT

在通过终止信号 2 或按下 Ctrl+C 中断进程时,会发出 SIGINT(键盘中断信号)。

因为终止信号是 2,所以我们得到的退出码是 130(128+2)。下面的视频演示了 lxappearance 的中断信号。

退出码 137 或 SIGKILL

SIGKILL(立即终止信号)表示终止信号 9。这是终止应用程序时最不应该使用的方法。

因为终止信号为 9,因此我们得到的退出代码为 137(128+9)。

退出码 143 或 SIGTERM

SIGTERM 是进程在未指定参数的情况下被杀死时的默认行为。

SIGTERM 的终止信号为 15,因此该信号的退出码为 143(128+15)。

还有一些你以前可能不知道的终止信号,它们也有自己类似的退出码。你可以在这里查看它们:

? 请注意,如果进程在启动它的同一会话中终止,这些信号可能不会出现。如果要重现这些信号,请从不同的 shell 终止。

就个人而言,信号 128 是无法重现的。

当退出码超过了 255 会怎样?

最新版本的 Bash 甚至保留了超过 255 的原始退出码的值,但一般来说,如果代码超过 255,就会被重新计算。

也就是说,代码 256 会变成 0,257 会变成 1,383 会变成 127,以此类推。为确保更好的兼容性,请将退出码保持在 0 至 255 之间。

结语

希望你对 Linux Shell 中的退出码有所了解。在排查各种问题时,使用它们会非常方便。

如果你要在 Shell 脚本中使用这些代码,请确保你了解每个代码的含义,以便更容易地排除故障。

这就是本文的全部内容。如有遗漏,请在评论区告诉我。

(题图:MJ/719ff711-1b9f-4aa9-a82e-980704acbdd8)


via: https://itsfoss.com/linux-exit-codes/

作者:Pranav Krishna 选题:lkxed 译者:lxbwolf 校对:wxy

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

需要在虚拟机中访问 GRUB 菜单吗?以下是做法。

大多数现代虚拟机都配置为跳过 GRUB 引导加载程序 以获得无缝体验。

但是,你有时可能需要访问 GRUB 菜单。例如,如果你想切换回旧内核或进入恢复模式以 重置密码。

? TLDR:重启虚拟机并在再次启动时按住 Shift 键。这将为你提供 GRUB 菜单。

在这篇简短的文章中,我将向你展示两种访问虚拟机中运行的 Linux 中的 GRUB 菜单的方法:

  • 临时方案(当你需要访问 GRUB 一两次时)
  • 永久方案(每次启动时都会显示 GRUB)

由于大多数用户不会每天与 GRUB 交互,因此我将从一个临时解决方案开始,你可以无需任何调整即可访问 GRUB。

? 我在此处的教程中使用了 Ubuntu,但这些步骤也适用于其他 Linux 发行版。

在虚拟机中访问 GRUB 引导加载程序(快速方式)

如果你偶尔想访问 GRUB,这应该是最好的方法,因为它不需要任何配置。

只需重新启动系统并按住 shift 键即可。

就是这样!

你将拥有没有任何时间限制的 GRUB 菜单:

Accessing grub menu in VM using shift key

很简单的方法。不是吗?

但它仅适用于特定的启动。那么如果你想在每次启动时都进入 GRUB 该怎么办呢? 请参考下面的方法。

永久在虚拟机中启用 GRUB 菜单(如果你愿意)

? 此方法需要在命令行中更改 GRUB 配置文件。请确保你能够轻松地在终端中进行编辑。

如果你需要处理 GRUB 菜单来访问其他操作系统或经常更改 从旧内核启动,那么此方法非常适合你。

要使 GRUB 在每次引导时都可访问,你必须在配置文件中进行更改。

首先,使用以下命令打开 GRUB 配置文件:

sudo nano /etc/default/grub

在这里,将 GRUB_TIMEOUT_STYLE=hidden 更改为 GRUB_TIMEOUT_STYLE=menu:

change grub timeout style

接下来,在同一个配置文件中,指定你希望 GRUB 显示的秒数。

我建议 5 秒,因为它似乎在太长和太短之间取得了平衡(是的,非常相关):

GRUB_TIMEOUT=5

configure grub timeout in ubuntu

最后,你可以 保存更改并退出 nano 编辑器。

要激活对配置文件所做的更改,请使用以下命令更新 GRUB:

sudo update-grub

就是这样。重启系统,GRUB 应该会显示 5 秒钟。

将 GRUB 主题化如何?

大多数 Linux 发行版都会使用 GRUB 引导加载程序,因为它的配置非常简单,而且能完成工作。

但在默认情况下,除了黑色背景和纯文本外,它没什么样式。因此,我们制作了一份指南,教你如何让它看起来更漂亮:

定制 GRUB 以获得更好的体验

希望本指南对你有所帮助,如果你有任何疑问,请在评论中告诉我。

(题图:MJ/f75daf37-20c2-4bae-8a68-dc6a82ad0d61)


via: https://itsfoss.com/access-grub-virtual-machine/

作者:Sagar Sharma 选题:lkxed 译者:geekpi 校对:wxy

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

进行单元测试可以提高代码质量,并且它不会打断你的工作流。

 title=

本文是 使用 CMake 和 VSCodium 设置一个构建系统 的后续文章。

在上一篇文章中我介绍了基于 VSCodium 和 CMake 配置构建系统。本文我将介绍如何通过 GoogleTest 和 CTest 将单元测试集成到这个构建系统中。

首先克隆 这个仓库,用 VSCodium 打开,切换到 devops_2 标签。你可以通过点击 main 分支符号(红框处),然后选择 devops_2 标签(黄框处)来进行切换:

 title=

或者你可以通过命令行来切换:

$ git checkout tags/devops_2

GoogleTest

GoogleTest 是一个平台无关的开源 C++ 测试框架。单元测试是用来验证单个逻辑单元的行为的。尽管 GoogleTest 并不是专门用于单元测试的,我将用它对 Generator 库进行单元测试。

在 GoogleTest 中,测试用例是通过断言宏来定义的。断言可能产生以下结果:

  • 成功: 测试通过。
  • 非致命失败: 测试失败,但测试继续。
  • 致命失败: 测试失败,且测试终止。

致命断言和非致命断言通过不同的宏来区分:

  • ASSERT_*: 致命断言,失败时终止。
  • EXPECT_*: 非致命断言,失败时不终止。

谷歌推荐使用 EXPECT_* 宏,因为当测试中包含多个的断言时,它允许继续执行。断言有两个参数:第一个参数是测试分组的名称,第二个参数是测试自己的名称。Generator 只定义了 generate(...) 函数,所以本文中所有的测试都属于同一个测试组:GeneratorTest。

针对 generate(...) 函数的测试可以从 GeneratorTest.cpp 中找到。

引用一致性检查

generate(...) 函数有一个 std::stringstream 的引用作为输入参数,并且它也将这个引用作为返回值。第一个测试就是检查输入的引用和返回的引用是否一致。

TEST(GeneratorTest, ReferenceCheck){
    const int NumberOfElements = 10;
    std::stringstream buffer;
    EXPECT_EQ(
        std::addressof(buffer),
        std::addressof(Generator::generate(buffer, NumberOfElements))
    );
}

在这个测试中我使用 std::addressof 来获取对象的地址,并用 EXPECT_EQ 来比较输入对象和返回对象是否是同一个。

检查元素个数

本测试检查作为输入的 std::stringstream 引用中的元素个数与输入参数中指定的个数是否相同。

TEST(GeneratorTest, NumberOfElements){
    const int NumberOfElements = 50;
    int nCalcNoElements = 0;

    std::stringstream buffer;

    Generator::generate(buffer, NumberOfElements);
    std::string s_no;

    while(std::getline(buffer, s_no, ' ')) {
        nCalcNoElements++;
    }

    EXPECT_EQ(nCalcNoElements, NumberOfElements);
}

乱序重排

本测试检查随机化引擎是否工作正常。如果连续调用两次 generate 函数,应该得到的是两个不同的结果。

TEST(GeneratorTest, Shuffle){

    const int NumberOfElements = 50;

    std::stringstream buffer_A;
    std::stringstream buffer_B;

    Generator::generate(buffer_A, NumberOfElements);
    Generator::generate(buffer_B, NumberOfElements);

    EXPECT_NE(buffer_A.str(), buffer_B.str());
}

求和校验

与前面的测试相比,这是一个大体量的测试。它检查 1 到 n 的数值序列的和与乱序重排后的序列的和是否相等。 generate(...) 函数应该生成一个 1 到 n 的乱序的序列,这个序列的和应当是不变的。

TEST(GeneratorTest, CheckSum){

    const int NumberOfElements = 50;
    int nChecksum_in = 0;
    int nChecksum_out = 0;

    std::vector<int> vNumbersRef(NumberOfElements); // Input vector
    std::iota(vNumbersRef.begin(), vNumbersRef.end(), 1); // Populate vector

    // Calculate reference checksum
    for(const int n : vNumbersRef){
        nChecksum_in += n;
    }

    std::stringstream buffer;
    Generator::generate(buffer, NumberOfElements);

    std::vector<int> vNumbersGen; // Output vector
    std::string s_no;

    // Read the buffer back back to the output vector
    while(std::getline(buffer, s_no, ' ')) {
        vNumbersGen.push_back(std::stoi(s_no));
    }

    // Calculate output checksum
    for(const int n : vNumbersGen){
        nChecksum_out += n;
    }

    EXPECT_EQ(nChecksum_in, nChecksum_out);
}

你可以像对一般 C++ 程序一样调试这些测试。

CTest

除了嵌入到代码中的测试之外,CTest 提供了可执行程序的测试方式。简而言之就是通过给可执行程序传入特定的参数,然后用 正则表达式 对它的输出进行匹配检查。通过这种方式可以很容易检查程序对于不正确的命令行参数的反应。这些测试定义在顶层的 CMakeLists.txt 文件中。下面我详细介绍 3 个测试用例:

参数正常

如果输入参数是一个正整数,程序应该输出应该是一个数列:

add_test(NAME RegularUsage COMMAND Producer 10)
set_tests_properties(RegularUsage
    PROPERTIES PASS_REGULAR_EXPRESSION "^[0-9 ]+"
)

没有提供参数

如果没有传入参数,程序应该立即退出并提示错误原因:

add_test(NAME NoArg COMMAND Producer)
set_tests_properties(NoArg
    PROPERTIES PASS_REGULAR_EXPRESSION "^Enter the number of elements as argument"
)

参数错误

当传入的参数不是整数时,程序应该退出并报错。比如给 Producer 传入参数 ABC:

add_test(NAME WrongArg COMMAND Producer ABC)
set_tests_properties(WrongArg
    PROPERTIES PASS_REGULAR_EXPRESSION "^Error: Cannot parse"
)

执行测试

可以使用 ctest -R Usage -VV 命令来执行测试。这里给 ctest 的命令行参数:

  • -R <测试名称> : 执行单个测试
  • -VV:打印详细输出

测试执行结果如下:

$ ctest -R Usage -VV
UpdatecTest Configuration from :/home/stephan/Documents/cpp_testing sample/build/DartConfiguration.tcl
UpdateCTestConfiguration from :/home/stephan/Documents/cpp_testing sample/build/DartConfiguration.tcl
Test project /home/stephan/Documents/cpp_testing sample/build
Constructing a list of tests
Done constructing a list of tests
Updating test list for fixtures
Added 0 tests to meet fixture requirements
Checking test dependency graph...
Checking test dependency graph end

在这里我执行了名为 Usage 的测试。

它以无参数的方式调用 Producer:

test 3
    Start 3: Usage
3: Test command: /home/stephan/Documents/cpp testing sample/build/Producer

输出不匹配 [^[0-9]+] 的正则模式,测试未通过。

3: Enter the number of elements as argument
1/1 test #3. Usage ................

Failed Required regular expression not found.
Regex=[^[0-9]+]

0.00 sec round.

0% tests passed, 1 tests failed out of 1
Total Test time (real) =
0.00 sec
The following tests FAILED:
3 - Usage (Failed)
Errors while running CTest
$

如果想要执行所有测试(包括那些用 GoogleTest 生成的),切换到 build 目录中,然后运行 ctest 即可:

 title=

在 VSCodium 中可以通过点击信息栏的黄框处来调用 CTest。如果所有测试都通过了,你会看到如下输出:

 title=

使用 Git 钩子进行自动化测试

目前为止,运行测试是开发者需要额外执行的步骤,那些不能通过测试的代码仍然可能被提交和推送到代码仓库中。利用 Git 钩子 可以自动执行测试,从而防止有瑕疵的代码被提交。

切换到 .git/hooks 目录,创建 pre-commit 文件,复制粘贴下面的代码:

#!/usr/bin/sh

(cd build; ctest --output-on-failure -j6)

然后,给文件增加可执行权限:

$ chmod +x pre-commit

这个脚本会在提交之前调用 CTest 进行测试。如果有测试未通过,提交过程就会被终止:

 title=

只有所有测试都通过了,提交过程才会完成:

 title=

这个机制也有一个漏洞:可以通过 git commit --no-verify 命令绕过测试。解决办法是配置构建服务器,这能保证只有正常工作的代码才能被提交,但这又是另一个话题了。

总结

本文提到的技术实施简单,并且能够帮你快速发现代码中的问题。做单元测试可以提高代码质量,同时也不会打断你的工作流。GoogleTest 框架提供了丰富的特性以应对各种测试场景,文中我所提到的只是一小部分而已。如果你想进一步了解 GoogleTest,我推荐你阅读 GoogleTest Primer。

(题图:MJ/f212ce43-b60b-4005-b70d-8384f2ba5860)


via: https://opensource.com/article/22/1/unit-testing-googletest-ctest

作者:Stephan Avenwedde 选题:lujun9972 译者:toknow-gh 校对:wxy

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

在终端基础知识系列的这一部分中,学习如何在 Linux 中使用命令行复制文件和目录。

复制文件是你经常执行的最基本但最重要的任务之一。

Linux 有一个专门的 cp 命令用于复制文件和目录(文件夹)。

在终端基础知识系列的这一部分中,你将学习在终端中复制文件和文件夹。

? 回想一下,以下是你迄今为止在本终端基础知识系列中所学到的内容:

让我们继续该系列的第七章。

在 Linux 命令行中复制文件

让我向你展示一些复制文件的示例。

将文件复制到另一个目录

要将一个文件复制到另一目录,你所要做的就是遵循给定的命令语法:

cp 源文件 目标目录

例如,在这里,我将名为 Hello.txt 的文件复制到名为 Tux 的目录中:

copy file to another directory in linux command line

正如你所看到的,文件已成功复制到 Tux 目录中。

复制文件但重命名

你可以选择在复制文件时重命名该文件。只需为“目标文件”指定一个不同的名称即可。

cp 源文件 改名的文件

作为参考,在这里,我将名为 Hello.txt 的文件复制到同一目录,并将其重命名为 Renamed_Hello.txt:

rename a file while copying in a same directory in linux terminal

为什么要这么做? 比如说,你必须编辑配置文件。一个好的做法是在编辑配置文件之前在同一位置对其进行备份。这样,如果事情没有按计划进行,你可以恢复到旧配置。

将多个文件复制到另一个位置

要将多个文件复制到另一个目录,请按以下方式执行命令:

cp File1 File2 File3 FileN Target_directory

在这里,我将多个文件复制到新位置。

copy multiple files using the cp command in linux

? 当你复制多个文件时,仅使用 cp 命令无法重命名它们。

复制时处理重复文件

默认情况下,如果目标目录中存在同名文件,cp 命令将覆盖该文件。

为了避免覆盖,你可以在 cp 命令中使用 -n 选项,它不会覆盖现有文件:

cp -n 源文件 目标目录

例如,在这里,我尝试复制目标目录中已有的两个文件,并使用 -v 选项来展示该命令正在执行的操作:

cp -n -v itsFOSS.txt LHB.txt LU.txt ~/Tux

how not to override files while copying in linux using the cp command

交互式复制文件

但是,当你想要覆盖某些文件,而某些文件应该保持不变时该怎么办?

好吧,你可以使用 -i 选项在交互模式下使用 cp 命令,它每次都会询问你是否应该覆盖该文件:

cp -i 源文件 目标目录

how to use cp command in interactive mode

?️ 自己练习上述所有示例。你已经了解如何创建文件和文件夹,因此请重新创建所有内容。

在 Linux 命令行中复制目录

mkdir 命令用于创建新目录,rmdir 命令用于删除(空)目录。但没有用于复制目录的 cpdir 命令。

你必须使用相同的 cp 命令,但使用递归选项 -r 将目录及其所有内容复制到另一个位置:

cp -r 源目录 目标目录

例如,在这里,我将名为 IF 的目录复制到 LHB:

how to copy a directory in linux command line

但它复制了整个目录。?

那么,当你只想复制目录内容而不是目录本身时该怎么办?

你可以执行以下操作:

仅复制目录的内容(不是目录)

要仅复制目录的内容,而不复制目录本身,请在源目录名称的末尾附加 /.:

cp -r 源目录/. 目标目录

在这里,我想复制名为 IF 的目录的内容,其中包含以下三个文件:

check the file contents of directory using the tree command

我将执行以下命令将 IF 目录的文件内容复制到 LHB:

cp -r IF/. LHB

copy the file contents of directory not a directory itself in linux command line

你还可以在此处使用 源目录/* 。

复制多个目录

要复制多个目录,你必须按以下方式执行命令:

cp -r 目录1 目录2 目录3 目录N 目标目录

例如,在这里,我将两个名为 IF 和 LU 的目录复制到 LHB:

cp -r IF LU ~/LHB

copy multiple directories using the cp command in linux command line

当你想要从多个目录复制文件但不复制目录本身时,你可以执行相同的操作:

cp -r 目录1/. 目录2/. 目录3/. 目录N/. 目标目录

copy files from multiple directories but not directories their self using the cp command

?️ 你还可以像重命名文件一样重命名目录。

测试你的知识

现在,让我们看看你对到目前为止所学到的知识还记得多少。

  • 创建一个名为 copy_practice 的目录。
  • 将文件 /etc/services 复制到这个新创建的文件夹。
  • 在此目录下创建一个名为 secrets 的文件夹,并将文件 /etc/passwd 和 /etc/services 复制到其中。
  • 将 copy_practice 中的 services 文件复制到 secrets 文件夹中,但不要覆盖它。
  • 将 secrets 文件夹复制到你的主目录。
  • 删除 secrets 和 copy_practice 目录。

这会给你一些练习。

到目前为止进展顺利。你已经学到了很多东西。在下一章中,你将了解如何使用 mv 命令移动文件和文件夹。


via: https://itsfoss.com/copy-files-directory-linux/

作者:Sagar Sharma 选题:lkxed 译者:geekpi 校对:wxy

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

Fedora Linux 提供了多个变体以满足你的需求。你可以在我之前的文章《Fedora Linux 的各种版本》中找到所有 Fedora Linux 变体的概述。本文将对 Fedora Linux 官方版本进行更详细的介绍。共有五个 版本 Edition : Fedora Workstation、Fedora Server、Fedora IoT、Fedora CoreOS 和 Fedora Silverblue。Fedora Linux 下载页面目前显示其中三个为 官方 版本,另外两个为 新兴 版本。本文将涵盖所有五个版本。

Fedora Workstation

如果你是笔记本电脑或台式计算机用户,则 Fedora Workstation 是适合你的操作系统。Fedora Workstation 非常易于使用。你可以用它满足日常工作、教育、爱好等需求。例如,你可以使用它创建文档,制作演示文稿,上网冲浪,处理图像,编辑视频等等。

这个 Fedora Linux 版本默认使用 GNOME 桌面环境。你可以使用这种环境舒适地工作和进行各种活动。你还可以根据个人喜好自定义 Fedora Workstation 的外观,让你在使用过程中更加舒适。如果你是 Fedora Workstation 的新用户,你可以阅读我之前的文章 在安装 Fedora Workstation 之后要做的事。通过该文章,你将更容易上手 Fedora Workstation。

更多信息请参阅以下链接:

Fedora Workstation

Fedora Server

许多公司需要自己的服务器来支持基础设施。Fedora Server 版操作系统配备了一个强大的基于 Web 的管理界面称为 Cockpit,具有现代化的外观。Cockpit 可以让你轻松查看和监控系统性能和状态。

Fedora Server 包含一些开源世界中的最新技术,并得到一个活跃的社区的支持。它非常稳定可靠。然而,并不保证 Fedora 社区中的任何人都能够在你遇到问题时提供帮助。如果你运行的是关键任务的应用程序,并且可能需要技术支持,你可能要考虑使用 Red Hat Enterprise Linux。

更多信息请访问以下链接:

Fedora Server

Fedora IoT

为物联网设备专门设计的操作系统越来越受欢迎。Fedora IoT 就是为了应对这一需求而创建的操作系统。Fedora IoT 是一个不可变操作系统,使用 OSTree 技术来进行原子更新。该操作系统专注于物联网设备的安全性,这非常重要。Fedora IoT 支持多种架构。它还配备了一个基于 Web 的配置控制台,因此可以在不需要键盘、鼠标或监视器物理连接到设备的情况下进行远程配置。

更多信息请访问以下链接:

Fedora IoT

Fedora CoreOS

Fedora CoreOS 是一个面向容器的操作系统。该操作系统用于在任何环境中安全可靠地运行应用程序。它设计用于集群,但也可以作为独立系统运行。该操作系统与 Linux 容器配置具有高度兼容性。

更多信息请访问以下链接:

Fedora CoreOS

Fedora Silverblue

这个版本是 Fedora Workstation 的一个变体,界面并没有太大区别。但是,Fedora Silverblue 是一个不可变的操作系统,采用以容器为中心的工作流程。这意味着每个安装的副本与同一版本的其他副本完全相同。其目标是使其更加稳定,更少出现错误,并更容易进行测试和开发。

更多信息请访问以下链接:

Fedora Silverblue

结论

Fedora Linux 的每个版本都有不同的目的。多个版本的可用性可以帮助你获得适合你需求的操作系统。本文讨论的 Fedora Linux 版本是在 Fedora Linux 的主要下载页面上提供的操作系统。你可以在 https://getfedora.org/ 找到下载链接和更完整的文档说明。

(题图:MJ/90ffba71-aee2-4429-a846-41f06997792c)


via: https://fedoramagazine.org/fedora-linux-editions-part-1-official-editions/

作者:Arman Arisman 选题:lkxed 译者:ChatGPT 校对:wxy

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