SK 发布的文章

作为一位 Linux 管理员,你需要跟踪所有用户的活动。当服务器发生故障时,你可以分析和查看用户活动,以便寻找问题的根源。监控 Linux 用户有多种方式。本指南将专门讨论 GNU 记账工具,这是一项用于监视 Linux 用户活动的实用工具。

什么是记账工具?

记账工具可以提供诸如 Linux 系统中的连接、已执行的程序以及系统资源的使用等有底系统使用信息。这些记账工具可以通过 psacctacct 软件包安装。

psacctacct 实际上是相同的。在基于 RPM 的系统中,它以 psacct 的形式存在;而在基于 DEB 的系统中,它作为 acct 提供。

你可能想知道 psacctacct 工具的作用。通常,用户在命令行的历史记录会保存在他们的 $HOME 目录下的 .bash_history 文件中。有些用户可能会尝试编辑、修改或删除这些历史记录。

然而,即使他们完全 清除了命令行历史,记账工具依然能够获取用户活动信息。这是因为,所有进程记账文件都由 root 用户拥有,而普通用户则无法进行编辑。

Linux 中如何安装 psacct 或 acct

psacct/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 记账实用程序,以便注意所有用户的行为。在故障排除时,这些实用程序会非常有帮助。

资源

(题图: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,强制安装 ventoysdb。当你使用小写的 -i,若此时磁盘已经安装了 ventoy ,它会安装失败。

要启用安全启动支持,使用 -s 参数。默认情况下,这个选项是关掉的。

$ sudo sh Ventoy2Disk.sh -I -s /dev/sdb

你将被提示确认 USB 启动盘的创建过程。仔细检查 U 盘的名称,并输入 Y,按回车键继续:

样例输出:

**********************************************
      Ventoy: 1.0.77  x86_64
      longpanda [email protected]
      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.

在 Linux 操作系统中用 Ventoy 创建多重引导的 U 盘

几秒钟后,多重启动的 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 文件复制到用 Ventoy 创建的 USB 启动盘上

你甚至可以为不同的 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 的多重启动菜单

选择你想启动的操作系统,并按下回车键加载它!

下面是用 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 图形用户界面

Ventoy 会自动为你选择已插入的 U 盘。但是我建议你确认所选择的是否真的是你想格式化的 U 盘。

使用 Ventoy 图形用户界面创建多重启动的 U 盘

你将被提示确认该过程。点击 “OK” 继续。

Ventoy 选项和语言

从菜单栏中点击 选项 Option 按钮。

Ventoy 选项

选项 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 按钮。

更新 Ventoy

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 模式启用时,你会在右上角看到通知。

启用 Ventoy 的内存盘模式

现在,ISO 将被加载到内存中:

在 Ventoy 中加载 ISO 到内存

请再次按 F1 键以切换回正常模式。

创建持久化的可引导 U 盘

我们现在知道了如何在 Linux 中用 Ventoy 创建多重启动的 U 盘。我们可以使用这个可引导的 USB 启动盘来测试 Linux 发行版,而不必真的在硬盘上安装它们。

当你使用 立付 Live OS 时,你可以做各种事情,如安装应用程序、下载文件、播放媒体文件、创建文件和文件夹、按照你的喜好定制等等。

然而,一旦你重新启动系统,所有上述变化都将消失。如果你想让所有的改变在重启系统后仍然保留,你应该创建一个持久化的可引导的 U 盘。

Ventoy 能够制作持久化的 USB 启动盘。请参考下面的链接学习怎么做。

在 Linux 中使用 Ventoy 创建持久化的可引导 U 盘

总结

信不信由你,Ventoy 是我用过的在 Linux 中创建多重引导(持久或非持久)的 USB 闪存盘工具中最简单、最快速、最巧妙的之一。

它真的做到了开箱即用!试一下吧,你不会失望的!

与 Ventoy 有关的安全问题

Ventoy 网站、论坛和该网站上的一些文件被一些杀毒软件标记为恶意软件或木马。请查看这些发布在该项目 GitHub 页面中的议题:

然而,Manjaro 打包者 Linux Aarhus 在代码审查后认为:没有合理的理由怀疑这个应用程序的安全性。

他声称 “没有混淆的代码”。所以,我觉得 Ventoy 是可以安全使用的。

资源

(题图: 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中国 荣誉推出

在网络上文件传输可以通过各种不同的方式和协议来完成。远程复制文件最常用的协议是 RsyncSCPSFTP。在本文中,我们将了解什么是 SCP 以及如何在 Linux 和类 Unix 操作系统中使用 SCP 在本地和远程计算机之间安全地传输文件

什么是 SCP?

SCP,代表 安全复制 Secure Copy ,它是一个命令行程序,在 Linux 和类 Unix 操作系统中以安全的方式在本地和远程系统之间,或在两个远程系统之间复制文件和目录。

使用 scp 命令,你可以安全地复制文件或目录:

  • 从本地到远程系统
  • 从远程系统到本地
  • 在两个远程系统之间

使用 scp 命令传输数据时,文件和目录都是加密的。因此,即使网络被破坏,作恶者也无法获得任何有意义的数据。

SCP 是 openSSH 程序的一个组件,它使用 SSH 协议安全地传输文件。几乎所有现代 Linux 和 Unix 发行版都预装了 OpenSSH,所以不必费心安装它。

提醒一句:

根据 openSSH 开发人员的官方公告

scp 协议已经过时了,它不灵活且不易修复。我们建议使用更现代的协议,如 sftprsync 来代替。

参考 - 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 limitl 代表 限制 Limit 带宽。通过此参数,可以设置传输数据的最大带宽。它的单位是 Kbit/s
  • -F <ssh_config>:有时你可能需要使用不同的网络来连接到 Linux 系统,或你有一个代理服务器,这种情况下,你可以使用 -F 参数使用不同的 ssh_config 文件 File
  • -P portP 代表 端口 Port 。注意,这是大写的 P。默认情况下,SSH 使用端口 22。但出于安全原因,你可能已经更改了目标主机中的端口号。这种情况下,你应该使用 -P 参数显示指定新端口号。
  • -p:如果希望 保留 Preserve 原始文件的修改时间、访问时间和模式,你需要使用 -p 参数。注意是小写 p
  • -r 递归 Recursively 复制整个目录。
  • -BB 代表 批处理 Batch 模式。它用于在传输文件时选择批处理模式。可以防止询问密码。
  • -S program:用于加密连接的 程序 Program 名称。
  • -vv 代表 详细 Verbose 。当使用 -v 参数时,命令将会在终端屏幕上打印进度。你会看到文件传输时到底发生了什么。它在调试连接、身份验证和配置问题时非常有用。

SCP 有很多参数,你可以查看它的手册页来了解其他参数。让我们看一些有用的 scp 命令示例

开始前要记住的重要事项

  • scp 命令依赖于 ssh 进行安全的文件传输。因此,你必须有一个 ssh 密钥密码才能向远程系统进行身份验证。
  • 为了能传输文件,你必须对源文件有读权限,对目标位置有写权限
  • scp 命令在写入前不会检查目标位置。目标位置中具有相同名称的任何文件都将被覆盖而不通知
  • 为了能够区分本地和远程位置,使用冒号:)。
  • 传输大文件时,建议在 ScreenTmux 会话内启动任务。

在 Linux 中使用 SCP 传输文件

正如我所说,我们可以使用 scp 命令将文件或目录从本地复制到远程系统,反之亦然,或者在两台远程系统之间复制文件或目录。

1. 使用 SCP 从本地系统复制文件到远程系统

使用 scp 命令将文件从本地复制到远程系统,运行:

$ scp File1.txt [email protected]:/home/ostechnix/

示例输出:

[email protected]'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 [email protected]:/home/ostechnix/myfile.txt

将文件从本地复制到远程系统

2. 使用 SCP 从本地系统复制多个文件到远程系统

使用 scp 命令将多个文件从本地系统传输到远程系统,运行:

$ scp File1.txt File2.txt [email protected]:/home/ostechnix/

示例输出:

[email protected]'s password: 
File1.txt                                                    100%  104   689.4KB/s   00:00    
File2.txt                                                    100%  496     6.3MB/s   00:00

从本地复制多个文件到远程系统

这里:

  • File1.txtFile2.txt - 源文件名
  • [email protected] - 远程系统的用户名和 IP 地址
  • /home/ostechnix - 目标文件的路径

如果文件具有相同的扩展名,你可以使用以下替代命令来实现相同的目标。

$ scp {File1,File2}.txt [email protected]:/home/ostechnix/

或者,

$ scp *.txt [email protected]:/home/ostechnix/

3. 使用 SCP 从本地到远程系统递归复制目录

递归地将整个目录(包括子目录及其内容)从本地复制到远程系统,使用 -r 参数。

$ scp -r Documents/ [email protected]:/home/ostechnix/

从本地复制目录到远程系统

上述命令将整个 Documents 目录包括其内容复制到目标系统。

其中,

  • -r - 递归复制文件和目录,包括子目录及其内容
  • Documents - 源目录名称
  • [email protected] - 远程系统的用户名和 IP 地址
  • /home/ostechnix - 目标目录的路径

4. 用 SCP 将文件从远程系统传输到本地

还记得我们从本地系统复制了 File1.txt 到远程系统,让我们把它复制回本地。

使用 scp 命令从远程系统复制文件到本地,运行:

$ scp [email protected]:/home/ostechnix/File1.txt Downloads/

其中

  • [email protected] - 远程系统的用户名和 IP 地址
  • /home/ostechnix/File.txt - 远程系统文件的绝对路径
  • Downloads - 本地保存复制文件的位置

从远程系统传输文件到本地

5. 使用 SCP 将多个文件从远程系统传输到本地

将多个文件从远程系统复制到本地,在花括号内注明文件的绝对路径,如下所示:

$ scp [email protected]:/home/ostechnix/\{File1.txt,File2.txt\} Downloads/

将多个文件从远程系统传输到本地

上述命令将从远程系统的 /home/ostechnix/ 目录中复制 File1.txtFile2.txt 到本地的 Downloads 目录中。

注意,花括号内的逗号后面没有空格

6. 从远程系统递归复制目录到本地

使用 scp 从远程系统递归复制整个目录(包括子目录及其内容)到本地系统,使用 -r 参数。

$ scp -r [email protected]:/home/ostechnix/Documents Downloads/

上述命令将从远程系统将整个 Documents 目录复制到本地的 Downloads 目录。

7. 使用 SCP 在两台远程计算机之间复制文件

使用 scp 命令将文件从一个远程系统直接复制到另一个远程系统,运行:

$ scp [email protected]:/home/senthil/File1.txt [email protected]:/home/kumar/

它会要求你输入两个远程系统的密码:

其中,

  • [email protected] - 文件源端远程系统的用户名和 IP 地址
  • /home/senthil/File1.txt - 复制的文件名及其位置
  • [email protected] - 复制文件到目标端的用户名和 IP 地址
  • /home/kumar - 在目标端上保存复制文件的位置

上述命令将从远程主机 192.168.1.40 复制 /home/senthil/File1.txt192.168.1.20 上的 /home/kumar/ 目录。

在这种方法中,数据将直接从一个远程系统传输到另一个远程系统。如果你想通过本地机器路由流量,使用 -3 参数,如下所示:

$ scp -3 [email protected]:/home/senthil/File1.txt [email protected]:/home/kumar/

8. 使用 SCP 复制文件时启用压缩

到目前为止,我们在没有压缩的情况下传输了文件。现在我们将使用 -C 参数在传输文件时启用压缩。

$ scp -C File1.txt [email protected]:/home/ostechnix/

-C 参数将在源端启用压缩,并在目标端自动解压数据。

通过启用压缩,可以显著提高文件复制或传输速度。

9. 使用 SCP 传输文件时限制带宽

我们可以使用 -l 参数限制带宽。注意,最大带宽单位为 Kbits/s。1 Byte = 8 bit。因此,如果你想将带宽限制在 200KB/s,-l 的值将是 1600(200*8)。

$ scp -l 1600 File1.txt [email protected]:/home/ostechnix/

这在传输大文件时非常有用,可以防止 SCP 限制带宽。

10. 使用 SCP 复制文件时使用不同端口

作为系统管理员,出于安全原因,你可能在远程服务器上 更改了 SSH 协议的默认端口。这种情况下,你可以在传输文件时使用 -P 参数指定端口号。注意:大写的 P

$ scp -P 2022 File1.txt [email protected]:/home/ostechnix/

11. 使用 SCP 复制文件时使用不同的加密方法

默认情况下,SCP 使用 AES-128 对文件进行加密。如果你想使用不同的加密方法,使用 c 参数。

例如,如果你想使用 3des-cbc 加密方法,命令如下所示:

$ scp -c 3des-cbc File1.txt [email protected]:/home/ostechnix/

要查看支持的密码列表,执行:

$ ssh -Q cipher localhost | paste -d, -s -

示例输出:

3des-cbc,aes128-cbc,aes192-cbc,aes256-cbc,[email protected],aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected],[email protected]

12. 在详细模式下使用 SCP 复制文件

如果你想知道使用 scp 复制文件时幕后发生了什么,你可以使用 -v 参数。使用详细模式传输文件时,终端上会显示执行 scp 命令执行的每一步过程。这在故障排除时很方便。

$ scp -v File1.txt [email protected]:/home/ostechnix/

在详细模式下发送文件时,你将看到大量输出,如下所示:

在详细模式下使用 SCP 复制文件

13. 在安静模式下使用 SCP 传输文件

我们可以使用 -q 参数在安静模式下传输文件。在安静模式下共享文件时,不会在输出中显示进度、警告或诊断信息。

$ scp -q File1.txt [email protected]:/home/ostechnix/

14. 使用 SCP 传输文件时保留文件属性

使用 -p 参数可以保留文件修改时间、访问时间和模式等文件属性。注意,这是小写的 p

$ scp -p File1.txt [email protected]:/home/ostechnix/

15. 使用 SCP 复制文件时使用身份文件

SSH 同时支持基于密码和密钥的身份验证。密钥是 Linux 环境中使用最广泛的身份验证方法。

如果你想在传输文件时使用基于密钥的身份验证,使用 -i 参数指定身份文件或私钥。

$ scp -i my_private_key.pem File1.txt [email protected]:/home/ostechnix/

16. 使用不同的 ssh 配置文件

在某些情况下,你需要使用不同的网络来连接到 Linux 系统,或你有一个代理服务器。这在情况下,你可以配合 -F 参数使用不同的 ssh_config 文件。

$ scp -F /home/ostechnix/my_ssh_config File1.txt [email protected]:/home/ostechnix/

17. 使用 IPv4 或 IPv6 复制文件

在复制文件时,我们可以强制 SCP 只使用 IPv4 或 IPv6 地址。IPv4 网络添加 -4 参数,IPv6 网络添加 -6 参数可以实现这一点。

$ scp -6 File1.txt [email protected]:/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 [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中国 荣誉推出

Linux 下查找网关或路由器 IP 地址的 5 种方法。

网关 是一个节点或一个路由器,当连接到同一路由器时,它允许两个或多个 IP 地址不同的主机相互通信。如果没有网关,它们将无法相互通信。换句话说,网关充当接入点,将网络数据从本地网络传输到远程网络。在本指南中,我们将看到在 Linux 和 Unix 中从命令行找到默认网关的所有可能方法。

在 Linux 中查找默认网关

Linux 中有各种各样的命令行工具可用于查看网关 IP 地址。最常用的工具是:ipssnetcat。我们将通过示例了解如何使用每种工具查看默认网关。

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 routeawk 命令打印网关地址,执行命令:

$ ip route | awk '/^default/{print $3}'

(LCTT 译注:wsl1 上无输出结果,正常 Linux 发行版无问题)

或者:

$ ip route show default | awk '{print $3}'

这将只列出网关 IP:

示例输出:

192.168.1.101

使用 ip 命令列出默认网关

你也可以使用 grep 命令配合 ip route 对默认网关进行过滤。

使用 ip routegrep 查找默认网关 IP 地址,执行命令:

$ ip route | grep default
default via 192.168.1.101 dev eth0 proto static metric 100

在最新的 Linux 发行版中,ip route 是查找默认网关 IP 地址的推荐命令。然而,你们中的一些人可能仍然在使用传统的工具,如 routenetstat。旧习难改,对吧?下面的部分将介绍如何在 Linux 中使用 routenetstat 命令确定网关。

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

使用 route 命令显示默认网关 IP 地址

如你所见,网关 IP 地址是 192.168.1.101。你还将在 Flags 下面看到两个字母 UG。字母 U 代表接口是 “Up”(在运行),G 表示 “Gateway”(网关)。

3、使用 netstat 命令查看网关 IP 地址

netstat 会输出 Linux 网络子系统的信息。使用 netstat 工具,我们可以在 Linux 和 Unix 系统中打印网络连接、路由表、接口统计信息、伪装连接和组播成员关系。

netstatnet-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 命令查看网关 IP 地址

netstat 命令与 route 命令的输出信息相同。如上输出可知,网关的 IP 地址为 192.168.1.191UG 表示网关连接的网卡是有效的,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

使用 routel 命令打印默认网关或路由器 IP 地址

只打印默认网关,和 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 以 root 身份运行目录中的命令。在这篇指南中,我们将学习如何在 Linux 中 防止 sudo 运行的命令使用参数。即我们允许一个用户使用 sudo 运行特权级命令,但是 不带命令行参数

背景介绍

你已经知道了,每个命令执行一个特定操作有不同的选项。让我们以 ls 命令为例。

ls 命令会罗列文件夹中的内容,对吗?没错。ls 命令附带了一些命令行选项和标志。例如,你可以用 ls 命令的 -a 标志罗列文件夹中的所有内容(包括隐藏文件)。

在这份简要指南中,我们将明白如何允许用户通过 sudo 运行 ls 命令,但是不能使用命令行选项或者标志。我讲清楚了吗?接下来让我来展示一下如何做到这点。

防止使用 sudo 参数

root 用户身份编辑 /etc/sudoers 文件:

[root@Almalinux8CT ~]# visudo

添加下面一行:

user1   ALL=(root)      /usr/bin/ls ""

Deny Command Arguments With Sudo

要注意这里 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

Prevent Command Arguments With Sudo

防止所有用户使用命令参数

上述例子像你展示了如何阻止用户以管理员身份运行带有参数的命令。你是否想要对所有用户应用该规则呢?很简单!只需要在 /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中国 荣誉推出