分类 技术 下的文章

在 Linux 系统中有一些其他开源项目可以结合或者替代 cron 系统使用。

 title=

Linux cron 系统 是一项经过时间检验的成熟技术,然而在任何情况下它都是最合适的系统自动化工具吗?答案是否定的。有一些开源项目就可以用来与 cron 结合或者直接代替 cron 使用。

at 命令

cron 适用于长期重复任务。如果你设置了一个工作任务,它会从现在开始定期运行,直到计算机报废为止。但有些情况下你可能只想设置一个一次性命令,以备不在计算机旁时该命令可以自动运行。这时你可以选择使用 at 命令。

at 的语法比 cron 语法简单和灵活得多,并且兼具交互式和非交互式调度方法。(只要你想,你甚至可以使用 at 作业创建一个 at 作业。)

$ echo "rsync -av /home/tux/ me@myserver:/home/tux/" | at 1:30 AM

该命令语法自然且易用,并且不需要用户清理旧作业,因为它们一旦运行后就完全被计算机遗忘了。

阅读有关 at 命令 的更多信息并开始使用吧。

systemd

除了管理计算机上的进程外,systemd 还可以帮你调度这些进程。与传统的 cron 作业一样,systemd 计时器可以在指定的时间间隔触发事件,例如 shell 脚本和命令。时间间隔可以是每月特定日期的一天一次(例如在星期一的时候触发),或者在 09:00 到 17:00 的工作时间内每 15 分钟一次。

此外 systemd 里的计时器还可以做一些 cron 作业不能做的事情。

例如,计时器可以在一个事件 之后 触发脚本或程序来运行特定时长,这个事件可以是开机,可以是前置任务的完成,甚至可以是计时器本身调用的服务单元的完成!

如果你的系统运行着 systemd 服务,那么你的机器就已经在技术层面上使用 systemd 计时器了。默认计时器会执行一些琐碎的任务,例如滚动日志文件、更新 mlocate 数据库、管理 DNF 数据库等。创建自己的计时器很容易,具体可以参阅 David Both 的文章 使用 systemd 计时器来代替 cron

anacron 命令

cron 专门用于在特定时间运行命令,这适用于从不休眠或断电的服务器。然而对笔记本电脑和台式工作站而言,时常有意或无意地关机是很常见的。当计算机处于关机状态时,cron 不会运行,因此设定在这段时间内的一些重要工作(例如备份数据)也就会跳过执行。

anacron 系统旨在确保作业定期运行,而不是按计划时间点运行。这就意味着你可以将计算机关机几天,再次启动时仍然靠 anacron 来运行基本任务。anacron 与 cron 协同工作,因此严格来说前者不是后者的替代品,而是一种调度任务的有效可选方案。许多系统管理员配置了一个 cron 作业来在深夜备份远程工作者计算机上的数据,结果却发现该作业在过去六个月中只运行过一次。anacron 确保重要的工作在 可执行的时候 发生,而不是必须在安排好的 特定时间点 发生。

点击参阅关于 使用 anacron 获得更好的 crontab 效果 的更多内容。

自动化

计算机和技术旨在让人们的生活更美好,工作更轻松。Linux 为用户提供了许多有用的功能,以确保完成重要的操作系统任务。查看这些可用的功能,然后试着将这些功能用于你自己的工作任务吧。(LCTT 译注:作者本段有些语焉不详,读者可参阅譬如 Ansible 自动化工具安装、配置和快速入门指南 等关于 Linux 自动化的文章)


via: https://opensource.com/article/21/7/alternatives-cron-linux

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

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

在 Linux 上安装好“虚拟专用网络” 之后,是时候使用它了。

 title=

0penVPN 在两点之间创建了一个加密通道,以阻止第三方访问你的网络流量数据。通过设置你的 “虚拟专用网络” 服务,你可以成为你自己的 “虚拟专用网络” 服务商。许多流行的 “虚拟专用网络” 服务都使用 0penVPN,所以当你可以掌控自己的网络时,为什么还要将你的网络连接绑定到特定的提供商呢?

本系列的 第一篇文章 安装了一个“虚拟专用网络” 的服务器,第二篇文章 介绍了如何安装和配置一个 0penVPN 服务软件,第三篇文章 解释了如何配置防火墙并启动你的 0penVPN 服务。第四篇也是最后一篇文章将演示如何从客户端计算机使用你的 0penVPN 服务器。这就是你做了前三篇文章中所有工作的原因!

创建客户端证书

请记住,0penVPN 的身份验证方法要求服务器和客户端都拥有某些东西(证书)并知道某些东西(口令)。是时候设置它了。

首先,为你的客户端计算机创建一个客户端证书和一个私钥。在你的 0penVPN 服务器上,生成证书请求。它会要求你输入密码;确保你记住它:

$ cd /etc/openvpn/ca
$ sudo /etc/openvpn/easy-rsa/easyrsa \
  gen-req greglaptop

本例中,greglaptop 是创建证书的客户端计算机主机名。

无需将请求导入证书颁发机构(CA),因为它已经存在。审查它以确保请求存在:

$ cd /etc/openvpn/ca
$ /etc/openvpn/easy-rsa/easyrsa \
  show-req greglaptop

你也可以以客户端身份签署请求:

$ /etc/openvpn/easy-rsa/easyrsa \
  sign-req client greglaptop

安装 0penVPN 客户端软件

在 Linux 系统上,网络管理器可能已经包含了一个 0penVPN 客户端。如果没有,你可以安装插件:

$ sudo dnf install NetworkManager-openvpn

在 Windows 系统上,你必须从 0penVPN 下载网页下载和安装 0penVPN 客户端。启动安装程序并按照提示操作。

复制证书和私钥到客户端

现在你的客户端需要你为其生成的身份验证凭据。你在服务器上生成了这些,因此你必须将它们传输到你的客户端。我推荐使用 SSH 来完成传输。在 Linux 系统上,通过 scp 命令实现。在 Windows 系统上,你可以以管理员身份运行 WinSCP 来推送证书和密钥。

假设客户端名称为 greglaptop,那么证书和私钥的文件名以及服务的位置如下:

/etc/openvpn/ca/pki/issued/greglaptop.crt
/etc/openvpn/ca/pki/private/greglaptop.key
/etc/openvpn/ca/pki/issued/ca.crt

在 Linux 系统上,复制这些文件到 /etc/pki/tls/certs 目录。在 Windows 系统上,复制它们到 C:\Program Files\OpenVPN\config 目录。

复制和自定义客户端配置文件

在 Linux 系统上,你可以复制服务器上的 /etc/openvpn/client/OVPNclient2020.ovpn 文件到 /etc/NetworkManager/system-connections/ 目录,或者你也可以导航到系统设置中的网络管理器添加一个“虚拟专用网络” 连接。

连接类型选择“ 证书(TLS) Certificates(TLS) ”。告知网络管理器你从服务器上复制的证书和密钥。

 title=

在 Windows 系统上,以管理员身份运行 WinSCP,将服务器上的客户端配置模板 /etc/openvpn/client/OVPNclient2020.ovpn 文件复制到客户端上的 C:\Program Files\OpenVPN\config 目录。然后:

  • 重命名它以匹配上面的证书。
  • 更改 CA 证书、客户端证书和密钥的名称以匹配上面从服务器复制的名称。
  • 修改 IP 信息,以匹配你的网络。

你需要超级管理员权限来编辑客户端配置文件。最简单的方式就是以管理员身份启动一个 CMD 窗口,然后从管理员 CMD 窗口启动记事本来编辑此文件。

将你的客户端连接到服务器

在 Linux 系统上,网络管理器会显示你的 “虚拟专用网络” 连接。选择它进行连接。

 title=

在 Windows 系统上,启动 0penVPN 图形用户界面。它会在任务栏右侧的 Windows 系统托盘中生成一个图标,通常位于 Windows 桌面的右下角。右键单击图标以连接、断开连接或查看状态。

对于第一次连接,编辑客户端配置文件的 remote 行以使用 0penVPN 服务器的内部 IP 地址。通过右键单击 Windows 系统托盘中的 0penVPN 图标并单击“ 连接 Connect ”,从办公室网络内部连接到服务器。调试此连接,这应该可以找到并解决问题,而不会出现任何防火墙问题,因为客户端和服务器都在防火墙的同一侧。

接下来,编辑客户端配置文件的 remote 行以使用 0penVPN 服务器的公共 IP 地址。将 Windows 客户端连接到外部网络并进行连接。调试有可能的问题。

安全连接

恭喜!你已经为其他客户端系统准备好了 0penVPN 网络。对其余客户端重复设置步骤。你甚至可以使用 Ansible 来分发证书和密钥并使其保持最新。

本文基于 D.Greg Scott 的 博客,经许可后重新使用。


via: https://opensource.com/article/21/7/openvpn-client

作者:D. Greg Scott 选题:lujun9972 译者:perfiffer 校对:wxy

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

如何找到一个程序的进程 ID(PID)。最常见的 Linux 工具是由 procps-ng 包提供的,包括 pspstreepidofpgrep 命令。

 title=

POSIX 术语中, 进程 process 是一个正在进行的事件,由操作系统的内核管理。当你启动一个应用时就会产生一个进程,尽管还有许多其他的进程在你的计算机后台运行,包括保持系统时间准确的程序、监测新的文件系统、索引文件,等等。

大多数操作系统都有某种类型的系统活动监视器,因此你可以了解在任何特定时刻有哪些进程在运行。Linux 有一些供你选择,包括 GNOME 系统监视器和 KSysGuard。这两个软件在桌面环境都很有用,但 Linux 也提供了在终端监控系统的能力。不管你选择哪一种,对于那些积极管理自己电脑的人来说,检查一个特定的进程是一项常见的任务。

在这篇文章中,我演示了如何找到一个程序的进程 ID(PID)。最常见的工具是由 procps-ng 包提供的,包括 pspstreepidofpgrep 命令。

查找一个正在运行的程序的 PID

有时你想得到一个你知道正在运行的特定程序的进程 ID(PID)。pidofpgrep 命令可以通过命令名称查找进程。

pidof 命令返回一个命令的 PID,它按名称搜索确切的命令:

$ pidof bash
1776 5736

pgrep 命令允许使用正则表达式:

$ pgrep .sh
1605
1679
1688
1776
2333
5736
$ pgrep bash
5736

通过文件查找 PID

你可以用 fuser 命令找到使用特定文件的进程的 PID。

$ fuser --user ~/example.txt          
/home/tux/example.txt: 3234(tux)

通过 PID 获得进程名称

如果你有一个进程的 PID 编号,但没有生成它的命令,你可以用 ps 做一个“反向查找”:

$ ps 3234
PID TTY   STAT  TIME COMMAND
5736 pts/1  Ss   0:00 emacs

列出所有进程

ps 命令列出进程。你可以用 -e 选项列出你系统上的每一个进程:

PID TTY          TIME CMD
  1 ?         00:00:03 systemd
  2 ?         00:00:00 kthreadd
  3 ?         00:00:00 rcu_gp
  4 ?         00:00:00 rcu_par_gp
  6 ?         00:00:00 kworker/0:0H-events_highpri
[...]
5648 ?        00:00:00 gnome-control-c
5656 ?        00:00:00 gnome-terminal-
5736 pts/1    00:00:00 bash
5791 pts/1    00:00:00 ps
5792 pts/1    00:00:00 less
(END)

只列出你的进程

ps -e 的输出可能会让人不知所措,所以使用 -U 来查看一个用户的进程:

$ ps -U tux | less
 PID TTY          TIME CMD
3545 ?        00:00:00 systemd
3548 ?        00:00:00 (sd-pam)
3566 ?        00:00:18 pulseaudio
3570 ?        00:00:00 gnome-keyring-d
3583 ?        00:00:00 dbus-daemon
3589 tty2     00:00:00 gdm-wayland-ses
3592 tty2     00:00:00 gnome-session-b
3613 ?        00:00:00 gvfsd
3618 ?        00:00:00 gvfsd-fuse
3665 tty2     00:01:03 gnome-shell
[...]

这样就减少了 200 个(可能是 100 个,取决于你运行的系统)需要分类的进程。

你可以用 pstree 命令以不同的格式查看同样的输出:

$ pstree -U tux -u --show-pids
[...]
├─gvfsd-metadata(3921)─┬─{gvfsd-metadata}(3923)
│           └─{gvfsd-metadata}(3924)
├─ibus-portal(3836)─┬─{ibus-portal}(3840)
│          └─{ibus-portal}(3842)
├─obexd(5214)
├─pulseaudio(3566)─┬─{pulseaudio}(3640)
│         ├─{pulseaudio}(3649)
│         └─{pulseaudio}(5258)
├─tracker-store(4150)─┬─{tracker-store}(4153)
│           ├─{tracker-store}(4154)
│           ├─{tracker-store}(4157)
│           └─{tracker-store}(4178)
└─xdg-permission-(3847)─┬─{xdg-permission-}(3848)
            └─{xdg-permission-}(3850)

列出进程的上下文

你可以用 -u 选项查看你拥有的所有进程的额外上下文。

$ ps -U tux -u
USER  PID %CPU %MEM    VSZ   RSS TTY STAT START  TIME COMMAND
tux  3545  0.0  0.0  89656  9708 ?   Ss   13:59  0:00 /usr/lib/systemd/systemd --user
tux  3548  0.0  0.0 171416  5288 ?   S    13:59  0:00 (sd-pam)
tux  3566  0.9  0.1 1722212 17352 ?  S<sl 13:59  0:29 /usr/bin/pulseaudio [...]
tux  3570  0.0  0.0 664736  8036 ?   SLl  13:59  0:00 /usr/bin/gnome-keyring-daemon [...]
[...]
tux  5736  0.0  0.0 235628  6036 pts/1 Ss 14:18  0:00 bash
tux  6227  0.0  0.4 2816872 74512 tty2 Sl+14:30  0:00 /opt/firefox/firefox-bin [...]
tux  6660  0.0  0.0 268524  3996 pts/1 R+ 14:50  0:00 ps -U tux -u
tux  6661  0.0  0.0 219468  2460 pts/1 S+ 14:50  0:00 less

用 PID 排除故障

如果你在某个特定的程序上有问题,或者你只是好奇某个程序在你的系统上还使用了什么资源,你可以用 pmap 查看运行中的进程的内存图。

$ pmap 1776
5736:   bash
000055f9060ec000   1056K r-x-- bash
000055f9063f3000     16K r---- bash
000055f906400000     40K rw---   [ anon ]
00007faf0fa67000   9040K r--s- passwd
00007faf1033b000     40K r-x-- libnss_sss.so.2
00007faf10345000   2044K ----- libnss_sss.so.2
00007faf10545000      4K rw--- libnss_sss.so.2
00007faf10546000 212692K r---- locale-archive
00007faf1d4fb000   1776K r-x-- libc-2.28.so
00007faf1d6b7000   2044K ----- libc-2.28.so
00007faf1d8ba000      8K rw--- libc-2.28.so
[...]

处理进程 ID

procps-ng 软件包有你需要的所有命令,以调查和监控你的系统在任何时候的使用情况。无论你是对 Linux 系统中各个分散的部分如何结合在一起感到好奇,还是要对一个错误进行调查,或者你想优化你的计算机的性能,学习这些命令都会为你了解你的操作系统提供一个重要的优势。


via: https://opensource.com/article/21/8/linux-procps-ng

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

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

at 命令是一种在特定时间和日期安排一次性任务的 Linux 终端方法。

 title=

计算机擅长 自动化,但不是每个人都知道如何使自动化工作。不过,能够在特定的时间为电脑安排一个任务,然后忘记它,这确实是一种享受。也许你有一个文件要在特定的时间上传或下载,或者你需要处理一批还不存在但可以保证在某个时间存在的文件,或者需要监控设置,或者你只是需要一个友好的提醒,在下班回家的路上买上面包和黄油。

这就是 at 命令的用处。

什么是 Linux at 命令?

at 命令是在 Linux 终端让你在特定时间和日期安排一次性工作的方法。它是一种自发的自动化,在终端上很容易实现。

安装 at

在 Linux 上,at 命令可能已经安装了。你可以使用 at -V 命令来验证它是否已经安装。只要返回一个版本号,就说明你已经安装了 at

$ at -V
at version x.y.z

如果你试图使用 at,但没有找到该命令,大多数现代的 Linux 发行版会为你提供缺少的 at 软件包。

你可能还需要启动 at 守护程序,称为 atd。在大多数 Linux 系统中,你可以使用 systemctl 命令来启用该服务,并将它们设置为从现在开始自动启动:

$ sudo systemctl enable --now atd

用 at 交互式地安排一个作业

当你使用 at 命令并加上你希望任务运行的时间,会打开一个交互式 at 提示符。你可以输入你想在指定时间运行的命令。

做个比喻,你可以把这个过程看作是一个日历应用,就像你在你的手机上使用的那样。首先,你在某一天的某个时间创建一个事件,然后指定你想要发生什么。

例如,可以试试创建一个未来几分钟的任务,来给自己计划一个备忘录。这里运行一个简单的任务,以减少失败的可能性。要退出 at 提示符,请按键盘上的 Ctrl+D

$ at 11:20 AM
warning: commands will be executed using /bin/sh
at> echo "hello world" > ~/at-test.txt
at> <EOT>
job 3 at Mon Jul 26 11:20:00 2021

正如你所看到的,at 使用直观和自然的时间定义。你不需要用 24 小时制的时钟,也不需要把时间翻译成 UTC 或特定的 ISO 格式。一般来说,你可以使用你自然想到的任何符号,如 noon1:30 PM13:37 等等,来描述你希望一个任务发生的时间。

等待几分钟,然后在你创建的文件上运行 cat 或者 tac 命令,验证你的任务是否已经运行:

$ cat ~/at-test.txt
hello world

用 at 安排一个任务

你不必使用 at 交互式提示符来安排任务。你可以使用 echoprintf 向它传送命令。在这个例子中,我使用了 now 符号,以及我希望任务从现在开始延迟多少分钟:

$ echo "echo 'hello again' >> ~/at-test.txt" | at now +1 minute

一分钟后,验证新的命令是否已被执行:

$ cat ~/at-test.txt
hello world
hello again

时间表达式

at 命令在解释时间时是非常宽容的。你可以在许多格式中选择,这取决于哪一种对你来说最方便:

  • YYMMDDhhmm[.ss](两位的年份、月、日、小时、分钟,及可选的秒)
  • CCYYMMDDhhmm[.ss](四位的年份、月、日、时、分钟,及可选的秒)
  • now(现在)
  • midnight(午夜 00:00)
  • noon(中午 12:00)
  • teatime(下午 16 点)
  • AM(上午)
  • PM(下午)

时间和日期可以是绝对时间,也可以加一个加号(+),使其与 now 相对。当指定相对时间时,你可以使用你可能用过的词语:

  • minutes(分钟)
  • hours(小时)
  • days(天)
  • weeks(星期)
  • months(月)
  • years(年)

时间和日期语法

at 命令对时间的输入相比日期不那么宽容。时间必须放在第一位,接着是日期,尽管日期默认为当前日期,并且只有在为未来某天安排任务时才需要。

这些是一些有效表达式的例子:

$ echo "rsync -av /home/tux me@myserver:/home/tux/" | at 3:30 AM tomorrow
$ echo "/opt/batch.sh ~/Pictures" | at 3:30 AM 08/01/2022
$ echo "echo hello" | at now + 3 days

查看你的 at 队列

当你爱上了 at,并且正在安排任务,而不是在桌子上的废纸上乱写乱画,你可能想查看一下你是否有任务还在队列中。

要查看你的 at 队列,使用 atq 命令:

$ atq
10 Thu Jul 29 12:19:00 2021 a tux
9 Tue Jul 27 03:30:00 2021 a tux
7 Tue Jul 27 00:00:00 2021 a tux

要从队列中删除一个任务,使用 atrm 命令和任务号。例如,要删除任务 7:

$ atrm 7
$ atq
10 Thu Jul 29 12:19:00 2021 a tux
9 Tue Jul 27 03:30:00 2021 a tux

要看一个计划中的任务的实际内容,你需要查看 /var/spool/at 下的内容。只有 root 用户可以查看该目录的内容,所以你必须使用 sudo 来查看或 cat 任何任务的内容。

用 Linux at 安排任务

at 系统是一个很好的方法,可以避免忘记在一天中晚些时候运行一个作业,或者在你离开时让你的计算机为你运行一个作业。与 cron 不同的是,它不像 cron 那样要求任务必须从现在起一直按计划运行到永远,因此它的语法比 cron 简单得多。

等下次你有一个希望你的计算机记住并管理它的小任务,试试 at 命令。


via: https://opensource.com/article/21/8/linux-at-command

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

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

一致性可以避免当你有多个开发人员开发同一个项目时出现问题。

 title=

当你有多个不同开发环境的开发人员在一个项目上工作时,编码和测试的不一致性是一种风险。Visual Studio Code(VS Code)是一个集成开发环境(IDE),可以帮助减少这些问题。它可以和容器结合起来,为每个应用程序提供独立的开发环境,同时提供一个一致的开发环境。

VS Code 的 “Remote - Containers” 扩展 使你能够创建一个容器定义,使用该定义来构建一个容器,并在容器内进行开发。这个容器定义可以和应用程序代码一起被签入到源代码库中,这使得所有的开发人员可以使用相同的定义在容器中进行构建和开发。

默认情况下,“Remote - Containers” 扩展使用 Docker 来构建和运行容器,但使用 Podman 的容器运行环境环境也很容易,它可以让你使用 免 root 容器

本文将带领你完成设置,通过 Podman 在免 root 容器内使用 VS Code 和 “Remote - Containers” 扩展进行开发。

初始配置

在继续之前,请确保你的红帽企业 Linux(RHEL)或 Fedora 工作站已经更新了最新的补丁,并且安装了 VS Code 和 “Remote - Containers” 扩展。(参见 VS Code 网站了解更多安装信息)

接下来,用一个简单的 dnf install 命令来安装 Podman 和它的支持包:

$ sudo dnf install -y podman

安装完 Podman 后,配置 VS Code 以使用 Podman 的可执行文件(而不是 Docker)与容器进行交互。在 VS Code 中,导航到 “文件 > 首选项 > 设置”,点击 “扩展” 旁边的 “>” 图标。在出现的下拉菜单中,选择 “Remote - Containers”,并向下滚动找到 “Remote - Containers: Docker Path” 选项。在文本框中,用 “podman” 替换 “docker”。

 title=

现在配置已经完成,在 VS Code 中为该项目创建一个新的文件夹或打开现有的文件夹。

定义容器

本教程以创建 Python 3 开发的容器为例。

“Remote - Containers” 扩展可以在项目文件夹中添加必要的基本配置文件。要添加这些文件,通过在键盘上输入 Ctrl+Shift+P 打开命令面板,搜索 “Remote-Containers: Add Development Container Configuration Files”,并选择它。

 title=

在接下来的弹出窗口中,定义你想设置的开发环境的类型。对于这个例子的配置,搜索 “Python 3” 定义并选择它。

 title=

接下来,选择将在容器中使用的 Python 的版本。选择 “3 (default)” 选项以使用最新的版本。

 title= option")

Python 配置也可以安装 Node.js,但在这个例子中,取消勾选 “Install Node.js”,然后点击 “OK”。

 title=

它将创建一个 .devcontainer 文件夹,包含文件devcontainer.jsonDockerfile。VS Code 会自动打开devcontainer.json 文件,这样你就可以对它进行自定义。

启用免 root 容器

除了明显的安全优势外,以免 root 方式运行容器的另一个原因是,在项目文件夹中创建的所有文件将由容器外的正确用户 ID(UID)拥有。要将开发容器作为免 root 容器运行,请修改 devcontainer.json 文件,在它的末尾添加以下几行:

"workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,Z",
"workspaceFolder": "/workspace",

"runArgs": ["--userns=keep-id"],
"containerUser": "vscode"

这些选项告诉 VS Code 用适当的 SELinux 上下文挂载工作区,创建一个用户命名空间,将你的 UID 和 GID 原样映射到容器内,并在容器内使用 vscode 作为你的用户名。devcontainer.json 文件应该是这样的(别忘了行末的逗号,如图所示):

 title=

现在你已经设置好了容器的配置,你可以构建容器并打开里面的工作空间。重新打开命令调板(用 Ctrl+Shift+P),并搜索 “Remote-Containers: Rebuild and Reopen in Container”。点击它,VS Code 将开始构建容器。现在是休息一下的好时机(拿上你最喜欢的饮料),因为构建容器可能需要几分钟时间:

 title=

一旦容器构建完成,项目将在容器内打开。在容器内创建或编辑的文件将反映在容器外的文件系统中,并对这些文件应用适当的用户权限。现在,你可以在容器内进行开发了。VS Code 甚至可以把你的 SSH 密钥和 Git 配置带入容器中,这样提交代码就会像在容器外编辑时那样工作。

接下来的步骤

现在你已经完成了基本的设置和配置,你可以进一步加强配置的实用性。比如说:

  • 修改 Dockerfile 以安装额外的软件(例如,所需的 Python 模块)。
  • 使用一个定制的容器镜像。例如,如果你正在进行 Ansible 开发,你可以使用 Quay.ioAnsible Toolset。(确保通过 Dockerfile 将 vscode 用户添加到容器镜像中)
  • .devcontainer 目录下的文件提交到源代码库,以便其他开发者可以利用容器的定义进行开发工作。

在容器内开发有助于防止不同项目之间的冲突,因为隔离了不同项目的依赖关系及代码。你可以使用 Podman 在免 root 环境下运行容器,从而提高安全性。通过结合 VS Code、“Remote - Containers” 扩展和 Podman,你可以轻松地为多个开发人员建立一个一致的环境,减少设置时间,并以安全的方式减少开发环境的差异带来的错误。


via: https://opensource.com/article/21/7/vs-code-remote-containers-podman

作者:Brant Evans 选题:lujun9972 译者:wxy 校对:wxy

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

在你安装了 0penVPN 之后,是时候配置它了。

 title=

0penVPN 在两点之间建立一条加密的隧道,阻止第三方访问你的网络流量。通过设置你的 “虚拟专用网络” 服务,你就成为你自己的 “虚拟专用网络” 供应商。许多流行的 “虚拟专用网络” 服务已支持 0penVPN,所以当你可以掌控自己的网络时,为什么还要将你的网络连接绑定到特定的提供商呢?

本系列中的 第一篇 展示了如何安装和配置一台作为你的 0penVPN 服务器的 Linux 计算机。,第二篇 演示了如何安装和配置 0penVPN 服务器软件。这第三篇文章演示了如何在认证成功的情况下启动 0penVPN。

要设置一个 0penVPN 服务器,你必须:

  • 创建一个配置文件。
  • 使用 sysctl 设置net.ipv4.ip_forward = 1 以启用路由。
  • 为所有的配置和认证文件设置适当的所有权,以便使用非 root 账户运行 0penVPN 服务器守护程序。
  • 设置 0penVPN 加载适当的配置文件启动。
  • 配置你的防火墙。

配置文件

你必须在 /etc/openvpn/server/ 中创建一个服务器配置文件。如果你想的话,你可以从头开始,0penVPN 包括了几个配置示例示例文件,可以以此作为开始。看看 /usr/share/doc/openvpn/sample/sample-config-files/ 就知道了。

如果你想手工建立一个配置文件,可以从 server.confroadwarrior-server.conf 开始(视情况而定),并将你的配置文件放在 /etc/openvpn/server 中。这两个文件都有大量的注释,所以请阅读注释并根据你的情况作出决定。

你可以使用我预先建立的服务器和客户端配置文件模板和 sysctl 文件来打开网络路由,从而节省时间和麻烦。这个配置还包括自定义记录连接和断开的情况。它在 0penVPN 服务器的 /etc/openvpn/server/logs 中保存日志。

如果你使用我的模板,你需要使用你的 IP 地址和主机名编辑它们。

要使用我的预建配置模板、脚本和 sysctl 来打开 IP 转发,请下载我的脚本:

$ curl \
  https://www.dgregscott.com/ovpn/OVPNdownloads.sh > \
  OVPNdownloads.sh

阅读该脚本,了解它的工作内容。下面是它的运行概述:

  • 在你的 0penVPN 服务器上创建适当的目录
  • 从我的网站下载服务器和客户端的配置文件模板
  • 下载我的自定义脚本,并以正确的权限把它们放到正确的目录中
  • 下载 99-ipforward.conf 并把它放到 /etc/sysctl.d 中,以便在下次启动时打开 IP 转发功能
  • /etc/openvpn 中的所有内容设置了所有权

当你确定你理解了这个脚本的作用,就使它可执行并运行它:

$ chmod +x OVPNdownloads.sh
$ sudo ./OVPNdownloads.sh

下面是它复制的文件(注意文件的所有权):

$ ls -al -R /etc/openvpn
/etc/openvpn:
total 12
drwxr-xr-x.  4 openvpn openvpn  34 Apr 6 20:35 .
drwxr-xr-x. 139 root  root  8192 Apr 6 20:35 ..
drwxr-xr-x.  2 openvpn openvpn  33 Apr 6 20:35 client
drwxr-xr-x.  4 openvpn openvpn  56 Apr 6 20:35 server

/etc/openvpn/client:
total 4
drwxr-xr-x. 2 openvpn openvpn  33 Apr 6 20:35 .
drwxr-xr-x. 4 openvpn openvpn  34 Apr 6 20:35 ..
-rw-r--r--. 1 openvpn openvpn 1764 Apr 6 20:35 OVPNclient2020.ovpn

/etc/openvpn/server:
total 4
drwxr-xr-x. 4 openvpn openvpn  56 Apr 6 20:35 .
drwxr-xr-x. 4 openvpn openvpn  34 Apr 6 20:35 ..
drwxr-xr-x. 2 openvpn openvpn  59 Apr 6 20:35 ccd
drwxr-xr-x. 2 openvpn openvpn  6 Apr 6 20:35 logs
-rw-r--r--. 1 openvpn openvpn 2588 Apr 6 20:35 OVPNserver2020.conf

/etc/openvpn/server/ccd:
total 8
drwxr-xr-x. 2 openvpn openvpn 59 Apr 6 20:35 .
drwxr-xr-x. 4 openvpn openvpn 56 Apr 6 20:35 ..
-rwxr-xr-x. 1 openvpn openvpn 917 Apr 6 20:35 client-connect.sh
-rwxr-xr-x. 1 openvpn openvpn 990 Apr 6 20:35 client-disconnect.sh

/etc/openvpn/server/logs:
total 0
drwxr-xr-x. 2 openvpn openvpn 6 Apr 6 20:35 .
drwxr-xr-x. 4 openvpn openvpn 56 Apr 6 20:35 ..

下面是 99-ipforward.conf 文件:

# Turn on IP forwarding. OpenVPN servers need to do routing
net.ipv4.ip_forward = 1

编辑 OVPNserver2020.confOVPNclient2020.ovpn 以包括你的 IP 地址。同时,编辑 OVPNserver2020.conf 以包括你先前的服务器证书名称。稍后,你将重新命名和编辑 OVPNclient2020.ovpn 的副本,以便在你的客户电脑上使用。以 ***? 开头的块显示了你要编辑的地方。

文件所有权

如果你使用了我网站上的自动脚本,文件所有权就已经到位了。如果没有,你必须确保你的系统有一个叫 openvpn 的用户,并且是 openvpn 组的成员。你必须将 /etc/openvpn 中的所有内容的所有权设置为该用户和组。如果你不确定该用户和组是否已经存在,这样做也是安全的,因为 useradd 会拒绝创建一个与已经存在的用户同名的用户:

$ sudo useradd openvpn
$ sudo chown -R openvpn.openvpn /etc/openvpn

防火墙

如果你在步骤 1 中启用 firewalld 服务,那么你的服务器的防火墙服务可能默认不允许 “虚拟专用网络” 流量。使用 firewall-cmd 命令,你可以启用 0penVPN 服务,它可以打开必要的端口并按需路由流量:

$ sudo firewall-cmd --add-service openvpn --permanent
$ sudo firewall-cmd --reload

没有必要在 iptables 的迷宫中迷失方向!

启动你的服务器

现在你可以启动 0penVPN 服务器了。为了让它在重启后自动运行,使用 systemctlenable 子命令:

systemctl enable --now [email protected]

最后的步骤

本文的第四篇也是最后一篇文章将演示如何设置客户端,以便远程连接到你的 0penVPN。

本文基于 D.Greg Scott 的博客,经许可后重新使用。


via: https://opensource.com/article/21/7/openvpn-firewall

作者:D. Greg Scott 选题:lujun9972 译者:geekpi 校对:turbokernel

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