作为一位 Linux 管理员，你需要跟踪所有用户的活动。当服务器发生故障时，你可以分析和查看用户活动，以便寻找问题的根源。监控 Linux 用户有多种方式。本指南将专门讨论 GNU 记账工具，这是一项用于监视 Linux 用户活动的实用工具。什么是记账工具？记账工具可以提供诸如 Linux 系统中的连接、已执行的程序以及系统资源的使用等有底系统使用信息。这些记账工具可以通过 psacct 或 acct 软件包安装。psacct 和 acct 实际上是相同的。在基于 RPM 的系统中，它以 psacct 的形式存在；而在基于 DEB 的系统中，它作为 acct 提供。你可能想知道 psacct 或 acct 工具的作用。通常，用户在命令行的历史记录会保存在他们的 $HOME 目录下的 .bash_history 文件中。有些用户可能会尝试编辑、修改或删除这些历史记录。然而，即使他们完全 清除了命令行历史，记账工具依然能够获取用户活动信息。这是因为，所有进程记账文件都由 root 用户拥有，而普通用户则无法进行编辑。Linux 中如何安装 psacct 或 acctpsacct/acct 被打包在多种流行的 Linux 发行版本中。如果要在 Alpine Linux 中安装 psacct，请运行以下命令：$ sudo apk add psacct 如果在 Arch Linux 及其变体版本（如 EndeavourOS 和 Manjaro Linux）中安装 acct，请运行以下命令：$ sudo pacman -S acct 在 Fedora、RHEL 及其衍生版本（如 CentOS、AlmaLinux 和 Rocky Linux）中安装 psacct，请运行以下命令：$ sudo dnf install psacct 在 RHEL 6 以及更早版本中，你应当使用 yum 命令而非 dnf 来安装 psacct。$ sudo yum install psacct 在 Debian、Ubuntu 以及 Linux Mint 中，通过如下命令来安装 acct：$ sudo apt install acct 若在 openSUSE 中安装 acct，则运行：$ sudo zypper install acct 启动 psacct/acct 服务要启用并开启 psacct 服务，请执行以下命令：$ sudo systemctl enable psacct 接着启动 psacct 服务：$ sudo systemctl start psacct 如果你需要检查 psacct 服务是否已加载和激活，可以运行：$ sudo systemctl status psacct 在基于 DEB 的系统中，安装完成之后，acct 服务会自动启动。如果你想验证 acct 服务是否已经启动，可以执行以下命令：$ sudo systemctl status acct ● acct.service - Kernel process accounting Loaded: loaded (/lib/systemd/system/acct.service; enabled; vendor preset: enabled) Active: active (exited) since Thu 2022-10-13 16:06:35 IST; 28s ago Docs: man:accton(8) Process: 3241 ExecStart=/usr/sbin/accton /var/log/account/pacct (code=exited, status=0/SUCCESS) Main PID: 3241 (code=exited, status=0/SUCCESS) CPU: 879us Oct 13 16:06:35 ubuntu2204 systemd[1]: Starting Kernel process accounting... Oct 13 16:06:35 ubuntu2204 accton[3241]: Turning on process accounting, file set to '/var/log/account/pacct'. Oct 13 16:06:35 ubuntu2204 systemd[1]: Finished Kernel process accounting. 利用 psacct 或 acct 来监测 Linux 中的用户活动psacct（进程记账）软件包包含以下用来监测用户和进程活动的工具：ac - 提供用户登录时间的统计信息。lastcomm - 展示先前执行过的命令的信息。accton - 开启或关闭进程记账。dump-acct - 把 accton 的输出文件转化为易读的格式。dump-utmp - 以易读的方式打印 utmp 文件。sa - 汇总信息，关于先前执行的命令。现在就让我们一起了解如何通过每个工具来监控 Linux 用户的活动。1、使用 ac 命令ac 工具可以为你提供以小时为单位的连接时间报告，这样你就能知道用户或一组用户连接到系统的时长。1.1、展示所有用户的总连接时间$ ac 上述命令会显示所有用户的总连接时间（单位为小时）。total 52.91 1.2、按日期排序显示所有用户的总连接时间你可以通过使用 -d 参数，按日期排序显示所有用户的连接时间，操作如下：$ ac -d 示例输出：May 11 total 4.29 May 13 total 3.23 May 14 total 7.66 May 15 total 8.97 May 16 total 0.52 May 20 total 4.09 May 24 total 1.32 Jun 9 total 15.18 Jun 10 total 2.97 Jun 22 total 2.61 Jul 19 total 1.95 Today total 0.29 1.3、获取各个用户的总连接时间使用 -p 参数，你可以查看每位用户各自在系统中总的连接时长。$ ac -p 示例输出：ostechnix 52.85 root 0.51 total 53.36 1.4、显示指定用户的总连接时间你还可以显示特定用户的总登录时间。$ ac ostechnix 示例输出：total 52.95 1.5、显示特定用户各日期的总连接时间要按日期查看某个用户的登录时间，可以运行：$ ac -d ostechnix 示例输出：May 11 total 4.29 May 13 total 3.23 May 14 total 7.66 May 15 total 8.97 May 16 total 0.01 May 20 total 4.09 May 24 total 1.32 Jun 9 total 15.18 Jun 10 total 2.97 Jun 22 total 2.61 Jul 19 total 1.95 Today total 0.68 如需更多详情，可参考手册页面。$ man ac 2、lastcomm 命令使用示例lastcomm 工具用于列出过去执行过的命令，它会按执行的最近程度将命令列在前面。2.1、展示过去执行的命令$ lastcomm 示例输出：systemd-hostnam S root __ 0.06 secs Thu Oct 13 17:21 systemd-localed S root __ 0.06 secs Thu Oct 13 17:22 bash F ostechni pts/1 0.00 secs Thu Oct 13 17:22 awk ostechni pts/1 0.00 secs Thu Oct 13 17:22 bash F ostechni pts/1 0.00 secs Thu Oct 13 17:22 uname ostechni pts/1 0.00 secs Thu Oct 13 17:22 bash F ostechni pts/1 0.00 secs Thu Oct 13 17:22 sed ostechni pts/1 0.00 secs Thu Oct 13 17:22 bash F ostechni pts/1 0.00 secs Thu Oct 13 17:22 bash F ostechni pts/1 0.00 secs Thu Oct 13 17:22 grep ostechni pts/1 0.00 secs Thu Oct 13 17:22 bash F ostechni pts/1 0.00 secs Thu Oct 13 17:22 bash F ostechni pts/1 0.00 secs Thu Oct 13 17:22 grep ostechni pts/1 0.00 secs Thu Oct 13 17:22 bash F ostechni pts/1 0.00 secs Thu Oct 13 17:22 bash F ostechni pts/1 0.00 secs Thu Oct 13 17:22 [...] 2.2、打印特定用户先前执行的命令上述命令显示的是所有用户的命令。要显示特定用户以前执行的命令，可以使用下面的命令：$ lastcomm ostechnix 示例输出：less ostechni pts/1 0.00 secs Thu Oct 13 17:26 lastcomm ostechni pts/1 0.00 secs Thu Oct 13 17:26 lastcomm ostechni pts/1 0.00 secs Thu Oct 13 17:26 lastcomm ostechni pts/1 0.00 secs Thu Oct 13 17:26 gdbus X ostechni __ 0.00 secs Thu Oct 13 17:24 lastcomm ostechni pts/1 0.00 secs Thu Oct 13 17:24 ac ostechni pts/1 0.00 secs Thu Oct 13 17:24 update-notifier F ostechni __ 0.00 secs Thu Oct 13 17:23 apport-checkrep ostechni __ 0.06 secs Thu Oct 13 17:23 apport-checkrep ostechni __ 0.05 secs Thu Oct 13 17:23 systemctl ostechni __ 0.00 secs Thu Oct 13 17:23 apt-check ostechni __ 0.81 secs Thu Oct 13 17:23 dpkg ostechni __ 0.00 secs Thu Oct 13 17:23 ischroot ostechni __ 0.00 secs Thu Oct 13 17:23 dpkg ostechni __ 0.00 secs Thu Oct 13 17:23 [...] 2.3、打印特定命令的执行次数你还可以查看特定命令被执行的次数。$ lastcomm apt 示例输出：apt S root pts/2 0.70 secs Thu Oct 13 16:06 apt F root pts/2 0.00 secs Thu Oct 13 16:06 apt F root pts/2 0.00 secs Thu Oct 13 16:06 如上述输出所示，root 用户执行了 apt 命令三次。更详细的信息，可参考手册页：$ man lastcomm 3、sa 命令示例sa 实用程序将总结关于先前执行的命令的信息。3.1、打印所有命令的总结$ sa 示例输出：1522 1598.63re 0.23cp 0avio 32712k 139 570.90re 0.05cp 0avio 36877k ***other* 38 163.63re 0.05cp 0avio 111445k gdbus 3 0.05re 0.04cp 0avio 12015k apt-check 27 264.27re 0.02cp 0avio 0k kworker/dying* 2 51.87re 0.01cp 0avio 5310464k Docker Desktop 5 0.03re 0.01cp 0avio 785k snap-confine 8 59.48re 0.01cp 0avio 85838k gmain 5 103.94re 0.01cp 0avio 112720k dconf worker 24 3.38re 0.00cp 0avio 2937k systemd-udevd* 7 0.01re 0.00cp 0avio 36208k 5 3 1.51re 0.00cp 0avio 3672k systemd-timedat 2 0.00re 0.00cp 0avio 10236k apport-checkrep 2 0.01re 0.00cp 0avio 4316160k ThreadPoolForeg* 2 0.00re 0.00cp 0avio 8550k package-data-do 3 0.79re 0.00cp 0avio 2156k dbus-daemon 12 0.00re 0.00cp 0avio 39631k ffmpeg [...] 3.2、查看进程数量和 CPU 分钟数要打印基于每个用户的进程数量和 CPU 分钟数，运行带 -m 标志的 sa 命令：$ sa -m 示例输出：1525 1598.63re 0.23cp 0avio 32651k root 561 647.23re 0.09cp 0avio 3847k ostechnix 825 780.79re 0.08cp 0avio 47788k gdm 117 13.43re 0.06cp 0avio 63715k colord 2 52.01re 0.00cp 0avio 89720k geoclue 1 1.01re 0.00cp 0avio 70608k jellyfin 12 0.00re 0.00cp 0avio 39631k man 1 0.00re 0.00cp 0avio 3124k kernoops 4 104.12re 0.00cp 0avio 3270k sshd 1 0.05re 0.00cp 0avio 3856k whoopsie 1 0.00re 0.00cp 0avio 8552k 3.3、打印用户 ID 和命令名称对于账户文件中的每个命令，使用 -u 标志打印用户 ID 和命令名称。$ sa -u 示例输出：root 0.00 cpu 693k mem 0 io accton root 0.00 cpu 3668k mem 0 io systemd-tty-ask root 0.00 cpu 3260k mem 0 io systemctl root 0.01 cpu 3764k mem 0 io deb-systemd-inv root 0.00 cpu 722k mem 0 io acct.postinst root 0.00 cpu 704k mem 0 io rm root 0.00 cpu 939k mem 0 io cp root 0.00 cpu 704k mem 0 io rm root 0.00 cpu 951k mem 0 io find root 0.00 cpu 911k mem 0 io gzip root 0.00 cpu 722k mem 0 io sh root 0.00 cpu 748k mem 0 io install-info root 0.00 cpu 911k mem 0 io gzip [...] 如需更多详细信息，请参考手册页：$ man sa 4、dump-acct 和 dump-utmp 命令dump-acct 实用工具将 accton 格式的输出文件显示为人类可读的格式。$ dump-acct /var/account/pacct dump-utmp 将 utmp 文件显示为人类可读的格式。$ dump-utmp /var/run/utmp 如需了解更多详情，请参考手册页：$ man dump-acct $ man dump-utmp 5、accton 命令accton 命令将允许你开启或关闭记账。要开启进程记账，请运行：$ accton on 要关闭它，运行：$ accton off 如需了解更多详情，请参考手册页：$ man accton 总结每个 Linux 管理员都应该知道 GNU 记账实用程序，以便注意所有用户的行为。在故障排除时，这些实用程序会非常有帮助。资源GNU 记账实用程序官网（题图：MJ/da3f7e79-2a53-4121-a2ed-d63a22c3d3f4）via: https://ostechnix.com/monitor-user-activity-linux/作者：sk 选题：lkxed 译者：ChatGPT 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
Ventoy 是一个自由开源和跨平台的程序，可以在 Linux、macOS 和微软的 Windows 中创建多重引导的 U 盘。你不必周而复始地格式化你的 USB 设备，只需创建一次可引导的 U 盘即可，如有需要可在将来添加你想要的 ISO。你甚至可以创建子文件夹，例如 Linux ISO、Windows ISO，并把各自的 ISO 文件放在相应的文件夹里。Ventoy 会自动为新添加的 ISO 生成菜单条目，并将它们添加到启动菜单中。一旦你创建完多重引导的 U 盘，使用它启动你的系统，选择你想加载的 ISO，马上就可以使用它。就是如此简单！功能Ventoy 有很多有用的功能，如：非常容易安装和使用。快速（仅受限于复制 ISO 文件的速度）。你不需要解压缩 ISO 文件。直接从 ISO 文件启动即可。可被安装在 U 盘／本地硬盘／SSD 盘／NVMe 盘／SD 卡中。它支持 传统 Legacy BIOS、IA32 UEFI、x86\_64 UEFI、ARM64 UEFI、MIPS64EL UEFI 等（LCTT 译注：这些英文缩写都是代表了不同的 CPU 架构。如 IA32 是指英特尔 32 位体系架构，x86\_64 指基于 x86 架构的 64 位扩展架构，ARM64 则是 ARM 体系结构的 64 位扩展、MIPS64EL 是指 64 位小端序的 MIPS 架构）。支持 IA32／x86\_64 UEFI 的安全启动。支持主分区使用 FAT32/exFAT/NTFS/UDF/XFS/Ext2/Ext3/Ext4 格式。默认使用 exFAT。支持在物理机中使用 Linux 发行版启动 vhd、vdi、raw 等格式的虚拟磁盘文件。持久化的存储支持。支持 MBR 和 GPT 两种分区格式都。默认使用 MBR。你可以用大于 4 GB 的 ISO 文件创建引导盘。几乎所有类型的操作系统都支持。开发者声称 Ventoy 已经测试过了超过 900 多个 ISO 文件。支持 Linux 自动安装。意味着你可以添加你的模板或脚本来进行无人值守的部署。例如，Redhat/CentOS 的 kickstart 脚本，SUSE 的 autoYast xml，Debian 的 preseed 脚本。把脚本或模板放在 U 盘里，让 ventoy 使用它进行无人值守安装。你也可以在任何时候更新这些脚本。不需要创建新的 ISO 文件，只要使用原来的 ISO 即可。支持 Windows 系统的自动安装。在启动期间对 USB 盘写保护。不影响 USB 启动盘的正常使用。这意味着你可以将 U 盘用于文件复制等其他用途。当有新的 Ventoy 版本时可供升级时，无须重新创建 USB 启动盘。在版本升级过程中，数据不会被破坏。当一个新的发行版发布时，不需要更新 Ventoy。将 ISO 文件复制/粘贴到 U 盘中，即可添加一个新的操作系统，没有必要从头开始。支持 内存盘 Memdisk 模式。在某些机器上，可能无法加载 ISO。在这种情况下，你可以使用 内存盘 Memdisk 模式。Ventoy 将把整个 ISO 文件加载到内存中，然后启动它。插件框架。 传统 Legacy 和 UEFI 的本地启动菜单风格。有命令行界面、本地图形化界面和基于 Web 的图形化界面的版本可用。支持主题和菜单风格的定制。跨平台。它支持 Linux、manOS 和 Windows 等操作系统。自由开源！在 Linux 中用 Ventoy 创建多重启动的 U 盘正如我之前提到的，Ventoy 有命令行界面、本地图形化界面和基于 Web 的图形化界面的版本可用。1. 使用 Ventoy 命令行创建多重启动的 U 盘首先，你需要找到你的 U 盘名称。可以通过下面的指南，来了解在 Linux 中寻找磁盘驱动器细节的不同方法。如何在 Linux 中 寻找硬盘驱动器细节我将使用 fdisk 命令来查找我的 U 盘的详细信息：$ sudo fdisk -l 样例输出：[...] Disk /dev/sdb: 14.54 GiB, 15597568000 bytes, 30464000 sectors Disk model: Cruzer Blade Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x4d924612 如你所见，我的 U 盘的名称是 /dev/sdb。接下来，从 发布页 下载最新的 Ventoy 脚本。截至编写本指南时，最新版本是 1.0.77（LCTT 译注：截至翻译完成时，最新版本是 1.0.91）。到你下载脚本的位置，解压它。我把它解压在一个名为 ventoy 的文件夹中。使用 cd 命令切换到 ventoy 目录中：$ cd ventoy 现在，运行以下命令来创建多重启动的 U 盘：$ sudo sh Ventoy2Disk.sh -I /dev/sdb 将 /dev/sdb 替换为你的 U 盘名称。这里，大写的 -I 参数意味着将无视之前是否安装过 ventoy，强制安装 ventoy 到 sdb。当你使用小写的 -i，若此时磁盘已经安装了 ventoy ，它会安装失败。要启用安全启动支持，使用 -s 参数。默认情况下，这个选项是关掉的。$ sudo sh Ventoy2Disk.sh -I -s /dev/sdb 你将被提示确认 USB 启动盘的创建过程。仔细检查 U 盘的名称，并输入 Y，按回车键继续：样例输出：********************************************** Ventoy: 1.0.77 x86_64 longpanda admin@ventoy.net https://www.ventoy.net ********************************************** Disk : /dev/sdb Model: SanDisk Cruzer Blade (scsi) Size : 14 GB Style: MBR Attention: You will install Ventoy to /dev/sdb. All the data on the disk /dev/sdb will be lost!!! Continue? (y/n) y All the data on the disk /dev/sdb will be lost!!! Double-check. Continue? (y/n) y Create partitions on /dev/sdb by parted in MBR style ... Done Wait for partitions ... partition exist OK create efi fat fs /dev/sdb2 ... mkfs.fat 4.2 (2021-01-31) success Wait for partitions ... /dev/sdb1 exist OK /dev/sdb2 exist OK partition exist OK Format partition 1 /dev/sdb1 ... mkexfatfs 1.3.0 Creating... done. Flushing... done. File system created successfully. mkexfatfs success writing data to disk ... sync data ... esp partition processing ... Install Ventoy to /dev/sdb successfully finished. 几秒钟后，多重启动的 U 盘将被创建。上述命令将创建两个分区。你可以用 fdisk 命令来验证它：$ sudo fdisk -l 样例输出：[...] Disk /dev/sdb: 14.53 GiB, 15597568000 bytes, 30464000 sectors Disk model: Cruzer Blade Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x436cedd0 Device Boot Start End Sectors Size Id Type /dev/sdb1 * 2048 30398463 30396416 14.5G 7 HPFS/NTFS/exFAT /dev/sdb2 30398464 30463999 65536 32M ef EFI (FAT-12/16/32) 现在打开你的文件管理器，把 ISO 文件复制到第一个分区。不用担心你分不清楚哪个是第一个分区，你的文件管理器将只显示第一个分区。你甚至可以为不同的 ISO 文件类型创建子文件夹。例如，你可以为存储 Linux ISO 文件创建一个子文件夹，为 BSD ISO 文件创建一个子文件夹，为 Windows ISO 文件创建一个子文件夹。Ventoy 将扫描整个 U 盘，为所有可用的 ISO 文件创建菜单项，并自动将它们添加到 Ventoy 的主启动菜单中。如果你喜欢用命令行方式复制 ISO 文件，请到你保存 ISO 文件的地方，用 rsync 程序从命令行复制所有 ISO 文件，如下所示：$ rsync *.iso /media/$USER/ventoy/ --progress -ah 请注意，在某些 Linux 发行版中，U 盘可能被挂载在 /run/media/ 位置。大功告成！我们刚刚用 Ventoy 创建了多重引导的 U 盘。用新制作的可引导 U 盘启动你的系统，你会对 Ventoy 的启动菜单感到满意：选择你想启动的操作系统，并按下回车键加载它！下面是用 Ventoy 创建的多重启动 U 盘的简短视频演示：很酷，不是吗？确实如此！如果你想在 Oracle Virtualbox 中用 U 盘启动，请参考以下指南：如何在 Linux 中从 U 盘 启动 Virtualbox 的虚拟系统？2. 使用 Ventoy 图形化界面创建多重启动的 U 盘最初，Ventoy 在 Linux 平台上没有任何图形化的用户界面。我们在 Linux 中只能使用Ventoy 的命令行模式创建 USB 启动盘。幸运的是，Ventoy 从 1.0.36 版开始提供基于网页的图形用户界面，从 1.0.52 版开始提供本地化图形用户界面（使用 GTK/QT）。相信我，Ventoy 的图形化用户界面使用起来非常简单！它的界面非常小巧，但它拥有我们所需要的一切，只需点击几下鼠标就能创建一个单一的或多重引导的启动盘。打开你的终端，进入你下载最新 Ventoy 程序的位置。$ cd Downloads/ventoy-1.0.77/ 运行适配的 Ventoy 图形化用户界面可执行文件，这取决于发行版的架构。VentoyGUI.i386 - 32 位的 X86 架构的操作系统适用VentoyGUI.x86\_64 - 64 位的 X86 架构的操作系统适用VentoyGUI.aarch64 - ARM64 架构的操作系统适用VentoyGUI.mips64el - 龙芯 3A MIPS 架构的操作系统适用我使用的是 Debian 11 X86 64 位系统，所以我运行以下命令：$ ./VentoyGUI.x86_64 这就是 Ventoy 图形用户界面的样子。Ventoy 会自动为你选择已插入的 U 盘。但是我建议你确认所选择的是否真的是你想格式化的 U 盘。你将被提示确认该过程。点击 “OK” 继续。Ventoy 选项和语言从菜单栏中点击 选项 Option 按钮。 从 选项 Option 下拉按钮，你可以做以下事情： 安全启动支持 Secure Boot Support - 勾选/取消勾选以启用或禁用安全启动。默认情况下，它处于选中状态以示启用。 分区格式 Partition Style - 支持 MBR 和 GPT 分区格式。默认是 MBR。 分区配置 Partition Configuration - 在这里，你可以选择在磁盘的末端保留一些空闲空间。 清除 Clear Ventoy - 从你的磁盘中删除 Ventoy。 显示所有设备 Show All Devices - 如果你想显示包括你的本地磁盘在内的所有连接的设备，请选中这个选项。在选择这个选项时要特别小心。你可能会不小心选择你的一个本地磁盘并将其格式化。 语言 Language 按钮允许你选择你喜欢的语言。更新 Ventoy每当有新的 Ventoy 版本发布时，没有必要重新创建可引导的 USB 启动盘。你可以安全地将Ventoy 更新到新版本，而不会丢失 U 盘中的任何现有数据。要将已安装的 Ventoy 版本更新到最新的可用版本，请插入 U 盘并启动 Ventoy 图形化用户界面，如上所示。在 Ventoy 图形化用户界面中, 点击 更新 Update 按钮。3. 使用 Ventoy 基于 Web 的图形化用户界面创建多重启动的 USB 启动盘Ventoy 基于 Web 的图形化用户界面与本地图形化用户界面完全相同。有一天，我在我的Fedora Linux 桌面系统上试用了 Ventoy 基于 Web 的用户界面。我很惊讶我是多么喜欢Ventoy 图形用户界面的简洁。要了解如何使用 Ventoy 图形用户界面创建可引导的 U 盘，请参考以下链接：在 Linux 中用 Ventoy 基于 Web 的用户界面创建可引导的 U 盘将 ISO 镜像加载到 RAM 中就像我之前提到的，ISO 镜像在某些机器上可能无法启动，特别是在传统的 BIOS 模式下。这就是 内存盘 Memdisk 模式的用武之地。当 内存盘 Memdisk 模式被启用时，Ventoy 将把整个 ISO 镜像文件加载到内存中启动。在选择操作系统之前按 F1 键，启用 内存盘 Memdisk 模式（译者注：从 1.0.83 版本开始，进入该模式的快捷键从 F1 改成了 Ctrl+D）。当 内存盘 Memdisk 模式启用时，你会在右上角看到通知。现在，ISO 将被加载到内存中：请再次按 F1 键以切换回正常模式。创建持久化的可引导 U 盘我们现在知道了如何在 Linux 中用 Ventoy 创建多重启动的 U 盘。我们可以使用这个可引导的 USB 启动盘来测试 Linux 发行版，而不必真的在硬盘上安装它们。当你使用 立付 Live OS 时，你可以做各种事情，如安装应用程序、下载文件、播放媒体文件、创建文件和文件夹、按照你的喜好定制等等。然而，一旦你重新启动系统，所有上述变化都将消失。如果你想让所有的改变在重启系统后仍然保留，你应该创建一个持久化的可引导的 U 盘。Ventoy 能够制作持久化的 USB 启动盘。请参考下面的链接学习怎么做。在 Linux 中使用 Ventoy 创建持久化的可引导 U 盘总结信不信由你，Ventoy 是我用过的在 Linux 中创建多重引导（持久或非持久）的 USB 闪存盘工具中最简单、最快速、最巧妙的之一。它真的做到了开箱即用！试一下吧，你不会失望的!与 Ventoy 有关的安全问题Ventoy 网站、论坛和该网站上的一些文件被一些杀毒软件标记为恶意软件或木马。请查看这些发布在该项目 GitHub 页面中的议题：https://github.com/ventoy/Ventoy/issues/22https://github.com/ventoy/Ventoy/issues/83https://github.com/ventoy/Ventoy/issues/31然而，Manjaro 打包者 Linux Aarhus 在代码审查后认为：没有合理的理由怀疑这个应用程序的安全性。他声称 “没有混淆的代码”。所以，我觉得 Ventoy 是可以安全使用的。资源Ventoy 官网Ventoy GitHub 仓库（题图： MJ: USB disk bootload computer sci-fi future in sky stars）via: https://ostechnix.com/how-to-create-multiboot-usb-drives-with-ventoy-in-linux/作者：sk 选题：lkxed 译者：hanszhao80 校对：校对者ID本文由 LCTT 原创编译，Linux中国 荣誉推出
在网络上文件传输可以通过各种不同的方式和协议来完成。远程复制文件最常用的协议是 Rsync、SCP 和 SFTP。在本文中，我们将了解什么是 SCP 以及如何在 Linux 和类 Unix 操作系统中使用 SCP 在本地和远程计算机之间安全地传输文件。什么是 SCP？SCP，代表 安全复制 Secure Copy ，它是一个命令行程序，在 Linux 和类 Unix 操作系统中以安全的方式在本地和远程系统之间，或在两个远程系统之间复制文件和目录。使用 scp 命令，你可以安全地复制文件或目录：从本地到远程系统从远程系统到本地在两个远程系统之间使用 scp 命令传输数据时，文件和目录都是加密的。因此，即使网络被破坏，作恶者也无法获得任何有意义的数据。SCP 是 openSSH 程序的一个组件，它使用 SSH 协议安全地传输文件。几乎所有现代 Linux 和 Unix 发行版都预装了 OpenSSH，所以不必费心安装它。提醒一句：根据 openSSH 开发人员的官方公告：scp 协议已经过时了，它不灵活且不易修复。我们建议使用更现代的协议，如 sftp 和 rsync 来代替。参考 - https://lists.mindrot.org/pipermail/openssh-unix-dev/2019-March/037672.html但是，大多数用户仍然更喜欢 SCP 协议。因为，SCP 处理远程文件传输比同行 SFTP 和 Rsync 更快。另外，SCP 的工作原理与 cp 命令完全相同，而 rsync 则会判断源目录是否有结尾斜杠而出现不同的行为。看一看下面的命令：rsync source destination/ - 将 source 目录复制到 destination 文件夹内。rsync source/ destination/ - 将 source 目录的内容复制到 destination 文件夹中。所以，你必须反复检查是否在路径中添加了斜杠。我个人使用 Rsync 在两台主机之间复制大文件，使用 SCP 在网络上复制单个文件。SCP 命令语法SCP 的通用语法如下：scp [-346ABCpqrTv] [-c cipher] [-F ssh_config] [-i identity_file] [-J destination] [-l limit] [-o ssh_option] [-P port] [-S program] source ... target 根据文件传输路径的不同，语法也会有所不同。这里我罗列了一些语法格式示例。从本地复制一个文件到远程系统：scp <options> SourceFile User@RemoteHost:RemotePath 类似的，从本地系统复制一个目录到远程系统，使用 -r 参数：scp -r SourceDirectory User@RemoteHost:RemotePath 复制多个文件到远程系统：scp <options> SourceFile1 SourceFile2 User@RemoteHost:RemotePath 远程系统复制文件到本地：scp <options> User@RemoteHost:RemoteFilePath DestinationFile 远程系统复制目录到本地：scp -r User@RemoteHost:RemoteDirectoryPath DestinationDirectory 在本地将文件在两个远程系统之间复制：scp <options> User@RemoteHost1:RemoteFile1 User@RemoteHost2:RemotePath 注意，当你在两个远程系统之间复制文件时，流量不会通过本地系统。操作直接在两个远程系统之间进行。但是，你可以使用 -3 参数让流量经过你运行 scp 命令的系统。从你的本地系统将一个远程系统的目录复制到另一个远程系统：scp -r User@RemoteHost1:RemoteDirectory User@RemoteHost2:DestinationPath SCP 命令参数SCP 命令最常用的参数有：-C：启用压缩。C 代表 压缩 Compression 。使用此参数时，数据传输速度会更快，因为数据是压缩的。SCP 将自动在源系统上压缩，并在目标系统上解压缩。-c <cipher>：c 代表 加密 Cipher 。默认情况下，SCP 使用 AES-128 加密方法对数据进行加密。你可以使用 -c 参数更改加密方法。-i <identity_file>：i 代表 身份 Identity 文件或私钥。如你所知，SSH 中使用基于密码或密钥的身份验证。如果希望在传输文件时使用基于密钥的身份验证，可以使用 -i 参数指定身份文件或私钥。-l limit：l 代表 限制 Limit 带宽。通过此参数，可以设置传输数据的最大带宽。它的单位是 Kbit/s。-F <ssh_config>：有时你可能需要使用不同的网络来连接到 Linux 系统，或你有一个代理服务器，这种情况下，你可以使用 -F 参数使用不同的 ssh_config 文件 File 。-P port：P 代表 端口 Port 。注意，这是大写的 P。默认情况下，SSH 使用端口 22。但出于安全原因，你可能已经更改了目标主机中的端口号。这种情况下，你应该使用 -P 参数显示指定新端口号。-p：如果希望 保留 Preserve 原始文件的修改时间、访问时间和模式，你需要使用 -p 参数。注意是小写 p。-r： 递归 Recursively 复制整个目录。-B：B 代表 批处理 Batch 模式。它用于在传输文件时选择批处理模式。可以防止询问密码。-S program：用于加密连接的 程序 Program 名称。-v：v 代表 详细 Verbose 。当使用 -v 参数时，命令将会在终端屏幕上打印进度。你会看到文件传输时到底发生了什么。它在调试连接、身份验证和配置问题时非常有用。SCP 有很多参数，你可以查看它的手册页来了解其他参数。让我们看一些有用的 scp 命令示例。开始前要记住的重要事项scp 命令依赖于 ssh 进行安全的文件传输。因此，你必须有一个 ssh 密钥或密码才能向远程系统进行身份验证。为了能传输文件，你必须对源文件有读权限，对目标位置有写权限。scp 命令在写入前不会检查目标位置。目标位置中具有相同名称的任何文件都将被覆盖而不通知。为了能够区分本地和远程位置，使用冒号（:）。传输大文件时，建议在 Screen 或 Tmux 会话内启动任务。在 Linux 中使用 SCP 传输文件正如我所说，我们可以使用 scp 命令将文件或目录从本地复制到远程系统，反之亦然，或者在两台远程系统之间复制文件或目录。1. 使用 SCP 从本地系统复制文件到远程系统使用 scp 命令将文件从本地复制到远程系统，运行：$ scp File1.txt ostechnix@192.168.1.40:/home/ostechnix/ 示例输出：ostechnix@192.168.1.40's password: File1.txt 100% 104 814.0KB/s 00:00 让我们分析一下上面的命令，看看每个参数都做了什么。File1.txt - 源文件ostechnix - 远程系统的用户名192.168.1.40 - 远程系统的 IP 地址/home/ostechnix/ - 远程系统中的目标目录。这是我们想要传输源文件的绝对路径，如 File.txt。你还可以修改目标文件的名称。下面的命令将 File1.txt 传输到目的地，保存为 myfile.txt。$ scp File1.txt ostechnix@192.168.1.40:/home/ostechnix/myfile.txt 2. 使用 SCP 从本地系统复制多个文件到远程系统使用 scp 命令将多个文件从本地系统传输到远程系统，运行：$ scp File1.txt File2.txt ostechnix@192.168.1.40:/home/ostechnix/ 示例输出：ostechnix@192.168.1.40's password: File1.txt 100% 104 689.4KB/s 00:00 File2.txt 100% 496 6.3MB/s 00:00 这里：File1.txt 和 File2.txt - 源文件名ostechnix@192.168.1.40 - 远程系统的用户名和 IP 地址/home/ostechnix - 目标文件的路径如果文件具有相同的扩展名，你可以使用以下替代命令来实现相同的目标。$ scp {File1,File2}.txt ostechnix@192.168.1.40:/home/ostechnix/ 或者，$ scp *.txt ostechnix@192.168.1.40:/home/ostechnix/ 3. 使用 SCP 从本地到远程系统递归复制目录递归地将整个目录（包括子目录及其内容）从本地复制到远程系统，使用 -r 参数。$ scp -r Documents/ ostechnix@192.168.1.40:/home/ostechnix/ 上述命令将整个 Documents 目录包括其内容复制到目标系统。其中，-r - 递归复制文件和目录，包括子目录及其内容Documents - 源目录名称ostechnix@192.168.1.40 - 远程系统的用户名和 IP 地址/home/ostechnix - 目标目录的路径4. 用 SCP 将文件从远程系统传输到本地还记得我们从本地系统复制了 File1.txt 到远程系统，让我们把它复制回本地。使用 scp 命令从远程系统复制文件到本地，运行：$ scp ostechnix@192.168.1.40:/home/ostechnix/File1.txt Downloads/ 其中ostechnix@192.168.1.40 - 远程系统的用户名和 IP 地址/home/ostechnix/File.txt - 远程系统文件的绝对路径Downloads - 本地保存复制文件的位置5. 使用 SCP 将多个文件从远程系统传输到本地将多个文件从远程系统复制到本地，在花括号内注明文件的绝对路径，如下所示：$ scp ostechnix@192.168.1.40:/home/ostechnix/\{File1.txt,File2.txt\} Downloads/ 上述命令将从远程系统的 /home/ostechnix/ 目录中复制 File1.txt 和 File2.txt 到本地的 Downloads 目录中。注意，花括号内的逗号后面没有空格。6. 从远程系统递归复制目录到本地使用 scp 从远程系统递归复制整个目录（包括子目录及其内容）到本地系统，使用 -r 参数。$ scp -r ostechnix@192.168.1.40:/home/ostechnix/Documents Downloads/ 上述命令将从远程系统将整个 Documents 目录复制到本地的 Downloads 目录。7. 使用 SCP 在两台远程计算机之间复制文件使用 scp 命令将文件从一个远程系统直接复制到另一个远程系统，运行：$ scp senthil@192.168.1.40:/home/senthil/File1.txt kumar@192.168.1.20:/home/kumar/ 它会要求你输入两个远程系统的密码：其中，senthil@192.168.1.40 - 文件源端远程系统的用户名和 IP 地址/home/senthil/File1.txt - 复制的文件名及其位置kumar@192.168.1.20 - 复制文件到目标端的用户名和 IP 地址/home/kumar - 在目标端上保存复制文件的位置上述命令将从远程主机 192.168.1.40 复制 /home/senthil/File1.txt 到 192.168.1.20 上的 /home/kumar/ 目录。在这种方法中，数据将直接从一个远程系统传输到另一个远程系统。如果你想通过本地机器路由流量，使用 -3 参数，如下所示：$ scp -3 senthil@192.168.1.40:/home/senthil/File1.txt kumar@192.168.1.20:/home/kumar/ 8. 使用 SCP 复制文件时启用压缩到目前为止，我们在没有压缩的情况下传输了文件。现在我们将使用 -C 参数在传输文件时启用压缩。$ scp -C File1.txt ostechnix@192.168.1.40:/home/ostechnix/ -C 参数将在源端启用压缩，并在目标端自动解压数据。通过启用压缩，可以显著提高文件复制或传输速度。9. 使用 SCP 传输文件时限制带宽我们可以使用 -l 参数限制带宽。注意，最大带宽单位为 Kbits/s。1 Byte = 8 bit。因此，如果你想将带宽限制在 200KB/s，-l 的值将是 1600（200*8）。$ scp -l 1600 File1.txt ostechnix@192.168.1.40:/home/ostechnix/ 这在传输大文件时非常有用，可以防止 SCP 限制带宽。10. 使用 SCP 复制文件时使用不同端口作为系统管理员，出于安全原因，你可能在远程服务器上 更改了 SSH 协议的默认端口。这种情况下，你可以在传输文件时使用 -P 参数指定端口号。注意：大写的 P。$ scp -P 2022 File1.txt ostechnix@192.168.1.40:/home/ostechnix/ 11. 使用 SCP 复制文件时使用不同的加密方法默认情况下，SCP 使用 AES-128 对文件进行加密。如果你想使用不同的加密方法，使用 c 参数。例如，如果你想使用 3des-cbc 加密方法，命令如下所示：$ scp -c 3des-cbc File1.txt ostechnix@192.168.1.40:/home/ostechnix/ 要查看支持的密码列表，执行：$ ssh -Q cipher localhost | paste -d, -s - 示例输出：3des-cbc,aes128-cbc,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,chacha20-poly1305@openssh.com 12. 在详细模式下使用 SCP 复制文件如果你想知道使用 scp 复制文件时幕后发生了什么，你可以使用 -v 参数。使用详细模式传输文件时，终端上会显示执行 scp 命令执行的每一步过程。这在故障排除时很方便。$ scp -v File1.txt ostechnix@192.168.1.40:/home/ostechnix/ 在详细模式下发送文件时，你将看到大量输出，如下所示：13. 在安静模式下使用 SCP 传输文件我们可以使用 -q 参数在安静模式下传输文件。在安静模式下共享文件时，不会在输出中显示进度、警告或诊断信息。$ scp -q File1.txt ostechnix@192.168.1.40:/home/ostechnix/ 14. 使用 SCP 传输文件时保留文件属性使用 -p 参数可以保留文件修改时间、访问时间和模式等文件属性。注意，这是小写的 p。$ scp -p File1.txt ostechnix@192.168.1.40:/home/ostechnix/ 15. 使用 SCP 复制文件时使用身份文件SSH 同时支持基于密码和密钥的身份验证。密钥是 Linux 环境中使用最广泛的身份验证方法。如果你想在传输文件时使用基于密钥的身份验证，使用 -i 参数指定身份文件或私钥。$ scp -i my_private_key.pem File1.txt ostechnix@192.168.1.40:/home/ostechnix/ 16. 使用不同的 ssh 配置文件在某些情况下，你需要使用不同的网络来连接到 Linux 系统，或你有一个代理服务器。这在情况下，你可以配合 -F 参数使用不同的 ssh_config 文件。$ scp -F /home/ostechnix/my_ssh_config File1.txt ostechnix@192.168.1.40:/home/ostechnix/ 17. 使用 IPv4 或 IPv6 复制文件在复制文件时，我们可以强制 SCP 只使用 IPv4 或 IPv6 地址。IPv4 网络添加 -4 参数，IPv6 网络添加 -6 参数可以实现这一点。$ scp -6 File1.txt ostechnix@192.168.1.40:/home/ostechnix/ 常见问题问题 1：什么是 SCP？SCP 是一个命令行程序，旨在将文件和目录从本地系统安全地传输到远程系统，反之亦然，或者直接在两个远程系统之间传输。问题 2: 如何使用 SCP 将文件从本地复制到远程计算机？将文件从本地复制到远程系统，命令如下：scp SourceFile.txt User@RemoteHost:/some/remote/directory 问题 3：如何递归复制文件和目录？递归复制包含子目录的目录，使用 -r 参数：scp -r /some/local/directory User@RemoteHost:/some/remote/directory 问题 4：使用 SCP 可以传输多个文件吗？当然，只要用空格分隔源文件名即可。从本地复制多个文件到远程：scp file1.txt file2.txt file3.txt User@RemoteHost:/some/remote/directory scp {file1,file2,file3}.txt User@RemoteHost:/some/remote/directory scp *.txt User@RemoteHost:/some/remote/directory 从远程复制多个文件到本地：scp User@RemoteHost:/some/remote/directory/\{file1.txt,file2.txt,file3.txt\} /some/local/directory 从一个远程系统复制多个文件到另一个远程系统：$ scp User@RemoteHost1:/some/remote/directory/\{file1.txt,file2.txt,file3.txt\} User@RemoteHost2:/some/remote/directory/ 问题 5：如何传输目录下的所有文件？传输整个目录，首先进入该目录：cd dir_name 然后，scp *.txt User@RemoteHost:/some/remote/directory 问题 6：可以压缩文件吗？当然。使用 -C 压缩文件。文件会在源端压缩，在目标端自动解压缩。scp -C /some/large/file User@RemoteHost:/some/remote/directory 问题 7：可以保留文件属性吗？保留原始文件的修改时间、访问时间和模式等文件属性，使用 -p 参数。scp -p file.txt User@RemoteHost:/some/remote/directory 问题 8: 可以使用其他端口吗？当然。SCP 配合 -P 参数允许你使用其他端口。scp -P 2022 file.txt User@RemoteHost:/some/remote/directory 问题 9: 可以使用不同的加密方法吗？当然。使用 -c 参数。scp -c 3des-cbc User@RemoteHost:/some/remote/directory 问题 10: 如何列出 SSH 支持的加密方法？使用以下命令查看 SSH 和 SCP 支持的加密方法列表：ssh -Q cipher localhost | paste -d, -s - 问题 11：SCP 真的安全吗？当然，它用起来是完全安全的。SCP 和 openSSH 使用相同的 SSH 机制。传输的数据在源端加密，目标端解密。问题 12：可以从 Windows 系统传输文件到 Linux 吗？当然。使用 PSCP 程序将文件从 windows 传输到 Linux 平台，你也可以使用 WinSCP。总结在这篇全面指南中，我们了解了什么是 SCP，以及如何在 Linux 中使用 SCP 安全地传输文件，其中包括 17 个 SCP 命令示例，另外还回答了关于 SCP 的常见问题。无论你是 Linux 管理人员、开发人员还是普通用户，你都会面临某个时候将文件复制到远程系统或从远程系统复制文件的情况，知道如何使用 SCP 安全地复制文件将是非常有用的。via: https://ostechnix.com/securely-transfer-files-with-scp-in-linux/作者：sk 选题：lkxed 译者：MjSeven 校对：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 sk@192.168.225.22 uname -a 这里，sk 是远程系统的用户名，192.168.225.22 是远程系统的 IP 地址，uname -a 是我想在远程系统上运行的命令。示例输出：看到没？我并没有实际登录到远程系统，但通过 SSH 在远程系统上执行了 uname 命令，并在本地系统的终端上显示了输出。你还可以像下面这样用引号指定命令。$ ssh sk@192.168.225.22 "uname -a" 或者，$ ssh sk@192.168.225.22 'uname -a' 如果你已经 更改了 SSH 协议的默认端口，只需使用 -p 参数指定它。$ ssh -p 2200 sk@192.168.225.22 uname -a 1.2、通过 SSH 在远程主机上执行多个命令你还可以在远程主机上运行多个命令，方法是将它们放在引号中。$ ssh sk@192.168.225.22 "uname -r && lsb_release -a" 或者：$ ssh sk@192.168.225.22 "uname -r ; lsb_release -a" 上面的命令将显示我的 Ubuntu 服务器的内核版本和发行版详细信息。示例输出：正如一位读者在下面的评论部分提到的那样，你应该用引号指定多个命令。如果不使用引号，第一个命令将在远程系统上执行，第二个命令将仅在本地计算机上执行。整个带引号的命令将按预期在远程计算机上运行。提示： 了解 && 和 ; 在命令中的区别：&& 操作符只有在第一个命令成功时才执行第二个命令。示例：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 sk@192.168.225.22 sudo apt install apache2 示例输出：注意到了吗？我在上面的命令中使用了 -t 标志，我们需要使用它来强制进行伪终端分配。它用于在远程机器上执行任意基于屏幕的程序，这非常有用。例如，在实现菜单服务时。另外，我输入了两次密码。第一次是远程用户的密码，以便从本地系统通过 SSH 访问远程系统，第二次是为了向远程用户赋予 sudo 权限，以便安装应用程序（在本例中为 apache2）。让我们用以下命令检查 Apache 服务是否正在运行：$ ssh -t sk@192.168.225.22 sudo systemctl status apache2 sk@192.168.225.22'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 sk@192.168.225.22 'bash -s' < system_information.sh 示例输出：sk@192.168.225.22'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 sk@192.168.225.22 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 sk@192.168.225.22 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 ostechnix@192.168.1.30 uname -a 其中，-p ubuntu - 提供远程系统的密码。ostechnix@192.168.1.30 - 远程系统用户名和地址。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 ostechnix@192.168.1.30 uname -a 从文本文件中读取密码使用 echo 命令在文本文件中追加密码：$ echo "ubuntu" > mypassword.txt 现在，将密码文件传递给带有 -f 标志的 sshpass，如下所示：$ sshpass -f mypassword.txt ssh ostechnix@192.168.1.30 uname -a 总结在本教程中，我们学习了一些通过安全的网络连接在远程计算机上调用命令或程序的方法。在所有的方法中，sshpass 方法是最不安全的，建议用户避免在生产系统中使用它。via: https://ostechnix.com/execute-commands-on-remote-linux-systems-via-ssh/作者：sk 选题：lkxed 译者：MjSeven 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
在 Linux 中如何从命令行查找默认网关的 IP 地址
Linux 下查找网关或路由器 IP 地址的 5 种方法。网关 是一个节点或一个路由器，当连接到同一路由器时，它允许两个或多个 IP 地址不同的主机相互通信。如果没有网关，它们将无法相互通信。换句话说，网关充当接入点，将网络数据从本地网络传输到远程网络。在本指南中，我们将看到在 Linux 和 Unix 中从命令行找到默认网关的所有可能方法。在 Linux 中查找默认网关Linux 中有各种各样的命令行工具可用于查看网关 IP 地址。最常用的工具是：ip、ss 和 netcat。我们将通过示例了解如何使用每种工具查看默认网关。1、使用 ip 命令查找默认网关ip 命令用于显示和操作 Linux 中的路由、网络设备、接口和隧道。要查找默认网关或路由器 IP 地址，只需运行：$ ip route 或者：$ ip r 或者：$ ip route show 示例输出：default via 192.168.1.101 dev eth0 proto static metric 100 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.20 metric 100 你从输出中看到了 default via 192.168.1.101 这一行吗？它就是默认网关。我的默认网关是 192.168.1.101。你可以使用 -4 参数只显示 IPv4 网关：$ ip -4 route 或者，使用 -6 参数只显示 IPv6 网关：$ ip -6 route 如你所见，IP 地址和子网详细信息也一并显示了。如果你想只显示默认网关，排除所有其他细节，可以使用 ip route 搭配 awk 命令，如下所示。使用 ip route 和 awk 命令打印网关地址，执行命令：$ ip route | awk '/^default/{print $3}' （LCTT 译注：wsl1 上无输出结果，正常 Linux 发行版无问题）或者：$ ip route show default | awk '{print $3}' 这将只列出网关 IP：示例输出：192.168.1.101 你也可以使用 grep 命令配合 ip route 对默认网关进行过滤。使用 ip route 和 grep 查找默认网关 IP 地址，执行命令：$ ip route | grep default default via 192.168.1.101 dev eth0 proto static metric 100 在最新的 Linux 发行版中，ip route 是查找默认网关 IP 地址的推荐命令。然而，你们中的一些人可能仍然在使用传统的工具，如 route 和 netstat。旧习难改，对吧？下面的部分将介绍如何在 Linux 中使用 route 和 netstat 命令确定网关。2、使用 route 命令显示默认网关 IP 地址route 命令用于在较老的 Linux 发行版中显示和操作路由表，如 RHEL 6、CentOS 6 等。如果你正在使用较老的 Linux 发行版，你可以使用 route 命令来显示默认网关。请注意，在最新的 Linux 发行版中，route 工具已被弃用，ip route 命令取而代之。如果你因为某些原因仍然想使用 route，你需要安装它。首先，我们需要检查哪个包提供了 route 命令。为此，在基于 RHEL 的系统上运行以下命令：$ dnf provides route 示例输出：net-tools-2.0-0.52.20160912git.el8.x86_64 : Basic networking tools Repo : @System Matched from: Filename : /usr/sbin/route net-tools-2.0-0.52.20160912git.el8.x86_64 : Basic networking tools Repo : baseos Matched from: Filename : /usr/sbin/route 如你所见，net-tools 包提供了 route 命令。所以，让我们使用以下命令来安装它：$ sudo dnf install net-tools 现在，运行带有 -n 参数的 route 命令来显示 Linux 系统中的网关或路由器 IP 地址：$ route -n 示例输出：Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.1.101 0.0.0.0 UG 100 0 0 eth0 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0 192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0 如你所见，网关 IP 地址是 192.168.1.101。你还将在 Flags 下面看到两个字母 UG。字母 U 代表接口是 “Up”（在运行），G 表示 “Gateway”（网关）。3、使用 netstat 命令查看网关 IP 地址netstat 会输出 Linux 网络子系统的信息。使用 netstat 工具，我们可以在 Linux 和 Unix 系统中打印网络连接、路由表、接口统计信息、伪装连接和组播成员关系。netstat 是 net-tools 包的一部分，所以确保你已经在 Linux 系统中安装了它。使用以下命令在基于 RHEL 的系统中安装它：$ sudo dnf install net-tools 使用 netstat 命令打印默认网关 IP 地址：$ netstat -rn 示例输出：Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 0.0.0.0 192.168.1.101 0.0.0.0 UG 0 0 0 eth0 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 netstat 命令与 route 命令的输出信息相同。如上输出可知，网关的 IP 地址为 192.168.1.191，UG 表示网关连接的网卡是有效的，G 表示网关。请注意 netstat 也已弃用，建议使用 ss 命令代替 netstat。4、使用 routel 命令打印默认网关或路由器 IP 地址routel 是一个脚本，它以一种漂亮格式的输出路由。routel 脚本的输出让一些人认为比 ip route 列表更直观。routel 脚本也是 net-tools 包的一部分。打印默认网关或路由器 IP 地址，不带任何参数运行 routel 脚本，如下所示：$ routel 示例输出： target gateway source proto scope dev tbl default 192.168.1.101 static eth0 172.17.0.0/ 16 172.17.0.1 kernel linkdocker0 192.168.1.0/ 24 192.168.1.20 kernel link eth0 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 172.17.0.1 local 172.17.0.1 kernel hostdocker0 local 172.17.255.255 broadcast 172.17.0.1 kernel linkdocker0 local 192.168.1.20 local 192.168.1.20 kernel host eth0 local 192.168.1.255 broadcast 192.168.1.20 kernel link eth0 local ::1 kernel lo ::/ 96 unreachable lo ::ffff:0.0.0.0/ 96 unreachable lo 2002:a00::/ 24 unreachable lo 2002:7f00::/ 24 unreachable lo 2002:a9fe::/ 32 unreachable lo 2002:ac10::/ 28 unreachable lo 2002:c0a8::/ 32 unreachable lo 2002:e000::/ 19 unreachable lo 3ffe:ffff::/ 32 unreachable lo fe80::/ 64 kernel eth0 ::1 local kernel lo local fe80::d085:cff:fec7:c1c3 local kernel eth0 local 只打印默认网关，和 grep 命令配合，如下所示：$ routel | grep default default 192.168.1.101 static eth0 5、从以太网配置文件中查找网关如果你在 Linux 或 Unix 中配置了静态 IP 地址，你可以通过查看网络配置文件查看默认网关或路由器 IP 地址。在基于 RPM 的系统上，如 Fedora、RHEL、CentOS、AlmaLinux 和 Rocky Linux 等，网络接口卡配置存储在 /etc/sysconfig/network-scripts/ 目录下。查找网卡的名称：# ip link show 示例输出：1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000 link/ether d2:85:0c:c7:c1:c3 brd ff:ff:ff:ff:ff:ff link-netnsid 0 网卡名为 eth0。所以让我们打开这个网卡文件的网卡配置：# cat /etc/sysconfig/network-scripts/ifcfg-eth0 示例输出：DEVICE=eth0 ONBOOT=yes UUID=eb6b6a7c-37f5-11ed-a59a-a0e70bdf3dfb BOOTPROTO=none IPADDR=192.168.1.20 NETMASK=255.255.255.0 GATEWAY=192.168.1.101 DNS1=8.8.8.8 如你所见，网关 IP 为 192.168.1.101。在 Debian、Ubuntu 及其衍生版中，所有的网络配置文件都存储在 /etc/network 目录下。$ cat /etc/network/interfaces 示例输出：auto ens18 iface ens18 inet static address 192.168.1.150 netmask 255.255.255.0 gateway 192.168.1.101 dns-nameservers 8.8.8.8 请注意，此方法仅在手动配置 IP 地址时有效。对于启用 DHCP 的网络，需要按照前面的 4 种方法操作。总结在本指南中，我们列出了在 Linux 和 Unix 系统中找到默认网关的 5 种不同方法，我们还在每种方法中包含了显示网关/路由器 IP 地址的示例命令。希望它对你有所帮助。via: https://ostechnix.com/find-default-gateway-linux/作者：sk 选题：lkxed 译者：MjSeven 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如何在 sudo 运行的命令中防止使用参数
允许用户使用 sudo 运行命令，但不带命令行参数。在之前的文章，我们学习了如何 通过 sudo 以 root 身份运行目录中的命令。在这篇指南中，我们将学习如何在 Linux 中 防止 sudo 运行的命令使用参数。即我们允许一个用户使用 sudo 运行特权级命令，但是 不带命令行参数。背景介绍你已经知道了，每个命令执行一个特定操作有不同的选项。让我们以 ls 命令为例。ls 命令会罗列文件夹中的内容，对吗？没错。ls 命令附带了一些命令行选项和标志。例如，你可以用 ls 命令的 -a 标志罗列文件夹中的所有内容（包括隐藏文件）。在这份简要指南中，我们将明白如何允许用户通过 sudo 运行 ls 命令，但是不能使用命令行选项或者标志。我讲清楚了吗？接下来让我来展示一下如何做到这点。防止使用 sudo 参数以 root 用户身份编辑 /etc/sudoers 文件：[root@Almalinux8CT ~]# visudo 添加下面一行：user1 ALL=(root) /usr/bin/ls "" 要注意这里 ls 之后的 双引号。双引号会屏蔽用户在给定命令之后输入的参数（比如 ls 命令）。在上面的命令中，user1 能够以 root 身份运行 ls 命令，但是不能使用 ls 命令的选项以及标志。你可以选择其他的指令进行尝试。保存该文件并关闭。现在，以 user1 的身份登录系统，并尝试以管理员身份运行 ls 命令，不要添加任何选项：[user1@Almalinux8CT ~]$ sudo -u root ls -a 或许你会遇到下面的报错：Sorry, user user1 is not allowed to execute '/bin/ls -a' as root on Almalinux8CT. 不过你可以不添加参数来运行 ls 命令：[user1@Almalinux8CT ~]$ sudo -u root ls 防止所有用户使用命令参数上述例子像你展示了如何阻止用户以管理员身份运行带有参数的命令。你是否想要对所有用户应用该规则呢？很简单！只需要在 /etc/sudoers 文件中添加一行：ALL ALL=(root) /usr/bin/ls "" 现在，系统中的所有用户都可以运行不带参数的 ls 命令。想要恢复默认设置，只需要删除最后的双引号，或者删除整行。查看帮助手册，了解更多。$ man sudoers 结论在这份指南中，我们学习了如何允许用户以管理员身份运行命令，但是不能添加任何命令参数。这样可以限制用户误用一些命令行参数。via: https://ostechnix.com/prevent-command-arguments-with-sudo/作者：sk 选题：lkxed 译者：Donkey-Hao 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
在 Linux 中安装和应用现代的漂亮的 GRUB 主题。GRUB ，意即 大统一引导程序 GRand Unified Bootloader ，它是大多数 Linux 操作系统的默认引导加载程序。GRUB 引导加载程序是计算机启动时运行的第一个程序。正如你可能注意到的，GRUB 菜单的默认主题是朴素的。它只有一个黑色的背景和一些白色的字符。你们中的一些人可能不喜欢默认的 GRUB 主题。在这篇教程中，我将演示如何 更改 GRUB 主题 或应用华丽的主题，以使你的 GRUB 菜单在 Linux 中更加精美。数年前，我们发布了一篇指南，阐释了如何在 Ubuntu 中 配置 GRUB2 引导加载程序设置 。在这篇文章中，我们将向你展示如何更改 GRUB 背景。但是，只更改背景不是真正的自定义。在这篇指南中，我们不仅会更改壁纸，也会更改 GRUB 的字体、主题和整体的设计。免责声明： 安装 GRUB 主题可能会破坏你的系统。我强烈建议你在一个虚拟机中尝试和测试一个主题来查看它是否没有正常工作。然后再在实际的系统上安装主题。介绍在互联网上可以找到很多社区开发的 GRUB 主题。然而，它们却散落在不同的网站上。因此，找到一个好的 GRUB 主题可能会事倍功半。GRUB 主题的一个重要的贡献者是 Pling 网站。但是，Pling 中的大部分主题是非常简单的或过时的。幸运的是，我遇到一个名称为 Gorgeous GRUB 的项目，它是一个可以找到各种精美的 GRUB 主题的地方。相信我，作者付出了巨大的努力来收集这些主题，肯定会你喜欢的主题。Gorgeous GRUB：一个可以找到很棒的 GRUB 主题的地方Gorgeous GRUB 是一个由不同用户所创建的质量上乘的 GRUB 社区主题的收藏集合。这个项目的开发者从 Pling 、/r/unixporn 和其它很多的论坛中手工挑选漂亮的 GRUB 主题，并将它们放置到一起，以便用户可以很容易的浏览它们。如上所述，在 Pling 中的很多主题都是粗糙和过时的。Gorgeous GRUB 的作者翻遍了 Pling 和其它一些论坛的整个 GRUB 部分，并将所有令人满意的 GRUB 主题放置到一个地方。它们不是一些粗制滥造的主题。他们付出了大量的努力来将定制的背景、字体和颜色等融合在一起。请注意，Gorgeous GRUB 并不是一个安装你最喜欢的 GRUB 主题的应用程序。它只是一个良好工作的 GRUB 主题的展览列表。这个项目托管在 GitHub 中。如果你有一些很酷的 GRUB 主题，你也可以将其添加到 Gorgeous GRUB 主题列表之中。如何更改 GRUB 主题应用或更改 GRUB 主题并不难。转到 Gorgeous GRUB 的 GitHub 网页 ，单击任意你想要应用的主题的标题。接下来，你将会被带到该主题的实际主页。一些主题托管在 Pling 之中，一些主题托管在 GitHub 之中。我将会看看如何安装来自 Pling 或 GitHub 的 GRUB 主题。首先，让我们看看如何应用 “Descent” 主题，它托管在 Pling 中。1、从 Pling 安装 GRUB 主题如果主题托管在 Pling 网站，遵循这些操作说明。在主题主页，单击 文件 Files 标签页。你将会在图像预览的下方找到这个标签页。单击文件链接来下载它。转到下载位置并提取存档文件：$ tar xzf 173860-20150926\ descent.tar.gz 存档文件的内容将被提取到当前工作目录中一个名称为 descent 目录中。使用下面的命令复制 descent 目录到 /boot/grub/themes/ 目录：$ sudo cp -r descent/ /boot/grub/themes/ 如果 themes 目录不存在，只需要创建它：$ sudo mkdir /boot/grub/themes 并给 themes 目录分配适当的权限：$ sudo chown $USER /boot/grub/themes/ 接下来，如上所述复制 descent 目录中内容到 themes 目录。现在，你应该在 themes 目录中有一个以主题名称命名的文件夹：$ ls /boot/grub/themes/ descent 并且，这个主题文件夹（例如 descent）应该包含 theme.txt 和该主题附带的其它一些相关的文件（例如，背景图像、自定义文件）。$ ls /boot/grub/themes/descent/ background1280x800.png descent_score_14.pf2 menu_ne.png menu_s.png progresshigh_c.png scrollframe_c.png scroll_thumb_n.png background_original.jpg descent_score_18.pf2 menu_n.png menu_sw.png progresshigh_e.png scrollframe_n.png scroll_thumb_s.png copyright menu_c.png menu_nw.png menu_w.png progresshigh_w.png scrollframe_s.png select_os.png descent_logo_bold_18.pf2 menu_e.png menu_se.png progressbar_c.png readme scroll_thumb_c.png theme.txt 在复制下载的主题到 /boot/grub/themes/ 目录后，编辑 /etc/default/grub 文件：在进行任意更改前，请备份 grub 文件，以防万一：$ sudo cp /etc/default/grub /etc/default/grub.bak 现在，使用你喜欢的编辑器编辑文件：$ sudo nano /etc/default/grub 找到 GRUB_THEME= 代码行，并添加路径到你想要使用的主题的 theme.txt 。并且，也要取消 GRUB_GFXMODE= 代码行的注释，输入背景图像的分辨率。通常，背景图像的文件名称包含其分辨率（例如 background1280x800.png）。[...] GRUB_THEME=/boot/grub/themes/descent/theme.txt GRUB_GFXMODE=1280x800 [...] 再强调一次，如果这些代码行不存在，简单地添加它们。按下 CTRL+O 组合键 和 CTRL+X 组合键（LCTT 校注：这是 nano 中的快捷键，如果你使用 Vi/Vim，请使用相应的快捷键）来保持更改并关闭文件。现在，应用更改到 GRUB ，使用命令：$ sudo update-grub 示例输出：Sourcing file `/etc/default/grub' Sourcing file `/etc/default/grub.d/init-select.cfg' Generating grub configuration file ... Found theme: /boot/grub/themes/descent/theme.txt Found linux image: /boot/vmlinuz-5.15.0-41-generic Found initrd image: /boot/initrd.img-5.15.0-41-generic Found linux image: /boot/vmlinuz-5.15.0-39-generic Found initrd image: /boot/initrd.img-5.15.0-39-generic Found memtest86+ image: /boot/memtest86+.elf Found memtest86+ image: /boot/memtest86+.bin Warning: os-prober will not be executed to detect other bootable partitions. Systems on them will not be added to the GRUB boot configuration. Check GRUB_DISABLE_OS_PROBER documentation entry. done 如果你是在基于 RPM 的系统上（例如 Fedora），运行下面的命令来更新 GRUB ：$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg instead 重新启动你的系统。你就会看到更新后的 GRUB 主题。如果 GRUB 菜单没有出现。在打开硬件系统的电源时，立即按下 ESC 按键，直到启动菜单出现。这是我的 Ubuntu 22.04 LTS 桌面的默认 GRUB 菜单。这是更新后的带有复古主题的 GRUB 菜单。很酷，是吧？移除 GRUB 主题为移除一个主题，简单地删除主题文件夹：$ sudo rm -fr /boot/grub/themes/descent/ 接下来，编辑 /etc/default/grub 文件：$ sudo nano /etc/default/grub 移除下面的代码行：[...] GRUB_THEME=/boot/grub/themes/descent/theme.txt GRUB_GFXMODE=1280x800 [...] 保存文件并关闭它。最后，应用更改到 GRUB ，并重新启动你的系统：$ sudo update-grub $ sudo reboot 2、从 GitHub 安装 GRUB 主题如果一个 GRUB 主题托管在 GitHub 中，它很可能有安装程序脚本和卸载程序脚本。让我们以 Modern GRUB Themes 为例。它托管在 GitHub 中。使用 Git 复刻项目的 GitHub 存储库：$ git clone https://github.com/vinceliuice/grub2-themes.git 转到项目的文件夹：$ cd grub2-themes/ 运行安装程序脚本：$ sudo ./install.sh 选择你喜欢的 GRUB 主题背景（例如 tela）。选择图标样式：选择你的显示分辨率。现在选择将会安装和应用的 GRUB 主题。Checking for the existence of themes directory... Installing tela color 1080p theme... Setting tela as default... Updating grub config... Sourcing file `/etc/default/grub' Sourcing file `/etc/default/grub.d/init-select.cfg' Generating grub configuration file ... Found theme: /usr/share/grub/themes/tela/theme.txt Found linux image: /boot/vmlinuz-5.15.0-41-generic Found initrd image: /boot/initrd.img-5.15.0-41-generic Found linux image: /boot/vmlinuz-5.15.0-39-generic Found initrd image: /boot/initrd.img-5.15.0-39-generic Found memtest86+ image: /boot/memtest86+.elf Found memtest86+ image: /boot/memtest86+.bin Warning: os-prober will not be executed to detect other bootable partitions. Systems on them will not be added to the GRUB boot configuration. Check GRUB_DISABLE_OS_PROBER documentation entry. done * All done! * At the next restart of your computer you will see your new Grub theme: 'tela' 重新启动你的系统来查看更改。这是一个漂亮的 GRUB 主题，前所未见。你也可以明确地给定主题的名称和屏幕分辨率，像下面一样。$ sudo ./install.sh -t whitesur -s 1080p 这将应用一个名称为 “Whitesur” 的主题，使用 1080p 屏幕分辨率。你可能会提及到其它的分辨率，例如 2k 、4k 、超宽（ultrawide）、超宽 2k（ultrawide2k） 。如果你不提及分辨率，将默认采用 1080p 。安装 Tela 主题到 /boot/grub/themes 文件夹：$ sudo ./install.sh -b -t whitesur 重新启动你的系统来查看更改。移除 GRUB 主题为移除已安装的一个主题，转到项目的复刻目录：$ cd grub2-themes/ 随后，运行：$ sudo ./install.sh -r -t tela 使用你已安装的主题的名称来替换 tela 。请注意，每个主题的安装说明可能有所不同。详细地参考每个项目的 GitHub 页面，并相应地安装主题。总结有些人喜欢使用艺术化的 Linux 发行版。他们以美化其 Linux 发行版而感到高兴和自豪。如果你是他们中的一员，你可以看看 Gorgeous GRUB 项目来美化你的 GRUB 菜单。转到 Gorgeous GRUB 主题网站，从列表中选择你最喜欢的主题，并按照每个项目的主页说明来安装和应用 GRUB 主题。资源Gorgeous GRUB 的 GitHub 存储库via: https://ostechnix.com/change-grub-theme-in-linux/作者：sk 选题：lkxed 译者：robsean 校对：校对者ID本文由 LCTT 原创编译，Linux中国 荣誉推出
使用 Composerize 从 docker run 命令创建 Docker Compose 文件如果你每天在正式或个人系统中使用 Docker，你应该知道有一个有用的应用叫 Composerize。在这个简短的指南中，我们将了解什么是 Composerize，以及如何使用 Composerize 在 Linux 中将 docker run 命令转换为 Docker Compose 文件格式。什么是 Composerize？Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。Docker Compose 只是一个 YAML 文件，我们在其中为 Docker 应用定义服务、网络和卷。不是每个人都擅长写高效的 Docker Compose 文件。你们中的一些人可能会发现，甚至写一个简单的 Docker Compose 文件都很困难。不用担心! 看下 Composerize，它可以帮助你从 docker run 命令中创建 Docker Compose 文件。Composerize 是一个命令行和基于网络的工具，可以将 docker run 命令转换成 Docker Compose 文件。无论 docker run 命令是简单、简短还是冗长、复杂，都没有关系。你所要做的就是把命令传给 Conposerize。Composerize 会立即将 docker run 命令变成 Docker Compose 文件！在 Linux 中安装 ComposerizeComposerize 是作为一个网络服务提供的。所以你不需要在你的系统上安装它。如果你因为任何原因想在本地安装它，请继续阅读。Composerize 可以用 npm 安装。确保你的系统中已经安装了 Nodejs。如果没有安装，请按照下面的链接来安装 Nodejs。如何在 Linux 上安装 NodeJS安装完 Nodejs 后，运行以下命令来安装 Composerize：$ npm install composerize 该命令将只为当前用户安装 Composerize。如果你想在全局（全系统）安装它，请运行上述命令并加上 -g 选项，如下所示。$ npm install composerize -g 用 Composerize 将 Docker 命令转换为 Docker Compose 文件要将 docker run 命令转换为 Docker Compose 格式，只需用 Composerize 运行它，如下所示：$ composerize docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer 它将以 Docker Compose 文件格式生成内容。示例输出：version: '3.3' services: portainer: ports: - '9000:9000' volumes: - '/var/run/docker.sock:/var/run/docker.sock' image: portainer/portainer 现在在你的 docker-compose.yml 文件中复制上面几行。就这么简单！正如我所说，你也可以使用 Composerize 网络服务将 docker run 命令转换成 Docker Compose 格式。进入 https://www.composerize.com/，将 docker run 命令粘贴到框中，你就会立即得到 docker-compose.yml 文件！将命令转换为 Docker Compose 文件后，到你保存 docker-compose.yml 文件的位置，运行以下命令来启动 Docker 应用：$ docker-compose up Composerize 是对 Docker 用户有用的工具之一。你现在可以安全地告别漫无边际的 Docker 命令了。资源：Composerize GitHub 仓库via: https://ostechnix.com/convert-docker-run-commands-into-docker-compose-files/作者：sk 选题：lkxed 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
使用 Watchtower 自动更新 Docker 容器基础镜像对开发运维人员来说，保持 Docker 容器为最新版本是重要工作之一。手动更新 Docker 容器是一项耗时的工作。这篇文章解释了 Watchtower 是什么，如何安装它，以及在 Linux 中如何 使用 Watchtower 自动更新正在运行的 Docker 容器 。Watchtower 是什么？Watchtower 是一款自由开源的应用，用来监控运行中的 Docker 容器，并且当它发现基础镜像被更改后，可以自动的更新容器。若 Watchtower 发现一个运行中的容器需要更新，它会以发送 SIGTERM 信号的方式，优雅的结束运行中容器的运行。它会下载新镜像，然后以最初部署时使用的方式，重启容器。所有文件会在后台自动下载，因此不需要用户的介入。在这份指南中，我们将会明白如何在类 Unix 系统中使用 Watchtower 自动更新正在运行的 Docker 容器。我已经在 CentOS 和 Ubuntu 中测试了这份指南，所有的 Linux 发行版中操作过程都一样。在 Linux 中安装 Watchtower可以通过 Docker 镜像的方式下载 Watchtower 。因此，部署它是小事一桩。在你的 Linux 中安装 Docker 镜像，然后运行 Watchtower 立即开始监控 Docker 容器。参考下方指导在基于 PRM 和 DEB 包管理系统中安装 Docker如何在 CentOS 中安装 Docker如何在 Ubuntu 中安装 Docker适用于 Linux 的 Docker 桌面初学者手册安装 Docker 后，你可以使用以下命令以 root 用户身份部署 Watchtower 容器：# docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower 如果你已经安装了 Docker 桌面版，以普通用户运行 Watchtower 容器。$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower 该命令会拉取最新版的 watchtower 镜像，并运行 watchtower 容器。输出样例：Unable to find image 'containrrr/watchtower:latest' locally latest: Pulling from containrrr/watchtower 1045b2f97fda: Pull complete 35a104a262d3: Pull complete 1a0671483169: Pull complete Digest: sha256:bbf9794a691b59ed2ed3089fec53844f14ada249ee5e372ff0e595b73f4e9ab3 Status: Downloaded newer image for containrrr/watchtower:latest 91c104ef0e9896e8cd5ff30d9f13e728dbfad66443830ec2ac85dde6d7d37564 使用 Watchtower 自动更新 Docker 容器在你的系统上，Watchtower 正在和其他容器一起运行。你可以使用一下命令查看运行中的 Docker 容器列表：$ docker ps 输出样例：CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 91c104ef0e98 containrrr/watchtower "/watchtower" 14 minutes ago Up 14 minutes 8080/tcp watchtower f90b462b0712 bitnami/wordpress-nginx:6 "/opt/bitnami/script…" 19 minutes ago Up 19 minutes 0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp ostechnix-wordpress-1 正如上方输出所示，watchtower 容器正在和名为 ostechnix-wordpress-1 的容器一起运行。从现在开始，watchtower 会每隔几分钟会检查该容器。如果 Watchtower 发现该容器的基础镜像的任何变化，它会优雅的关闭 ostechnix-wordpress-1 容器，然后使用与最初启动它时使用的相同方式，启动新的镜像。类似的，它会自动地每隔几分钟检查所有的运行中容器，并自动更新它们。Watchtower 如何更新多连接的容器？在监视多连接容器时，Watchtower 十分智能。假设我们现在运行两个容器。$ docker ps 输出样例：CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 91c104ef0e98 containrrr/watchtower "/watchtower" 14 minutes ago Up 14 minutes 8080/tcp watchtower f90b462b0712 bitnami/wordpress-nginx:6 "/opt/bitnami/script…" 19 minutes ago Up 19 minutes 0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp ostechnix-wordpress-1 a895f082438a bitnami/mariadb:10.6 "/opt/bitnami/script…" 20 minutes ago Up 19 minutes 3306/tcp ostechnix-mariadb-1 正如你看到的，我们正在运行 ostechnix-wordpress-1 和 ostechnix-mariadb-1 这两个容器。ostechnix-mariadb-1 容器链接到 ostechnix-wordpress-1 容器。如果 Watchtower 发现 ostechnix-wordpress-1 容器有个新版本，它会先关闭与之相连接的 ostechnix-mariadb-1 容器 ，然后才会关闭 ostechnix-wordpress-1 容器。更新 ostechnix-wordpress-1 容器后，Watchtower 会以正确的顺序，且与最初启动它们时使用的相同方式，重启这两个容器，以便应用程序正确恢复。在我们的例子中，首先启动的是 ostechnix-mariadb-1 容器，然后是 ostechnix-wordpress-1 容器，以确保连接能够继续运行。监控特定容器默认情况下，Watchtower 将监控在它所指向的 Docker 守护进程中运行的所有 Docker 容器。不过，你可以像下面这样，通过指定容器名称限制 Watchtower 监视特定的 Docker 容器。$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower ostechnix-wordpress-1 在上方的例子中，watchtower 会忽略其他容器，只监视名为 ostechnix-wordpress-1 的容器更新情况。如果你不指定任何参数，Watchtower 会照常监视所有运行中的 Docker 容器。发送提示或许你想收到容器更新的通知。你可以通过电子邮件、Slack 、MSTeams 以及 Gotify 发送通知。下面这个例子展示了如何通过电子邮件发送通知。假设你已经设置了 SMTP 服务器。docker run -d \ --name watchtower \ -v /var/run/docker.sock:/var/run/docker.sock \ -e WATCHTOWER_NOTIFICATIONS=email \ -e WATCHTOWER_NOTIFICATION_EMAIL_FROM=fromaddress@gmail.com \ -e WATCHTOWER_NOTIFICATION_EMAIL_TO=toaddress@gmail.com \ -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.gmail.com \ -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587 \ -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=fromaddress@gmail.com \ -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=app_password \ -e WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2 \ containrrr/watchtower 参考下方 Watchtower Github 仓库和 Watchtower 官方主页获取更多信息：资料Watchtower GitHubWatchtower 主页via: https://ostechnix.com/automatically-update-running-docker-containers/作者：sk 选题：lkxed 译者：Donkey 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
在这份指南中，我们将看到 Dockerfile 的简要介绍以及如何在 Linux 中使用 Dockerfile 来自动的 创建自定义 Docker 镜像 。什么是 Dockerfile ？Dockerfile 是附有构建 Docker 镜像说明的易于理解的文本文件。它囊括了用户在创建镜像时可以调用的所有命令。我们可以使用 Dockerfile 创建自定义的镜像。可以通过 Docker Hub 分享的自定义 Docker 镜像。如果你还不知道，Docker Hub 是 Docker 提供的托管存储库服务，用于团队查找和共享容器镜像，当然世界上任何人也都可以访问。想象一下，早期如果我们想用 Nginx，我们要通过很多步骤，才能安装和配置好 Nginx 。得益于 Docker Hub ，现在我们可以在几分钟内，下载并运行 Nginx 的预置容器镜像。运行如下命令从 Docker Hub 上拉取 Nginx 镜像：# docker pull nginx 一旦我们拉取了 Docker 镜像，可以运行如下命令使用它：# docker run -it -d -p 8080:8080 nginx 就这样，十分简单！参考下方链接，了解更多使用 Docker 的方式：开始使用 DockerDocker Hub 上有超过十万个来自软件供应商、开源项目以及社区的容器镜像。你可以从 Docker Hub 上下载你选择的镜像，并且使用上面的命令开始使用它。理解 Dockerfile 格式Docker 可以读取 Dockerfile 中的 指令 来自动的创建镜像。典型的 Dockerfile 包含如下指令：1、FROM —— 这会设置容器的基础镜像。例如：FROM ubuntu:22.04 这会将容器的基础镜像设置为 Ubuntu 。如果 ‘22.04’ 这个标志没有特别指明，则会设为最新版本（latest）。2、LABEL —— 这是用来明确镜像的元数据信息的键值对。例如：LABEL ENV=“DEVELOPMENT” 3、RUN —— 这会在基础镜像中执行指令并创建一个新层。例如：RUN apt-get update RUN apt-get install tomcat 4、CMD —— 这用来设置容器启动后先执行的命令。例如：CMD ["java", "-jar", "app.jar"] 5、EXPOSE —— 设置用于访问容器的端口。容器将会监听该端口。我们可以用来获得输出。例如：EXPOSE 8080 6、`MAINTAINER —— 显示创建镜像作者的信息。例如：MAINTAINER info@ostechnix.com 7、ENV —— 用来设置环境变量的键值对。这些变量在镜像创建的时候设置，并在容器创建好后可以使用。例如：ENV DB_NAME=”MySQL” ENV DB_VERSION=”8.0” 8、COPY —— 用来拷贝本地文件至容器中。例如：COPY /target/devops.jar devops.jar 9、ADD —— 具有与拷贝相同的功能，不过更进一步还可以提取本地的 tar 文件或者从 URL 拷贝文件。例如：ADD devops.tar.xz / . ADD http://example.com/abc.git /usr/local/devops/ 10、ENTRYPOINT —— 用来设置镜像的主要命令。与 CMD 指令功能相同。不同的是 ENTRYPOINT 中的指令不会被重写。例如：ENTRYPOINT ["java", "-jar", "app.jar"] 11、VOLUME —— 该指令用来创建指定位置的挂载点。例如：VOLUME /app/devops 12、USER —— 将设置运行镜像并使用的用户名称以及用户组。例如：USER dhruv USER admin 13、WORKDIR —— 这会设置工作目录。如果目录不存在，则会创建。例如：WORKDIR /var/lib/ 这是一个 Dockerfile 的样本，可以参考一下：FROM ubuntu:latest MAINTAINER Senthilkumar Palani "info@ostechnix.com" RUN apt-get install -y software-properties-common python RUN add-apt-repository ppa:chris-lea/node.js RUN echo "deb http://us.archive.ubuntu.com/ubuntu/ jammy universe" >> /etc/apt/sources.list RUN apt-get update RUN apt-get install -y nodejs RUN mkdir /var/www ADD app.js /var/www/app.js CMD ["/usr/bin/node", "/var/www/app.js"] 我将向你展示创建一个 Dockerfile 、创建并使用镜像的简单例子。创建一个 Dockerfile创建一个名为 dockerfile 的文件：# nano dockerfile 添加下面几行命令。我们将更新并安装 vim 和 curl 包：FROM alpine RUN apk update RUN apk add vim RUN apk add curl 按下 CTRL+O 和 CTRL+X 键保存文件并关闭。现在 Dockerfile 已经就位。让我们继续，用该 Dockerfile 创建一个镜像。注意： 如果你在使用 Docker 桌面版，你可以以一个普通用户运行 docker 命令。使用 Dockerfile 创建 Docker 镜像只需运行以下命令，便可以使用 Dockerfile 创建 Docker 镜像：# docker build -t alpine . 请注意最后有一个 点（.）。输出示例：[+] Building 51.2s (8/8) FINISHED => [internal] load build definition from Dockerfile 0.1s => => transferring dockerfile: 104B 0.0s => [internal] load .dockerignore 0.1s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/alpine:latest 38.8s => [1/4] FROM docker.io/library/alpine@sha256:7580ece7963bfa863801466c0a 2.7s => => resolve docker.io/library/alpine@sha256:7580ece7963bfa863801466c0a 0.0s => => sha256:d7d3d98c851ff3a95dbcb70ce09d186c9aaf7e25d48 1.47kB / 1.47kB 0.0s => => sha256:530afca65e2ea04227630ae746e0c85b2bd1a179379 2.80MB / 2.80MB 2.4s => => sha256:7580ece7963bfa863801466c0a488f11c86f85d9988 1.64kB / 1.64kB 0.0s => => sha256:9b2a28eb47540823042a2ba401386845089bb7b62a9637d 528B / 528B 0.0s => => extracting sha256:530afca65e2ea04227630ae746e0c85b2bd1a179379cbf2b 0.2s => [2/4] RUN apk update 4.3s => [3/4] RUN apk add vim 3.5s => [4/4] RUN apk add curl 1.3s => exporting to image 0.4s => => exporting layers 0.4s => => writing image sha256:14231deceb6e8e6105d2e551799ff174c184e8d9be8af 0.0s => => naming to docker.io/library/alpine 0.0s Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them 按照上面的命令， Docker 会通过保存在当前工作目录中的 Dockerfile 中的命令开始自动的创建镜像。还记得我们在 Dockerfile 中保存的 apk update、apk add vim 和 apk add curl 命令吗？这些命令也将会自动的执行。如果 Dockerfile 保存在其他目录，你可以使用 -f 标志来指定路径，例如：# docker build -f /path/to/a/Dockerfile . 创建好镜像后，我们可以使用如下命令运行它：# docker run -it alpine 该命令会启动这个 Alpine 容器并连接到它。/ # uname -a Linux 8890fec82de8 5.10.104-linuxkit #1 SMP Thu Mar 17 17:08:06 UTC 2022 x86_64 Linux / # cat /etc/alpine-release 3.16.1 / # 如果你使用 Docker 桌面版，你可以通过 容器 Containers 标签页界面来查看运行中的容器。这就是使用 Dockerfile 构建自定义容器映像的方式。我们仅仅讲了基础内容。你可以用 Dockerfile 做到很多东西。建议你参考一下官方 Dockerfile 参考 ，以了解更多内容。via: https://ostechnix.com/a-brief-introduction-to-dockerfile/作者：sk 选题：lkxed 译者：Donkey 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出