分类 系统运维 下的文章

systemd 内置了很多管理系统日志的功能。在本指南中,我们将介绍如何管理系统日志,并对其采取轮换、归档和清除日志等操作。我们还解释了手动系统日志清理方法和使用配置文件的变化。

如果你的 Linux 发行版支持 systemd,那么从启动时开始,它每秒钟都会从系统的所有进程和应用程序中收集日志。所有这些日志事件都由 systemd 的 journald 守护程序管理。journald 收集所有的日志(信息、警告、错误等),并将其作为二进制数据存储在磁盘文件中。

由于日志保留在磁盘中,而且每秒钟都在收集,所以它占用了巨大的磁盘空间;特别是对于旧的系统、服务器来说。例如,在我的一个运行了一年左右的测试系统中,日志文件的大小是 GB 级的。

如果你管理多个系统、服务器,建议一定要正确管理 journald 日志,以便高效运行。让我们来看看如何管理日志文件。

systemd 日志维护

使用 systemd 的 journalctl 工具,你可以查询这些日志,对其进行各种操作。例如,查看不同启动时的日志文件,检查特定进程或应用程序的最后警告和错误。如果你对这些不了解,我建议你在学习本指南之前先快速浏览一下此教程:使用 journalctl 查看和分析 systemd 日志(附实例) 》。

物理日记的日志文件在哪里?

systemd 的 journald 守护进程在每次启动时都会收集日志。这意味着,它根据启动情况对日志文件进行分类。

日志以二进制形式存储在路径 /var/log/journal,文件夹为机器 ID。

比如说:

日志文件位置的截图-1

日志文件位置的截图-2

另外,请记住,根据系统配置,运行时日志文件被存储在 /run/log/journal/。而这些在每次启动时都会被删除。

我可以手动删除日志文件吗?

你可以,但不要这样做。相反,请按照下面的说明,使用 journalctl 工具清除日志文件以释放磁盘空间。

systemd 的日志文件占用了多少磁盘空间?

打开一个终端,运行以下命令。

journalctl --disk-usage

这应该为你提供系统中的日志文件实际使用的数量。

journalctl 磁盘使用命令

如果你有一个图形化的桌面环境,你可以打开文件管理器,浏览路径 /var/log/journal,并检查属性。

systemd 日志清理过程

清理日志文件的有效方法应该是通过 journald.conf 配置文件来完成。正常情况下,即使 journalctl 提供了删除日志文件的工具,你也不应该手动删除这些文件。

让我们来看看如何 手动 删除它,然后我将解释 journald.conf 中的配置变化,这样你就不需要时不时地手动删除文件;相反,systemd 会根据你的配置自动处理它。

手动删除

首先,你必须 flushrotate 日志文件。 轮换 rotate 是将当前活动的日志文件归档,并立即开始创建一个新的日志文件继续记录日志。 冲洗 flush 开关要求日志守护进程将存储在 /run/log/journal/ 中的所有日志数据冲入 /var/log/journal/,如果持久性存储被启用的话。

然后,在 flushrotate 之后,你需要用 vacuum-sizevacuum-timevacuum-files 选项运行 journalctl 来强制 systemd 清除日志。

例 1:

sudo journalctl --flush --rotate
sudo journalctl --vacuum-time=1s

上面这组命令会删除所有存档的日志文件,直到最后一秒。这有效地清除了一切。因此,在运行该命令时要小心。

日志清理-例子

清理完毕后:

清理后--日志的占用空间

你也可以根据你的需要在 --vacuum-time 的数字后面提供以下后缀:

  • s:秒
  • m:分钟
  • h:小时
  • days:天
  • months:月
  • weeks:周
  • years:年

例 2:

sudo journalctl --flush --rotate
sudo journalctl --vacuum-size=400M

这将清除所有存档的日志文件,并保留最后 400MB 的文件。记住这个开关只适用于存档的日志文件,不适用于活动的日志文件。你也可以使用后缀,如下所示。

  • K:KB
  • M:MB
  • G:GB

例 3:

sudo journalctl --flush --rotate
sudo journalctl --vacuum-files=2

vacuum-files 选项会清除所有低于指定数量的日志文件。因此,在上面的例子中,只有最后两个日志文件被保留,其他的都被删除。同样,这只对存档的文件有效。

如果你愿意,你可以把两种选项结合起来,但我建议不要这样做。然而,如果同时使用两个选项,请确保先用 --rotate 选项运行。

使用配置文件自动删除

虽然上述方法很好,也很容易使用,但建议你使用 journald 配置文件来控制日志文件的清理过程,该文件存在于 /etc/systemd/journald.conf

systemd 为你提供了许多参数来有效管理日志文件。通过组合这些参数,你可以有效地限制日志文件所占用的磁盘空间。让我们来看看。

journald.conf 参数描述实例
SystemMaxUse指定日志在持久性存储中可使用的最大磁盘空间SystemMaxUse=500M
SystemKeepFree指定在将日志条目添加到持久性存储时,日志应留出的空间量。SystemKeepFree=100M
SystemMaxFileSize控制单个日志文件在被轮换之前在持久性存储中可以增长到多大。SystemMaxFileSize=100M
RuntimeMaxUse指定在易失性存储中可以使用的最大磁盘空间(在 /run 文件系统内)。RuntimeMaxUse=100M
RuntimeKeepFree指定将数据写入易失性存储(在 /run 文件系统内)时为其他用途预留的空间数量。RuntimeMaxUse=100M
RuntimeMaxFileSize指定单个日志文件在被轮换之前在易失性存储(在 /run 文件系统内)所能占用的空间量。RuntimeMaxFileSize=200M

如果你在运行中的系统的 /etc/systemd/journald.conf 文件中添加这些值,那么在更新文件后,你必须重新启动 journald。要重新启动,请使用以下命令。

sudo systemctl restart systemd-journald

核实日志文件

在你清理完文件后,检查日志文件的完整性是比较明智的。要做到这一点,请运行下面的命令。该命令显示了日志文件是否通过(PASS)、失败(FAIL)。

journalctl --verify

验证日志文件

总结

希望本指南能帮助你了解 systemd 日志管理流程的基本情况。通过这些,你可以通过限制空间、清除旧的日志文件来管理系统或服务器中的日志文件所使用的磁盘空间。这些只是指导性的命令,你可以通过多种方式组合这些命令来实现你的系统需求。


via: https://www.debugpoint.com/systemd-journald-clean/

作者:Arindam 选题:lkxed 译者:Chao-zhi 校对:wxy

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

在本指南中,你将学习如何在 virt-manager 的 KVM、QEMU 和 libvirt 的主机和客户机之间共享文件夹。

virt-manager 应用或软件包使用 libvirt 库来提供虚拟机管理服务。它有一个桌面界面,有助于创建、删除和管理多个虚拟机。

virt-manager 桌面界面及其组件为各种个人和商业场景提供了灵活的虚拟机管理服务。它是一个自由开源的应用,主要用于 KVM 虚拟机。然而,它也可以支持其他管理程序,如 Xen 和 LXC。

在之前的文章中,我解释了 如何使用 virt-manager 创建虚拟机。这篇文章介绍了如何在客户机和主机之间无缝访问文件和文件夹。

关于 virtiofs 的说明

共享文件和文件夹是由名为 virtiofs 的 libvirt 共享文件系统提供的。它提供了访问主机上的目录树的所有功能和参数。由于大多数 virt-manager 虚拟机的配置都被翻译成 XML,所以共享文件/文件夹也可以通过 XML 文件来指定。

在 virt-manager中共享文件夹

首先,确保你的客户机关闭了电源。在 virt-manager GUI 中,选择虚拟机,点击“ 打开 Open ”,弹出控制台设置。

打开设置

点击工具条上显示虚拟硬件细节的图标。然后点击左边面板上的“ 内存 Memory ”。

选择选项 “ 启用共享内存 Enable shared memory ”。点击应用。

启用共享内存选项

然后点击底部的 “ 添加硬件 Add hardware ”。

点击添加硬件

在添加新硬件的窗口中,从左边的面板上选择 “ 文件系统 File system ”。

然后在 “ 细节 Details ” 标签中选择 “ 驱动程序 Driver ” 为 “virtiofs”。点击 “ 浏览 Browse > 浏览本地 browse local ”,选择你想在客户机内访问的主机路径

在目标路径中,输入你想要的任何名字。这只是一个文件标签,将在挂载时使用。

所以,如果我想访问 Pictures/Screenshots 文件夹(/home/debugpoint/Pictures/Screenshots),示例设置可以是这样:

添加一个新的文件系统硬件

下面是上述配置的 XML 设置。你可以在 XML 标签中找到它。

<filesystem type="mount" accessmode="passthrough">
  <driver type="virtiofs"/>
  <binary path="/usr/libexec/virtiofsd"/>
  <source dir="/home/debugpoint/Pictures/Screenshots"/>
  <target dir="mount_tag_pictures"/>
  <alias name="fs1"/>
  <address type="pci" domain="0x0000" bus="0x08" slot="0x00" function="0x0"/>
</filesystem>

点击 “ 完成 Finish ”。在 virt-manager 主窗口中,右键点击虚拟机,点击运行,启动虚拟机。确保点击“ 显示图形控制台 show the graphical console ”(如果虚拟机没有显示,点击工具条上的监视器图标)。

在客户机中,创建一个你想挂载主机文件夹的文件夹。在这个例子中,我使用了 /mnt/pictures

sudo mkdir /mnt/pictures

最后,使用你在上述步骤中创建的标签将主机文件夹挂载到这个新文件夹。使用下面的命令在终端做这件事。确保根据你的系统改变下面命令中的标签和文件夹名称。

sudo mount -t virtiofs mount_tag_pictures /mnt/pictures

现在你可以在 virt-manager 中的主机和客户机之间的无缝地浏览文件夹和添加/删除项目。

从 virt-manager 客户机访问主机文件

总结

我希望这个方案能帮助你从客户机上访问主机文件和文件夹。记住,你的用户 ID,也就是用来启动 virt-manager 应用的用户,应该有同样的权限来访问主机文件夹。

如果你遇到任何错误,上述指南帮助了你,请在下面留言。


via: https://www.debugpoint.com/share-folder-virt-manager/

作者:Arindam 选题:lkxed 译者:geekpi 校对:wxy

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

systemd 的速度和易用性使其成为管理现代 Linux 系统的流行方式。

 title=

系统管理员知道,在一台运行着的现代计算机上会发生很多事情:应用程序在后台运行、预定事件等待在特定时间被触发、事件写入日志文件、发送状态报告。在以前,不同的进程可以通过一系列 Unix 工具,来进行有效地管理和监控。然而,现代的计算机运作更为复杂了:本地服务与容器化应用程序一同运行、能够轻松访问云及其运行的集群、实时进程、以及有比以往都多的数据。

拥有统一的管理方法不但是用户想要的,也是忙碌的系统管理员所迫切渴望的。为了完成这项重要的任务, 系统守护进程 system daemon systemd) 被开发出来,并迅速被所有主要的 Linux 发行版所采用了。

当然,systemd 并不是管理 Linux 系统的唯一方式,还有许多其他可供选择的初始化系统,包括 sysvinit、OpenRC、runit、s6 和 BusyBox,但 systemd 将 Linux 视为一个统一的数据集,意味着 systemd 能用强大的工具对 Linux 进行一致的操作和查询。对于忙碌的系统管理员和许多用户来说,systemd 的速度和易用性是一个重要的特性。有以下的五个原因。

启动管理

启动 Linux 计算机可能是一件非常罕见的事情。服务器的正常运行时间通常以 来计算,而不是月或周。笔记本电脑和台式机可能会频繁地关闭和启动,但更多的时候它们是被挂起或休眠了。无论哪种类型,最近一次开机的时刻都可用于检查一段时间内的计算机健康情况,因为当你在监视系统或诊断问题时,这一时刻能够限制查看的数据量大小,从而让你快速地找到问题所在。

如果你不记得上次启动计算机的时间,你可以使用 systemd 的日志记录工具 journalctl,来列出计算机的所有启动会话:

$ journalctl --list-boots
-42 7fe7c3... Fri 2020-12-04 05:13:59 - Wed 2020-12-16 16:01:23
-41 332e99... Wed 2020-12-16 20:07:39 - Fri 2020-12-18 22:08:13
[...]
-1 e0fe5f... Mon 2021-03-29 20:47:46 - Mon 2021-03-29 21:59:29
 0 37fbe4... Tue 2021-03-30 04:46:13 - Tue 2021-03-30 10:42:08

最近一次启动会话输出在结果列表的底部,因此你可以通过管道将输出传输到 tail,来查看最近一次启动会话。

左侧的数字(在本例中为 42、41、1 和 0)是每个启动会话的索引号。换句话说,如果你要查看某一特定启动会话的日志,你可以使用这个索引号作为参数。

日志检查

查看日志是推断系统信息的一种重要方法。日志提供了计算机运行的大部分事件的历史记录,这些记录都是在没有你直接监督的情况下生成的。通过日志,你可以知道某一服务何时启动、定时任务何时运行、哪些服务在后台运行、哪些事件运行失败等等信息。故障排除的初始步骤是使用 systemd 的 journalctl 来查看日志:

$ journalctl --pager-end

--pager-end 选项(简写为 -e)会从 journalctl 的输出末尾开始查看日志,因此要查看更早发生的日志,你需要向上滚动。

systemd 维护一个错误信息的“目录”,错误信息包含错误记录、可能的解决方案、支持论坛的链接和开发人员文档。这个错误信息的“目录”能为日志事件提供重要的上下文,否则它可能会成为海量日志中的一个令人困惑的信息,或者更糟的是,错误信息可能会完全被忽视。要将错误消息与日志中的解释性文本放在一起输出,你可以使用 --catalog 选项(简写为 -x):

$ journalctl --pager-end --catalog

要进一步限定日志输出,你可以指定要查看哪个启动会话的日志。因为每个启动会话都有索引,所以你可以使用 --boot 选项,来指定某个启动会话,并仅查看该启动会话的日志:

$ journalctl --pager-end --catalog --boot 42

你还可以查看特定 systemd 单元的日志。例如,要解决 SSH 服务的问题,你可以指定 --unit sshd 选项,来仅查看适用于 sshd 守护程序的日志:

$ journalctl --pager-end \
    --catalog --boot 42 \
    --unit sshd

服务管理

systemd 的第一个任务就是启动你的计算机,systemd 会迅速、高效且有效地执行这一任务。但 systemd 一直需要管理的任务是服务管理,因为 systemd 需要确保你要运行的服务确实在你的会话期间启动,并继续运行。systemd 的这一功能非常稳健,因为理论上即使是一个崩溃的服务也可以在没有你干预的情况下重新启动。

你可以通过使用 systemctl 命令来让 systemd 管理服务,并能查看定义服务的 单元文件 unit file

$ systemctl cat sshd
# /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.target
Wants=sshd-keygen.target

[Service]
Type=notify
EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

大多数单元文件都在 /usr/lib/systemd/system/ 目录下,但是你也可以用局部更改来修改配置,请使用以下的方式:

$ systemctl edit sshd

你可以通过 is-active 选项,来查看某一服务当前是否处于活动状态:

$ systemctl is-active sshd
active
$ systemctl is-active foo
inactive

同样地,你可以通过 is-failed 选项,来查看某一服务是否运行失败了。

$ systemctl is-failed sshd

使用以下命令,来启动或者停止某一服务:

$ systemctl stop sshd
$ systemctl start sshd

使用以下命令,让某一服务在开机时自启动:

$ systemctl enable sshd

添加 --now 选项,让某一服务在开机时启动并在当前会话中立即启动。

定时器管理

在以前,当你想在 Linux 上自动执行一项任务时,你可以使用的工具是 cron。如今,cron 命令仍能使用,但对于在 Linux 上自动执行一项任务,也有一些其他好用的替代方案。例如,anacron 命令 是一个多功能的、类似于 cron 的系统,它能够运行在停机期间可能会错过的任务。

计划的事件就是在特定时间需要激活的服务。systemd 管理一个名为 定时器 的工具,它类似 cron 的功能。你可以使用以下命令,来列出活动中的定时器:

$ systemctl list-timers
NEXT                          LEFT      
Tue 2021-03-30 12:37:54 NZDT  16min left [...]
Wed 2021-03-31 00:00:00 NZDT  11h left [...]
Wed 2021-03-31 06:42:02 NZDT  18h left [...]

3 timers listed.
Pass --all to see loaded but inactive timers, too.

你可以使用以下命令,来像启用服务一样启用定时器:

$ systemctl enable myMonitor.timer

目标管理

目标 target 是 systemd 的最后一个主要组成部分。像服务和定时器一样,目标也是一个单元文件,也可以以相同的方式启动和启用。目标的独特之处在于它们可以将其他单元文件任意分组。例如,你可能希望开机启动到文本控制台界面而不是图形桌面,因此有一个 multi-user 目标。但是,multi-user 目标只是没有包括桌面单元文件的 graphical 目标。

简而言之,目标是一种将服务、定时器甚至其他的目标集合在一起,以表示机器的预期状态的简单方法。

事实上,在 systemd 中,重启、关机或关闭操作只是一个目标而已。

你可以使用 list-unit-files 选项,用 --type 选项将其限制为 target 来列出所有可用的目标:

$ systemctl list-unit-files --type target

使用 systemd 对计算机进行控制管理

现代的 Linux 使用 systemd 进行服务管理和日志检查。从个人的 Linux 系统到企业服务器,systemd 都能提供有效的监控,并且十分易于维护。你越频繁地使用 systemd,systemd 对你而言就会变得越容易预测和直观,你就会明白系统的不同部分是如何相互关联的。

为了更好地熟悉 systemd,请现在就开始使用它吧。请 下载关于 systemd 相关命令的备忘录,你可以在实际使用 systemd 中经常参考这个备忘录,这样你就能更快熟悉使用 systemd 啦!


via: https://opensource.com/article/21/4/sysadmins-love-systemd

作者:Seth Kenlon 选题:lujun9972 译者:chai001125 校对:wxy

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

通过安全的网络连接在远程计算机上调用命令或程序。

有一天,我正在测试如何在 将文件或目录复制到多个位置和系统时保持完整的文件权限。当我想检查远程系统上的文件权限时,我必须通过 SSH 登录它并检查属性。从远程系统多次登录和注销的过程让我有点烦,我想,如果我可以在远程 Linux 系统上通过 SSH 执行命令就好了。

幸运的是,在浏览了 ssh 命令的手册页后,我找到了一个解决办法。

如果你想知道如何本地运行远程系统上运行命令或脚本,而不登录到远程系统,下面的内容会告诉你如何做。

1、通过 SSH 在远程 Linux 系统上执行命令

从本地系统通过 SSH 在远程系统上运行命令或脚本的典型方法是:

$ ssh <username@IP_Address-or-Doman_name> <Command-or-Script>

允许我给你们举几个例子:

1.1、通过 SSH 在远程系统上运行单个命令

假设你想要 查找远程 Linux 系统的内核详细信息。为此,只需运行:

$ ssh [email protected] uname -a

这里,

  • sk 是远程系统的用户名,
  • 192.168.225.22 是远程系统的 IP 地址,
  • uname -a 是我想在远程系统上运行的命令。

示例输出:

通过 SSH 在远程 Linux 系统上执行命令

看到没?我并没有实际登录到远程系统,但通过 SSH 在远程系统上执行了 uname 命令,并在本地系统的终端上显示了输出。

你还可以像下面这样用引号指定命令。

$ ssh [email protected] "uname -a"

或者,

$ ssh [email protected] 'uname -a'

如果你已经 更改了 SSH 协议的默认端口,只需使用 -p 参数指定它。

$ ssh -p 2200 [email protected] uname -a

1.2、通过 SSH 在远程主机上执行多个命令

你还可以在远程主机上运行多个命令,方法是将它们放在引号中。

$ ssh [email protected] "uname -r && lsb_release -a"

或者:

$ ssh [email protected] "uname -r ; lsb_release -a"

上面的命令将显示我的 Ubuntu 服务器的内核版本和发行版详细信息。

示例输出:

在 Linux 上通过 SSH 在远程主机上运行多个命令

正如一位读者在下面的评论部分提到的那样,你应该用引号指定多个命令。如果不使用引号,第一个命令将在远程系统上执行,第二个命令将仅在本地计算机上执行。整个带引号的命令将按预期在远程计算机上运行。

提示: 了解 &&; 在命令中的区别:

&& 操作符只有在第一个命令成功时才执行第二个命令。

示例:

sudo apt-get update && sudo apt-get upgrade

在上述示例中,如果第一个命令成功,才会执行 sudo apt-get upgrade。否则,它将不会运行。

; 操作符会执行第二个命令,无论第一个命令是成功还是失败。

示例:

sudo apt-get update ; sudo apt-get upgrade

在上述示例中,即使第一个命令失败,sudo apt-get upgrade 也会执行。

1.3、通过 SSH 在远程机器上调用有 sudo 权限的命令

有些命令需要 sudo 权限才能运行。例如,以下命令将在我的远程系统上安装 apache2

$ ssh -t [email protected] sudo apt install apache2

示例输出:

通过 SSH 在远程机器上运行有 Sudo 权限的命令

注意到了吗?我在上面的命令中使用了 -t 标志,我们需要使用它来强制进行伪终端分配。它用于在远程机器上执行任意基于屏幕的程序,这非常有用。例如,在实现菜单服务时。

另外,我输入了两次密码。第一次是远程用户的密码,以便从本地系统通过 SSH 访问远程系统,第二次是为了向远程用户赋予 sudo 权限,以便安装应用程序(在本例中为 apache2)。

让我们用以下命令检查 Apache 服务是否正在运行:

$ ssh -t [email protected] sudo systemctl status apache2
[email protected]'s password: 
[sudo] password for sk: 
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Drop-In: /lib/systemd/system/apache2.service.d
└─apache2-systemd.conf
Active: active (running) since Thu 2019-12-19 11:08:03 UTC; 52s ago
Main PID: 5251 (apache2)
Tasks: 55 (limit: 2318)
CGroup: /system.slice/apache2.service
├─5251 /usr/sbin/apache2 -k start
├─5253 /usr/sbin/apache2 -k start
└─5254 /usr/sbin/apache2 -k start

Dec 19 11:08:03 ubuntuserver systemd[1]: Starting The Apache HTTP Server...
Dec 19 11:08:03 ubuntuserver apachectl[5227]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 2409:4072:51f:a1b6:a00:27ff:f
Dec 19 11:08:03 ubuntuserver systemd[1]: Started The Apache HTTP Server.

同样的,我们可以通过 SSH 在本地系统上运行远程系统上的任何命令或脚本。

1.4、通过 SSH 在远程系统上运行本地脚本

让我们在本地系统上创建一个简单的脚本来显示关于远程系统的发行版名称、包管理和基本细节等。

$ vi system_information.sh

添加以下行:

#!/bin/bash
#Name: Display System Details
#Owner: OSTechNIx
#----------------------------
echo /etc/*_ver* /etc/*-rel*; cat /etc/*_ver* /etc/*-rel*

按下 ESC 键,输入 :wq 保存退出。

现在,通过 SSH 命令在远程系统上运行这个脚本:

$ ssh [email protected] 'bash -s' < system_information.sh

示例输出:

[email protected]'s password: 
/etc/debian_version /etc/lsb-release /etc/os-release
buster/sid
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.2 LTS"
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

如果你没有在上面的命令中指定 bash -s,你将获得远程系统的详细信息,但伪终端不会被分配。

1.5、将远程主机的命令输出保存到本地主机

如果你希望与支持团队或同事共享远程系统上运行的命令输出,那么这非常有用。

以下命令将通过 SSH 在远程系统运行 du -ah,并将输出保存在本地系统的 diskusage.txt 文件中。

$ ssh [email protected] du -ah > diskusage.txt

然后,你可以通过使用 cat 命令或文本编辑器查看 diskusage.txt 文件来分析磁盘使用细节。

$ cat diskusage.txt 
4.0K ./.profile
4.0K ./.gnupg/private-keys-v1.d
8.0K ./.gnupg
76K ./data/image.jpg
128K ./data/file.pdf
20K ./data/text.docx
5.9M ./data/audio.mp3
6.1M ./data
0 ./.sudo_as_admin_successful
4.0K ./pacman?inline=false
4.0K ./.bash_logout
4.0K ./.wget-hsts
4.0K ./.bash_history
0 ./.cache/motd.legal-displayed
4.0K ./.cache
4.0K ./deb-pacman_1.0-0.deb
4.0K ./.bashrc
6.2M .

1.6、配置 SSH 密钥认证,避免输入密码

如果你经常在远程系统上运行命令,你可能需要配置基于 SSH 密钥的身份验证,以便每次跳过密码输入。更多细节可以在以下链接中找到。

Linux 系统下如何配置 SSH 密钥认证

配置了基于 SSH 密钥的认证后,我们可以通过 SSH 在远程机器上执行命令,从而不需要输入密码:

$ ssh [email protected] sudo apt update

2、通过 sshpass 在远程机器上运行命令

如果你不想配置基于 SSH 密钥的身份验证,你可以使用 sshpass 实用程序。

2.1、什么是 sshpass?

sshpass 是为使用键盘交互密码身份验证模式运行 ssh 而设计的,但它以非交互的方式。简单来说,sshpass 提供了非交互式的方式来验证 SSH 会话。

SSH 使用直接 TTY 访问来确保密码确实是由交互式键盘用户发出的。sshpass 在一个专用 tty 中运行 SSH,让它误以为从交互用户那里获得了密码。

2.2、在 Linux 中安装 sshpass

在许多 Linux 发行版的默认仓库中都有 sshpass 实用程序。例如,在 Debian、Ubuntu 及其衍生版本中,你可以使用下面的命令来安装 sshpass

$ sudo apt install sshpass

2.3、通过 SSH 和 sshpass 在远程机器上执行命令

sshpass 可以通过参数接受密码,或者通过环境变量读取密码,也可以从文本文件中读取密码。

警告: 所有这些方法都是 高度不安全的。所有系统用户都可以通过 ps 命令看到命令中的密码。不建议在生产中使用这些方法。最好使用基于密钥的身份验证。

让我们看看每种方法的示例。

将密码作为参数提供

将密码作为参数提供,使用 -p 选项,如下所示:

$ sshpass -p <remote-password> ssh remoteuser@ip-address <command-to-execute>

示例输出:

$ sshpass -p ubuntu ssh [email protected] uname -a

其中,

  • -p ubuntu - 提供远程系统的密码。
  • [email protected] - 远程系统用户名和地址。
  • uname -a - 要在远程计算机上执行的命令。

示例输出:

Linux Ubuntu22CT 5.15.60-1-pve #1 SMP PVE 5.15.60-1 (Mon, 19 Sep 2022 17:53:17 +0200) x86_64 x86_64 x86_64 GNU/Linux
密码作为环境变量提供

在这个方法中,我们声明一个名为 SSHPASS 的环境变量,用远程环境的密码作为其值。然后我们使用 -e 标志,如下所示:

$ SSHPASS=ubuntu sshpass -e ssh [email protected] uname -a
从文本文件中读取密码

使用 echo 命令在文本文件中追加密码:

$ echo "ubuntu" > mypassword.txt

现在,将密码文件传递给带有 -f 标志的 sshpass,如下所示:

$ sshpass -f mypassword.txt ssh [email protected] uname -a

通过 SSH 和 sshpass 在远程机器上执行命令

总结

在本教程中,我们学习了一些通过安全的网络连接在远程计算机上调用命令或程序的方法。在所有的方法中,sshpass 方法是最不安全的,建议用户避免在生产系统中使用它。


via: https://ostechnix.com/execute-commands-on-remote-linux-systems-via-ssh/

作者:sk 选题:lkxed 译者:MjSeven 校对:wxy

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

本文介绍我使用 Terraform 五年之后吸取到的经验。

 title=

使用 Terraform 五年的经历让我吸取到一些重要经验。无论团队大小、项目性质,有五条要点对于配置合乎逻辑且可用的 Terraform 平台至关重要。

1、了解你的目标受众

这一点似乎显而易见,但我也见过一些在这方面犯错的案例。当组织和规划 Terraform 的相关代码时,无论是将目录结构标准化还是确定命名规范,考虑目标受众是非常重要的。例如:你的团队是否会使用这些 Terraform 脚本和模块?你是否会向其他团队交接工作?你的团队是否会有新成员加入?你是否正在独自进行项目开发?你是否会半年或一年后仍然使用这些配置,还是会将它安排给别人?

这类问题会影响某些决策。理想情况下,无论如何都应该有 远程状态 Remote State 状态锁定 State Locking 两种状态。远程状态确保你的笔记本电脑不是你的 Terraform 唯一运行的机器,状态锁定确保同一时刻只有一个人对基础设施进行修改操作。

命名规范应该对项目的最终拥有者有意义,而不是只对开发团队有意义。如果项目会转交给其他团队,应该确保他们对命名规范有发言权。如果代码由非技术的利益相关者或内部安全/ GCR 团队负责审查,应该确保他们会检查命名规范。另外,对于资源名称,为了让代码审查人员更仔细地进行检查,你应该使用资源标签,把有关的数据分类/隐私需求(高、中、低)标示出来。

2、重用,重用,重用

Terraform 注册表 为大多数普通用例提供了现成模块类库。我已经使用过 VPC 模块和安全模块中的大量功能,这些功能只需要提供相关的参数就能使用。使用不同的参数,简单调用这些模块对于处理大部分用例已经足够了。尽可能多地重用这些公共模块,可以避免大量且重复的编码、测试、检查、修复、重构等操作。

我也发现,基于使用或变更的频率划分模块和资源大有好处。例如,只使用一次的基础设施手脚架,例如 VPC 相关设置、安全模块、路由表、VPC 端点等,可以放在一起。但是像私有托管域条目、自动伸缩模块、目标模块、负载均衡器等,每次部署时都会变化,所以把这些与一次性的基础设施手脚架分离开来,会令代码检查更方便,调试更快速。

3、要明确,而非隐含

Terraform 代码中有一些常见的模式,它会导致设计中出现错误的假设。团队可以假设用来写代码的 Terraform 版本永远保持不变,外部模块不会变化,或它们使用的提供者不会变更。当这些外部依赖不可避免地发生变化时,就会导致一些难以发现的问题。

无论何处(包括主要的 Terraform 组、提供者组、功能模块组)都要确保定义是明确的。事先定义版本,可以确保依赖库是固定的,因此你可以在讨论、审查、测试后,明明白白地更新依赖关系。

4、自动化每一处,包括笔记本电脑、共享虚拟机、CI/CD。

在部署的各个阶段使用自动化方法,可以避免可能发生的问题。

在你提交代码前,使用 Git 预提交钩子 运行 terraform fmtterraform validate。预提交钩子的作用是确保你的代码满足最低程度的格式和语法正确。把这个预提交文件检入到仓库,对你的团队成员都有好处。项目的第一步就进行质量控制相关的操作,它虽然表面上是小事一桩,但也很重要,能为项目节省大量时间。

一切现代化部署工具都有 CI 流程。当你向原始仓库推送代码时,可以使用它来运行 SAST 和单元测试工具。我写过一篇 博客,是关于使用 Checkov 测试 Terraform 代码的安全性和合规性,并为组织特定的惯例创建自定义检查。把这些单元测试工具加入到你的 CI 管道,可以改进代码质量和健壮性。

5、写个好的 README.md 文件

我们都认为 Terraform 代码是自文档化的。的确如此,但是只有当未来的团队已经了解你的公司的命名规范、开发指南、机密通信、圈内笑话,以及你的仓库内除有效的 Terraform 代码之外其他所有东西,才会如此。维护 README.md 文件是个好习惯,它能节省大量时间,而且团队成员要为自己向 README 文件提交的任何内容负责,这样也就确保团队成员的忠诚度。

你的 README 文件至少应该包含在你的工作环境下(Linux、 Windows、Mac 等等)初始化 Terraform 环境的步骤,包括 Terraform 的版本信息。它应当确定需要的依赖库(Checkov、 TerraGrunt 及其他依赖)和其版本,以及团队使用的方便的 Linux 别名(例如有人喜欢将 terraform fmt 简写为 tff)。最重要的是,需要确定分支和 PR 审核策略和流程、命名规范和资源标签的相关标准。

README 文件需要通过这样的检验:如果团队有新成员加入,能否告诉他们做什么以及如何正确地完成工作?如果不能,在后续的几个月内,你将面对的是无休止的标准和流程讨论会议。

结束语

这些就是我使用 Terraform 多年后,认为需要传授给大家的五条有用的建议。也欢迎你分享自己的最佳实践。


via: https://opensource.com/article/21/8/terraform-tips

作者:Ayush Sharma 选题:lujun9972 译者:cool-summer-021 校对:wxy

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

在这篇文章中,我们将介绍如何在 Ubuntu 服务器 22.04 上设置静态 IP 地址。

强烈建议在 Linux 服务器上使用静态 IP,因为它会在重启后保持不变。静态 IP 对邮件服务器、Web 服务器和文件服务器等服务器起着重要作用。

准备条件

  • 最小安装的 Ubuntu 服务器 22.04
  • 具有 sudo 管理员权限的普通用户

在 Ubuntu 服务器 22.04 中,网络由 netplan 程序控制,因此我们将使用 netplan 在 Ubuntu 服务器上配置静态 IP 地址。

注意:我们不能使用 nmcli 程序,因为它不是 Ubuntu 服务器上默认安装的一部分。

在 Ubuntu 服务器 22.04 上设置静态 IP 地址

登录到你的 Ubuntu 服务器 22.04,查找 netplan 配置文件。它位于 /etc/netplan 目录下。

$ cd /etc/netplan/
$ ls -l
total 4
-rw-r--r-- 1 root root 116 Oct 12 04:03 00-installer-config.yaml
$

运行以下 cat 命令以查看 00-installer-config.yaml 的内容。

注意:配置文件的名称可能因你的设置而异。由于它是一个 yaml 文件,因此请确保在编辑时保持缩进和语法。

$ cat 00-installer-config.yaml

输出:

Default-Content-netplan-ubuntu-server

根据上面的输出,它说我们有 ens33 接口,它正在从 DHCP 服务器获取 IP。查看接口名称的另一种方法是通过 ip 命令。

现在,要配置静态 IP 代替 DHCP,使用 vinano 编辑器编辑 netplan 配置文件并添加以下内容。

$ sudo vi 00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
  renderer: networkd
  ethernets:
    ens33:
      addresses:
        - 192.168.1.247/24
      nameservers:
        addresses: [4.2.2.2, 8.8.8.8]
      routes:
        - to: default
          via: 192.168.1.1
  version: 2

保存并关闭文件。

Updated-Netplan-Config-File-Content-Ubuntu-Server

在上面的文件中,我们使用了以下内容,

  • ens33 为接口名称
  • 用于设置静态 IP 的地址
  • nameservers 用于指定 DNS 服务器的 IP
  • 用于指定默认网关的路由

注意:根据你的环境更改 IP 详细信息和接口名称。

要是上述修改生效,请使用以下 netplan 命令应用这些更改:

$ sudo netplan apply

运行以下 IP 命令查看接口上的 IP 地址:

$ ip addr show ens33

要查看默认路由,请运行:

$ ip route show

上述命令的输出。

ip-addr-route-command-output-ubuntu-server

完美,以上命令的输出确认静态 IP 和路由配置成功。

这就是这篇文章的全部内容。请在下面的评论部分发表你的问题和反馈。


via: https://www.linuxtechi.com/static-ip-address-on-ubuntu-server/

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

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