分类 技术 下的文章

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 时表示执行成功,没有问题。代码 10 以外的任何代码都被视为不成功。

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

Linux Shell 中的各种退出码

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

退出码解释
0命令成功执行
1通用错误代码
2命令(或参数)使用不当
126权限被拒绝(或)无法执行
127未找到命令,或 PATH 错误
128+n命令被信号从外部终止,或遇到致命错误
130通过 Ctrl+CSIGINT 终止(终止代码 2 或键盘中断
143通过 SIGTERM 终止(默认终止
255/*退出码超过了 0-255 的范围,因此重新计算(LCTT 译注:超过 255 后,用退出码对 256 取模)
? 130SIGINT^C)和 143SIGTERM)等终止信号是非常典型的,它们属于 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,表示你是在没有权限的情况下运行 apt100 不是标准错误码,而是 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 包括所有类型的终止代码,如 SIGTERMSIGKILL 等。

退出码 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 会变成 0257 会变成 1383 会变成 127,以此类推。为确保更好的兼容性,请将退出码保持在 0255 之间。

结语

希望你对 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 设置一个构建系统 的后续文章。

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

首先克隆 这个仓库,用 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 目标目录

例如,在这里,我将两个名为 IFLU 的目录复制到 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 文件夹复制到你的主目录。
  • 删除 secretscopy_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中国 荣誉推出