l1n6yun's Blog

记录学习的技能和遇到的问题

在数字化时代,脚本编程在软件开发和自动化任务中扮演着至关重要的角色。然而,未加密的脚本代码面临着潜在的盗用和篡改风险,甚至可能导致敏感信息泄露。本文将探讨多种有效的脚本加密与编译技术,涵盖了Shell和Perl脚本的保护方法,旨在帮助开发者保护自己的代码和敏感信息。

Shell脚本加密与编译方法

使用shc工具

SHC(Shell Script Compiler)是一个开源工具,用于将Shell脚本编译成可执行文件。它将代码转换为C语言程序,然后再编译成二进制文件,以保护源代码。SHC的主要目的是提供一个简单的方式来保护Shell脚本代码,防止未经授权的访问和篡改。

  • SHC的功能:SHC将Shell脚本编译成二进制可执行文件,隐藏脚本的实现细节,并在编译过程中对脚本内容进行预处理和加密。

安装SHC

通过包管理器安装SHC(推荐):

1
2
3
4
5
6
# Ubuntu/Debian:
sudo apt-get install shc

# CentOS/RHEL
sudo yum install epel-release
sudo yum install shc

从源代码编译安装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 安装必要的编译工具和库。包括 `gcc`(GNU C编译器)和 `make` 工具:
sudo apt-get update
sudo apt-get install build-essential

# 访问 SHC 的 GitHub 仓库,下载最新的源代码压缩包,或通过 `git` 克隆仓库。
git clone https://github.com/neurobin/shc.git
cd shc

# 编译 SHC:
make

# 安装 SHC,将编译的二进制文件移动到 `/usr/local/bin` 目录(或其他合适的目录):
sudo cp shc /usr/local/bin/

# 检查 SHC 是否安装成功:
shc -h

编译示例

脚本(hello.sh):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/bin/bash

# 检查是否为root用户
if [ "$EUID" -ne 0 ]; then
echo "请以管理员权限运行此脚本(使用sudo)!"
exit 1
fi

# 显示系统信息
echo "-----------------------------"
echo "系统信息"
echo "-----------------------------"
echo "当前用户: $(whoami)"
echo "系统时间: $(date)"
echo "操作系统版本: $(lsb_release -d | cut -f2)"

# 列出当前目录文件
echo "-----------------------------"
echo "当前目录中的文件:"
ls -1

# 用户选择文件
read -p "请选择一个文件以查看其内容 (输入文件名): " file_name

# 检查文件是否存在
if [ -f "$file_name" ]; then
echo "-----------------------------"
echo "文件内容: $file_name"
cat "$file_name"

# 将输出重定向到日志文件
echo "日志保存到 log.txt"
{
echo "文件内容: $file_name"
cat "$file_name"
} > log.txt

else
echo "文件不存在!"
fi

编译脚本:

1
shc -f hello.sh

将生成两个文件:hello.sh.x(可执行文件)和hello.sh.x.c(C源文件)。

执行编译文件:

1
./hello.sh.x

加密与编码

除了使用shc工具,还可以使用base64编码或openssl加密来增加脚本的安全性。

使用base64编码将脚本内容进行base64编码,并在运行时解码执行:

1
2
3
4
5
# 编码
base64 hello.sh > hello_base64.txt

# 解码并执行
base64 -d hello_base64.txt | bash

使用openssl工具对脚本进行对称或非对称加密,然后在运行时解密。例如:

1
2
3
4
5
# 加密
openssl aes-256-cbc -salt -in hello.sh -out hello.sh.enc

# 解密并执行
openssl aes-256-cbc -d -in hello.sh.enc | bash

Perl脚本加密与编译方法

PAR::Packer工具

PAR::Packer是一个Perl模块,用于将Perl脚本及其所有依赖打包成可执行的二进制文件。它分析Perl脚本,自动识别所用到的模块,并将这些模块打包在内,确保在目标环境中运行时可以找到。

  • 安装并使用
1
2
3
4
5
# 以使用 CPAN 安装:
cpan PAR::Packer

# 打包Perl脚本
pp -o hello.pxf hello.pl

perlcc编译器

perlcc是Perl语言的一个编译器,它可以将Perl脚本编译成C代码,然后进一步编译成可执行的二进制文件。然而,perlcc可能无法处理某些复杂的Perl特性或者特定模块,导致编译失败。

  • 编译过程示例
1
perlcc -o task_manager task_manager.pl

使用-d选项可以在编译时显示调试信息:

1
perlcc -d -o hello hello.pl

查看perlcc的更多选项和功能,可以使用以下命令:

1
perlcc -h

加密与解密技术

使用Crypt::CBC模块可以实现对数据的加密和解密。Crypt::CBC提供了基于块密码的加密和模式,常用的加密算法包括AES、DES等。

  • 安装Crypt::CBC
1
cpan Crypt::CBC

使用Crypt::CBC模块加密一个Perl脚本,涉及到定义一个加密的过程并将脚本本身保存为一个密文,然后可以在运行时解密并执行。这种做法只是为了保护源代码,这并不是一种绝对的安全措施,因为熟悉Perl的人仍然可以通过逆向工程等手段获取原始代码。

以下是使用Crypt::CBC加密和解密Perl脚本的示例代码:

加密脚本(encrypt_script.pl):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/perl
use strict;
use warnings;
use Crypt::CBC;
use MIME::Base64;
use File::Slurp;

# 配置加密参数
my $key = '*********'; # 选择一个合适的密钥
my $cipher = Crypt::CBC->new(
-key => $key,
-cipher => 'Crypt::AES',
);

# 读取原始脚本
my $script = read_file('task_manager.pl');

# 加密脚本
my $ciphertext = $cipher->encrypt_hex($script);
write_file('hello_encrypted.pl', $ciphertext);

print "Script encrypted and saved to hello_encrypted.pl\n";

解密并执行脚本(run_encrypted.pl):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/perl
use strict;
use warnings;
use Crypt::CBC;
use MIME::Base64;
use File::Slurp;

# 配置加密参数
my $key = '******'; # 确保与加密时的密钥一致
my $cipher = Crypt::CBC->new(
-key => $key,
-cipher => 'Crypt::AES',
);

# 读取加密脚本
my $ciphertext = read_file('hello_encrypted.pl');

# 解密
my $decrypted = $cipher->decrypt_hex($ciphertext);

# 执行解密后的脚本
eval $decrypted;
if ($@) {
die "Error executing decrypted script: $@";
}

运行解密并执行的脚本:

1
perl run_encrypted.pl

总结

脚本加密和编译技术为确保源代码安全性提供了有效的手段。本文详细介绍了使用流行工具和方法对Shell脚本和Perl脚本进行加密和编译的步骤,旨在帮助开发者保护自己的代码和敏感信息。

Pake 是一个基于 Rust 的工具,它允许开发者轻松构建轻量级的多平台桌面应用。以其小巧的体积和卓越的性能,Pake 成为了许多开发者的首选工具。本文将详细介绍 Pake 的特性、安装方法、使用指南以及如何进行定制开发,并特别强调快捷键的使用。

Pake 的特性

Pake 的核心特性包括:

  • 体积小:相比传统的 Electron 套壳打包,Pake 的体积小将近 20 倍,大约在 5M 左右。
  • 性能优异:Pake 的底层使用的是 Rust Tauri 框架,相较于 JavaScript 框架,它提供了更轻快的性能体验和更小的内存占用。
  • 功能丰富:Pake 不仅能打包应用,还实现了快捷键透传、沉浸式窗口、拖动、样式改写、去广告等功能,并支持产品的极简风格定制。
  • 简单易用:Pake 被描述为一个简单的小玩具,使用 Tauri 替代了传统的套壳网页打包思路,同时推荐使用 PWA(Progressive Web Apps)。

开始使用 Pake

安装 Pake CLI

Pake 提供了命令行工具,可以通过 npm 进行安装:

1
npm install -g pake-cli

命令行一键打包

使用 Pake 进行一键打包非常简单,以下是基本的命令使用示例:

1
pake url [OPTIONS]...

例如,如果你想打包 Weekly 应用,并隐藏标题栏,可以使用以下命令:

1
pake https://weekly.tw93.fun --name Weekly --hide-title-bar

快捷键说明

Pake 支持快捷键,以提高用户的工作效率。以下是 Pake 支持的快捷键及其功能:

Mac Windows/Linux 功能
⌘ + [ Ctrl + ← 返回上一个页面
⌘ + ] Ctrl + → 去下一个页面
⌘ + ↑ Ctrl + ↑ 自动滚动到页面顶部
⌘ + ↓ Ctrl + ↓ 自动滚动到页面底部
⌘ + r Ctrl + r 刷新页面
⌘ + w Ctrl + w 隐藏窗口,非退出
⌘ + - Ctrl + - 缩小页面
⌘ + + Ctrl + + 放大页面
⌘ + = Ctrl + = 放大页面
⌘ + 0 Ctrl + 0 重置页面缩放

高级使用

Pake 的代码结构和高级用法可以在其官方文档中找到。以下是一些关键点:

  • 修改 src-tauri 目录下的 pake.json 中的 url 和 productName 字段,并同步修改 tauri.config.json 中的 domain 字段。
  • 修改 tauri.xxx.conf.json 中的 icon 和 identifier 字段,图标可以从 icons 目录选择,或者从 macOSicons 下载。
  • 在 pake.json 中修改窗口属性,如 width/height、fullscreen、resizable 等。
  • 适配 Mac 沉浸式头部,可以将 hideTitleBar 设置为 true,并为 Header 元素添加 padding-top 样式。

结语

Pake 是一个强大的工具,它让构建轻量级多端桌面应用变得简单快捷。无论是小白用户、开发用户还是折腾用户,都能在 Pake 中找到适合自己的使用方式。希望这篇文章能帮助你更好地了解和使用 Pake,享受构建桌面应用的乐趣。

问题描述

在 Linux 系统中,我们经常使用 Shebang(#!)行来指定脚本的解释器。对于 PHP 脚本,我们通常会在文件开头写上 #!/usr/bin/env php。然而,有时候即使命令行能够识别php 指令,使用 Shebang 行时却会报错 “No such file or directory”。这通常是因为文件的编码格式问题。

解决方案

步骤 1: 检查文件编码

首先,我们需要检查文件的编码格式。在 Linux 系统中,我们可以使用 vim 编辑器来查看和修改文件的编码格式。

  1. 打开终端。
  2. 输入 vim yourfile.php 命令来打开你的 PHP 文件。
  3. 在 vim 中,输入 :set ff 命令来查看文件的格式。

步骤 2: 修改文件编码

如果 :set ff 命令的输出显示 fileformat=dos,那么你需要将文件格式更改为 unix

  1. 在 vim 中,输入 :set ff=unix 命令来更改文件格式。
  2. 按下 Esc 键退出命令模式。
  3. 输入 :wq 命令保存更改并退出 vim

步骤 3: 验证更改

更改文件编码后,再次尝试运行你的 PHP 脚本。如果 Shebang 行不再报错,那么问题已经解决。

在数字时代,我们每天都在产生和消费大量的文本内容。无论是撰写报告、编写文档、还是记录个人笔记,一个高效、简洁且功能丰富的文本编辑器都是我们不可或缺的工具。今天,我要向大家介绍一款名为MarkText的开源Markdown编辑器,它以其出色的性能和优雅的设计,成为了文本编辑领域的一颗新星。

MarkText简介

MarkText是一款开源的Markdown编辑器,专注于速度和可用性。它支持多个操作系统,包括Linux、macOS和Windows,让不同平台的用户都能享受到流畅的写作体验。MarkText以其简洁的界面和实时预览功能,为用户提供了一种无干扰的写作环境,使得写作变得更加专注和高效。

核心特性

MarkText拥有许多令人印象深刻的特性,以下是其中的一些亮点:

  1. 实时预览:MarkText提供了所见即所得的实时预览功能,这意味着你在编辑器中输入的内容会立即反映在预览窗口中,让你可以即时看到最终的排版效果。

  2. 遵循Markdown规范:它支持CommonMark规范和GitHub Flavored Markdown规范,这意味着你可以使用MarkText来编写符合行业标准的Markdown文档。

  3. Markdown扩展:除了标准的Markdown功能,MarkText还支持数学表达式(通过KaTeX)、front matter和emoji等Markdown扩展,丰富了你的写作选项。

  4. 样式快捷方式:MarkText提供了段落和内联样式的快捷方式,帮助你提高写作效率。

  5. 输出格式多样:你可以将文档输出为HTML和PDF文件,满足不同场景的需求。

  6. 主题丰富:MarkText提供了多种主题,如Cadmium Light、Material Dark等,用户可以根据自己的喜好选择不同的主题。

  7. 编辑模式多样:包括源代码模式、打字机模式和专注模式,适应不同用户的写作习惯。

  8. 图片粘贴:直接从剪贴板中粘贴图片,简化了图片插入的过程。

下载与安装

MarkText的安装非常简单。对于macOS用户,你可以通过Homebrew-Cask安装:

brew install --cask mark-text

Windows用户可以下载安装向导并运行,或者使用Chocolatey和Winget等软件包管理器进行安装:

choco install marktext

或者

winget install marktext

Linux用户则可以按照官方提供的安装指南进行操作。

最新版本下载

想要获取MarkText的最新版本,你可以直接访问其GitHub发布页面:

MarkText GitHub Releases

在这里,你可以找到适用于不同操作系统的安装包,选择适合你的版本进行下载和安装。

PHP 调用 MongoDB 全解析

MongoDB 是一款流行的开源文档型数据库,它以 JSON 风格的文档形式存储数据,具有高性能、高可扩展性和灵活的数据模型等特点。而 PHP 作为一种广泛应用于 Web 开发的脚本语言,与 MongoDB 结合可以为开发者提供强大的数据存储和处理能力。本文将详细介绍如何使用 PHP 调用 MongoDB 进行数据的增删改查等操作。

环境准备

在使用 PHP 调用 MongoDB 之前,需要确保已经安装了 MongoDB 数据库和 PHP 的 MongoDB 扩展。可以使用 Composer 来安装 MongoDB 的 PHP 驱动,在项目根目录下创建一个composer.json文件,内容如下:

json

1
2
3
4
5
{
"require": {
"mongodb/mongodb": "^1.13"
}
}

然后在终端中执行composer install命令来安装依赖。

代码示例与解析

连接 MongoDB

1
2
3
4
5
6
7
8
9
10
11
12
<?php

require 'vendor/autoload.php';

$client = new MongoDB\Client("mongodb://localhost:27017");
//指定数据库
$db = $client->selectDatabase('test');
//指定集合
$collection = $db->selectCollection('users');

// 另一种指定合集的方式
$collection = $client->test->users;

上述代码首先通过require 'vendor/autoload.php';引入 Composer 的自动加载文件,然后使用MongoDB\Client类来连接本地的 MongoDB 服务器,端口为27017。接着指定了要使用的数据库test和集合users

插入数据

插入单条数据

1
2
3
4
5
$collection->insertOne([
'name' => '张三',
'age' => 18,
'sex' => '男'
]);

使用insertOne方法可以向集合中插入一条数据,数据以关联数组的形式传入。

指定 ID 插入数据

1
2
3
4
5
6
$collection->insertOne([
'_id' => new MongoDB\BSON\ObjectID('5e7b0b0b0b0b0b0b0b0b0b0b'),
'name' => '李四',
'age' => 27,
'sex' => '男'
]);

在插入数据时,可以手动指定_id字段,使用MongoDB\BSON\ObjectID类来创建一个 ObjectID 对象。

插入多条数据

1
2
3
4
5
6
7
8
9
10
11
12
$collection->insertMany([
[
'name' => '王五',
'age' => 18,
'sex' => '男'
],
[
'name' => '赵六',
'age' => 18,
'sex' => '男'
]
]);

使用insertMany方法可以一次性插入多条数据,传入一个二维数组,每个子数组代表一条数据。

查询数据

查询单条数据

1
2
3
4
$document = $collection->findOne([
'name' => '张三'
]);
var_dump(json_encode($document, JSON_UNESCAPED_UNICODE));

使用findOne方法可以查询符合条件的第一条数据,返回一个文档对象,使用json_encode方法将其转换为 JSON 字符串并输出。

查询多条数据

1
2
3
4
5
6
$cursor = $collection->find([
'name' => '张三'
]);
foreach ($cursor as $document) {
var_dump(json_encode($document, JSON_UNESCAPED_UNICODE));
}

使用find方法可以查询符合条件的多条数据,返回一个游标对象,通过foreach循环遍历游标对象,输出每条数据。

查询指定数量的数据

1
2
3
4
5
6
7
8
$cursor = $collection->find([
'name' => '张三'
], [
'limit' => 2
]);
foreach ($cursor as $document) {
var_dump(json_encode($document, JSON_UNESCAPED_UNICODE));
}

find方法的第二个参数中,可以使用limit选项来指定查询结果的数量。

条件查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 查询年龄大于18的数据
$cursor = $collection->find([
'age' => [
'$gt' => 18
]
]);
foreach ($cursor as $document) {
var_dump(json_encode($document, JSON_UNESCAPED_UNICODE));
}

// 查询年龄小于18,名称等于张三的数据
$cursor = $collection->find([
'name' => '张三',
'age' => [
'$lt' => 19
]
]);
foreach ($cursor as $document) {
var_dump(json_encode($document, JSON_UNESCAPED_UNICODE));
}

// 查询性别为空的数据
$cursor = $collection->find([
'sex' => [
'$exists' => false
]
]);
foreach ($cursor as $document) {
var_dump(json_encode($document, JSON_UNESCAPED_UNICODE));
}

在查询条件中,可以使用 MongoDB 的查询操作符,如$gt(大于)、$lt(小于)、$exists(是否存在)等。

排序查询

1
2
3
4
5
6
7
8
9
10
$cursor = $collection->find([
'name' => '张三'
], [
'sort' => [
'age' => 1 // 1正序,-1倒叙
]
]);
foreach ($cursor as $document) {
var_dump(json_encode($document, JSON_UNESCAPED_UNICODE));
}

find方法的第二个参数中,可以使用sort选项来对查询结果进行排序,1表示正序,-1表示倒序。

修改数据

查询并修改

1
2
3
4
5
6
7
8
$cursor = $collection->findOneAndUpdate([
'name' => '张三'
], [
'$set' => [
'age' => 27
]
]);
var_dump(json_encode($cursor, JSON_UNESCAPED_UNICODE));

使用findOneAndUpdate方法可以查询符合条件的第一条数据并进行修改,返回修改前的文档对象。

更新数据

1
2
3
4
5
6
7
$collection->updateOne([
'name' => '张三'
], [
'$set' => [
'age' => 27
]
]);

使用updateOne方法可以更新符合条件的第一条数据,使用$set操作符来指定要更新的字段和值。

查询并替换

1
2
3
4
5
6
7
$cursor = $collection->findOneAndReplace([
'name' => '张三'
], [
'name' => '李四',
'age' => 27
]);
var_dump(json_encode($cursor, JSON_UNESCAPED_UNICODE));

使用findOneAndReplace方法可以查询符合条件的第一条数据并进行替换,返回替换前的文档对象。

存在更新不存在插入

1
2
3
4
5
6
7
8
9
$collection->updateOne([
'name' => '张三'
], [
'$set' => [
'age' => 27
]
], [
'upsert' => true
]);

updateOne方法的第三个参数中,使用upsert选项设置为true,可以实现如果符合条件的数据存在则更新,不存在则插入的功能。

更新多条数据

1
2
3
4
5
6
7
$collection->updateMany([
'name' => '张三'
], [
'$set' => [
'age' => 27
]
]);

使用updateMany方法可以更新符合条件的多条数据。

删除数据

删除单条数据

1
2
3
$collection->deleteOne([
'name' => '张三'
]);

使用deleteOne方法可以删除符合条件的第一条数据。

删除多条数据

1
2
3
$collection->deleteMany([
'name' => '张三'
]);

使用deleteMany方法可以删除符合条件的多条数据。

删除集合和数据库

1
2
3
4
5
// 删除集合
$collection->drop();

// 删除数据库
$db->drop();

使用drop方法可以删除集合和数据库。

在 Linux 系统中,Samba 是一个功能强大的服务,它允许 Linux 和 Windows 系统之间进行文件共享。通过 Samba,你可以轻松地在不同操作系统之间共享文件和打印机。本文将详细介绍如何在 Linux 上配置 Samba 服务,以实现文件共享。

安装 Samba

首先,你需要确保你的 Linux 系统上安装了 Samba。在基于 Debian 的系统(如 Ubuntu)上,你可以使用以下命令来安装 Samba:

1
2
sudo apt update
sudo apt install samba

这将安装 Samba 服务及其依赖项。

配置 Samba

安装完成后,你需要配置 Samba 以便它知道你想要共享哪些目录。这涉及到编辑 Samba 的配置文件 smb.conf

  1. 使用文本编辑器打开 smb.conf 文件。这里我们使用 vi 编辑器,但你也可以使用 nano 或其他你喜欢的编辑器:
1
sudo vi /etc/samba/smb.conf
  1. smb.conf 文件中,你可以定义多个共享部分,每个部分对应一个共享目录。以下是两个示例共享部分的配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[mnt-rw]
comment = Read-Write Mount Point
browseable = yes
path = /mnt
force user = root
create mask = 0775
directory mask = 0775
guest ok = Yes
read only = No

[onecloud-share]
comment = Read-Only OneCloud Share
browseable = yes
path = /mnt
guest ok = Yes
read only = yes
  • [mnt-rw] 部分定义了一个名为 mnt-rw 的共享,它指向 /mnt 目录。这个共享允许读写访问,并且对所有用户(包括匿名用户)开放。
  • [onecloud-share] 部分定义了另一个共享,它同样指向 /mnt 目录,但这个共享只允许读访问。

配置选项解释

  • browseable = yes:这个选项使得共享在网络浏览器中可见。
  • path = /mnt:指定共享的文件系统路径。
  • force user = root:强制所有连接到此共享的用户以 root 用户身份访问。
  • create mask = 0775directory mask = 0775:设置文件和目录的默认权限。
  • guest ok = Yes:允许匿名访问。
  • read only = No:对于 [mnt-rw] 共享,这个选项允许写入操作;对于 [onecloud-share] 共享,这个选项设置为 yes,表示只读。

启动 Samba 服务

配置完成后,你需要启动 Samba 服务以使更改生效:

1
sudo service smbd start

这个命令将启动 Samba 守护进程,使你的共享目录在网络上可用。

测试共享

在 Windows 系统上,你可以通过网络邻居访问这些共享,或者在文件资源管理器中输入共享的网络路径(例如 \\<Linux-Server-IP>\mnt-rw)来访问。

使用 OpenSSL 工具生成自签名 SSL 证书,为内网环境中的网站安全保驾护航

在内网环境中,使用 OpenSSL 工具进行自签名 SSL 证书的创建,能够为您的网站提供有效的安全保障。

自签证书流程

  1. 创建 ca 私钥。
  2. 基于 ca 私钥生成 ca 根证书。
  3. 构建 ssl 私钥。
  4. 生成 ssl 证书 csr。
  5. 运用 ca 根证书签署以获得 ssl 证书。

操作方法

  1. 创建 ca 私钥(强烈建议设置密码以增强安全性):
1
2
3
4
5
6
7
8
$ openssl genrsa -des3 -out root.key 2048
Generating RSA private key, 2048 bit long modulus
..............................................................+++
................+++
e is 65537 (0x010001)
Enter pass phrase for root.key:

Verifying - Enter pass phrase for root.key:
  1. 生成 ca 证书,自签 20 年有效期,并将此 ca 证书导入需要访问的 PC 的“受信任的根证书颁发机构”中,后续用此 ca 签署的证书均可正常使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ openssl req -x509 -new -nodes -key root.key -sha256 -days 7300 -out root.crt
Enter pass phrase for root.key:

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN # 国家
State or Province Name (full name) [Some-State]:SiChuan # 省份
Locality Name (eg, city) []:ChengDu # 城市
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Sichuan Lingyun Technology Co., LTD # 组织
Organizational Unit Name (eg, section) []: # 部门
Common Name (e.g. server FQDN or YOUR name) []:Sichuan Lingyun Technology Co., LTD # 公司
Email Address []: # 邮箱
  1. 完成上述步骤后,创建 ssl 证书私钥:
1
2
3
4
5
$ openssl genrsa -out server.key 2048
Generating RSA private key, 2048 bit long modulus
...................................................................................+++
..........+++
e is 65537 (0x010001)
  1. 随后创建 ssl 证书 csr:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ openssl req -new -key server.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:SiChuan
Locality Name (eg, city) []:ChengDu
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Sichuan Lingyun Technology Co., LTD
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:Sichuan Lingyun Technology Co., LTD
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
  1. 创建域名附加配置信息,新建一个文件,通过 vim cert.ext ,将以下代码粘贴后保存:
1
2
3
4
5
6
7
8
9
10
11
12
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
IP.2 = 192.168.0.10
IP.3 = 192.168.1.200
DNS.4 = xa.it.com
DNS.5 = xiykj.com
DNS.6 = *.xa.com

需要注意的是,IP.2 = 192.168.11.100 表示 https 要访问的 IP 地址,IP.3 同理也是 IP 地址,ssl 证书允许自签多个 IP 地址,这便是自签 IP 的证书。而 DNS.4 = https://xa.it.com/ 则表示 https 要访问的域名,DNS.5、DNS.6 同理均为域名,ssl 证书也支持自签多个域名,此为自签域名的证书。

  1. 使用CA根证书签署ssl证书,自签ssl证书有效期20年:
1
2
3
4
5
$ openssl x509 -req -in server.csr -out server.crt -days 7300 -CAcreateserial -CA root.crt -CAkey root.key -CAserial serial -extfile cert.ext
Signature ok
subject=C = CN, ST = SiChuan, L = ChengDu, O = "Sichuan Lingyun Technology Co., LTD"
Getting CA Private Key
Enter pass phrase for root.key:
  1. 查看文件,通过执行“ls -al”命令
1
2
3
4
5
6
$ ls -al
cert.ext #ssl证书附加配置信息
serial #证书序列号
server.crt #ssl证书文件,包含公钥信息
server.csr #ssl证书签名文件
server.key #ssl证书私钥
  1. 查看签署的证书信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
$ openssl x509 -in server.crt -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
cd:ae:a9:3e:b7:bb:93:e1
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = CN, ST = SiChuan, L = ChengDu, O = "Sichuan Lingyun Technology Co., LTD"
Validity
Not Before: Jul 18 06:26:05 2024 GMT
Not After : Jul 13 06:26:05 2044 GMT
Subject: C = CN, ST = SiChuan, L = ChengDu, O = "Sichuan Lingyun Technology Co., LTD"
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:aa:4e:ca:f5:0d:51:e7:b4:ba:3c:0b:6e:a5:4a:
d8:b4:0d:ad:19:54:3d:11:02:14:29:41:45:76:fc:
4a:b0:6c:5c:76:46:91:ff:8d:89:7a:f2:a8:62:73:
1d:c4:3a:96:8c:74:82:0a:e9:58:55:73:4a:4e:ec:
17:23:43:90:39:69:0e:aa:ac:ec:71:3e:60:e5:6b:
0c:e7:7b:f9:8f:93:db:a8:45:ae:d9:43:6f:f1:a1:
1c:01:0a:14:33:ce:4f:8c:81:f0:34:b5:cc:7c:81:
f6:91:1a:69:31:dc:8a:d1:c1:cc:34:6f:96:71:e0:
c2:86:79:37:47:a7:e4:c8:71:3f:44:82:38:7e:11:
4d:05:96:fd:01:d8:8c:8b:75:0b:bc:6e:ad:37:1d:
77:94:0b:2a:15:1a:43:3c:f6:59:61:eb:ea:8a:73:
54:06:b0:ed:70:11:77:42:57:59:e1:80:df:eb:0b:
36:d7:7b:d6:c8:53:20:e7:3a:cb:7c:95:67:ea:ff:
25:06:80:e9:93:b2:1d:a0:58:9f:ec:60:65:76:e8:
24:2c:14:9d:86:47:83:3b:b9:66:59:7d:69:b5:bd:
46:af:4f:15:a7:21:45:d1:8c:a1:9b:8b:73:20:94:
17:0e:1b:da:d2:e3:93:fb:98:d8:db:13:2b:ed:ff:
f5:95
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Authority Key Identifier:
keyid:8D:FB:23:BD:1D:AA:3B:C0:12:62:2A:15:8F:27:BF:81:EB:94:15:42

X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Non Repudiation, Key Encipherment, Data Encipherment
X509v3 Subject Alternative Name:
DNS:localhost, IP Address:192.168.11.100, IP Address:192.168.10.200, DNS:xa.it.com, DNS:xiykj.com, DNS:*.xa.com
Signature Algorithm: sha256WithRSAEncryption
74:0f:a7:56:97:66:e1:8d:7a:5e:4e:7b:6f:b0:da:26:31:5c:
a3:77:9d:7f:25:19:1c:e2:cd:6a:ee:b3:9e:1f:55:3e:ea:8c:
05:5b:0f:9e:ac:f7:0f:72:8b:4c:6e:eb:20:4c:c3:d4:7b:d1:
63:79:54:dc:8d:46:f5:2e:73:fe:4f:5e:8f:d2:3c:54:47:90:
ae:cd:20:28:31:19:88:26:ec:46:86:1c:1e:ab:8b:67:77:d6:
81:1d:62:1b:59:7c:d6:4d:52:fe:44:b7:18:ce:6d:47:d3:34:
48:c8:59:c9:f9:3a:2a:41:9a:7c:50:c0:43:b0:6a:f4:3c:b1:
d5:49:f1:be:21:ae:b9:d8:72:48:19:f8:20:8c:3b:03:c5:c7:
26:0d:27:08:4d:0b:9e:27:ea:3c:bf:c3:09:07:fe:b0:68:9c:
76:1a:3f:49:44:af:67:9f:47:af:88:9f:50:25:1c:f4:a3:05:
b6:fb:1c:04:16:3d:6d:d3:ac:99:92:73:05:2f:c8:08:9a:e4:
88:e4:12:4d:f3:d0:aa:47:3c:eb:cf:9b:20:3a:88:e5:33:1b:
32:65:14:78:1d:c4:24:e8:63:e7:8e:18:b3:2b:bb:e2:94:38:
1d:dd:1f:f5:13:a2:db:ef:65:bc:12:a9:66:4f:48:15:57:e8:
82:79:24:a0
  1. 使用 CA 验证 ssl 证书状态,若显示“OK”则表示通过验证:
1
2
$ openssl verify -CAfile root.crt server.crt
server.crt: OK

最后,将 root.crt 导入到需要访问的客户端 PC 的“受信任的根证书颁发机构”中,同时将 server.crt、server.key 文件部署在服务器上即可。

PHPStorm 控制台出现乱码的情况,往往是由于控制台所采用的字符编码和输出内容的编码存在差异所致。比如说,控制台或许默认运用的是 GBK 编码,然而您的 PHP 代码输出的却是 UTF-8 编码的内容,抑或是其他的编码形式。

upload successful

开启 PHPStorm 的设置页面,在其中进行搜索“Console Encoding”,接着选中“Default Encoding”这一选项,并将“UTF-8”设定为默认编码。

upload successful

再次执行相关命令,此时控制台理应能够正常显示内容。

upload successful

是一个开源项目,用于破解和优化Windows系统上的Remote Desktop Protocol(远程桌面协议)。它允许你在没有官方许可的情况下,实现多用户的并发远程访问,这对于IT管理员、开发者或者需要频繁远程控制电脑的用户来说,是一个非常实用的工具。

项目简介

RDPWrap的主要功能是绕过Windows系统的限制,使得单个安装了RDP服务的计算机可以同时接受多个远程桌面连接,而无需购买额外的授权。该项目由Stas’M Sajewicz创建并维护,社区也在持续贡献和支持。

技术分析

RDPWrap的工作原理是通过对Windows的Remote Desktop Services(RDS)服务进行钩子处理,改变其内部的行为模式。它提供了一个配置工具,用于检测当前系统的支持情况,并更新本地的bypass.dll文件以启用多会话模式。此外,RDPWrap还包含一个实时更新的服务端口数据库,帮助用户跟踪最新的系统版本兼容性。

需要注意的是,由于涉及到系统底层操作,RDPWrap可能需要管理员权限运行,且在安装和配置过程中应谨慎操作,避免对系统稳定性产生影响。

应用场景

  1. 节省成本 - 对于拥有大量Windows设备但预算有限的企业,RDPWrap可以帮助他们避免购买昂贵的多用户许可证。
  2. 远程教育与培训 - 教师或教练可以同时监控多个学生的学习进度,提供即时反馈。
  3. 多用户共享 - 在家庭环境中,家庭成员可以在各自的设备上同时远程访问一台高性能主机进行游戏或计算任务。
  4. 服务器管理 - IT专业人员可以更方便地同时管理多台服务器,无需来回切换登录。

特点

  • 开源免费 - 开源意味着代码公开,用户可以自由查看,学习甚至改进。
  • 跨平台支持 - 支持多种Windows操作系统版本,从XP到最新的Windows 10。
  • 简单易用 - 提供直观的配置工具,即使是对技术不太了解的用户也能轻松设置。
  • 持续更新 - 社区活跃,不断跟进新的Windows更新,确保兼容性。

使用建议

在使用RDPWrap之前,请确保已理解其工作方式并做好数据备份,因为任何对系统核心组件的操作都可能存在风险。另外,尊重他人的版权,合法使用远程桌面服务,切勿用于非法目的。

总结来说,RDPWrap是一个强大且实用的工具,尤其适合需要高效远程管理Windows系统的用户。只要合理使用,它就能为你带来极大的便利。希望这篇介绍能够帮助你更好地理解和利用RDPWrap,享受更灵活的远程桌面体验。

项目地址:https://github.com/stascorp/rdpwrap

在使用Docker的过程中,镜像下载速度一直是许多开发者面临的痛点。尤其是在网络环境不佳的情况下,等待镜像下载完成可能会耗费大量的时间和耐心。不过,今天我要为大家介绍一个能够显著提升Docker镜像下载速度的工具——毫秒镜像。

什么是毫秒镜像?

毫秒镜像(https://docker.1ms.run)是由合肥木雷坞信息技术有限公司提供的Docker镜像加速服务。它通过在国内部署高速的镜像代理服务器,帮助用户快速获取Docker Hub上的镜像资源,从而大大缩短了镜像下载时间。

如何使用毫秒镜像?

使用毫秒镜像非常简单,主要有两种方式:全局配置和临时配置。

全局配置

全局配置可以让毫秒镜像永久生效,适用于大多数用户。以下是具体的配置步骤:

  1. 编辑Docker配置文件
    打开终端,运行以下命令,将毫秒镜像的地址添加到Docker的配置文件中:
1
echo '{"registry-mirrors": ["https://docker.1ms.run"]}' | sudo tee /etc/docker/daemon.json > /dev/null

这一步会将镜像加速地址写入/etc/docker/daemon.json文件中。

  1. 重启Docker服务
    配置完成后,需要重启Docker服务以使配置生效:
1
systemctl daemon-reload systemctl restart docker

完成以上步骤后,毫秒镜像就会自动为你的Docker镜像下载提供加速服务。

临时配置

如果你不想修改全局配置,也可以在拉取镜像时临时使用毫秒镜像。例如:

1
docker pull docker.1ms.run/library/nginx

这种方式会在本次拉取操作中使用毫秒镜像加速,而不会影响其他镜像的拉取。

登录毫秒镜像

如果需要使用更高级的功能,比如VIP加速通道,可以注册并登录毫秒镜像。登录命令如下:

1
docker login docker.1ms.run

登录后,你将享受更快速、更稳定的镜像下载体验。

赞助商与合作伙伴

毫秒镜像背后有强大的赞助商和合作伙伴支持。例如,腾讯CODING团队提供的免费Git托管和CI/CD全流程研发能效平台,以及宝塔Linux面板、雷池WAF社区版、耗子面板和林枫云等合作伙伴,都为用户提供了丰富的服务器管理和安全防护解决方案。

使用协议与免责声明

在使用毫秒镜像时,用户需要遵守相关法律法规,并自行承担使用风险。开发者不对因使用本程序而导致的任何直接或间接损失承担责任。使用本程序即视为同意免责声明的所有条款。

0%