• 最新文章
  • linux
  • php
  • sql
  • 服务端
  • tool
  • cocos

宝塔国际版aapanel(宝塔海外版)

简单介绍 aapanel是宝塔单独运维的海外英文版本,无需登陆即可使用。 目前国内访问aapanel官网会跳转到bt.cn因此我复制了一份在这里方便大家安装。 安装要求 内存:512M以上,推荐768M以上(纯面板约60M系统内存) 硬盘:100M以上可用硬盘空间(纯面板约20M磁盘空间) 系统:CentOS 7.1+(Ubuntu20、Debian10),保证是干净的操作系统,没有安装Apache/Nginx/php/MySQL的其他环境(现有环境不能安装) Centos安装命令: yum install -y wget && wget -O install.sh http://www.aapanel.com/script/install_6.0_en.sh && bash install.sh forum Ubuntu/Deepin : wget -O install.sh http://www.aapanel.com/script/install-ubuntu_6.0_en.sh && sudo bash install.sh forum Debian : wget -O install.sh http://www.aapanel.com/script/install-ubuntu_6.0_en.sh && bash install.sh forum

在 Vim 中显示行号的几种方法

在 Vim 中显示行号,你可以使用以下几种方法: 临时性显示行号 在 Vim 中输入以下命令: :set number 这会立即在当前 Vim 会话中显示行号。当你关闭 Vim 之后,行号设置不会保存。 如果你只想显示相对行号,可以使用: :set relativenumber 要同时显示绝对行号和当前行号用绝对值,其余用相对值,可以这样做: :set number relativenumber 永久性显示行号 要使得每次打开 Vim 时都显示行号,你可以将设置添加到你的 Vim 配置文件(通常是 ~/.vimrc 文件)中。打开你的 ~/.vimrc 文件,并添加以下行: set number 同样,对于相对行号的永久性设置,可以添加: set relativenumber 或者同时添加绝对和相对行号: set number relativenumber 切换行号显示 如果你想要设置一个快捷键来切换行号显示,可以在你的 ~/.vimrc 中添加以下命令。例如,使用 键来切换: nnoremap <F2> :set number! number?<CR> 这条命令会切换行号显示状态,并在 Vim 的命令行上显示当前的行号状态(启用或禁用)。 总结 根据你的需要,你可以选择临时性或永久性显示行号,并且可以通过编辑 ~/.vimrc 文件来设置快捷键方便地切换行号显示。这些方法可以帮助你更好地在 Vim 中进行编辑和导航。

linux查找字符串命令

在Linux中,可以使用多个命令来查找特定的字符串。下面是几个常用的命令: 1. grep命令:grep命令用于在文件中搜索特定字符串。它的基本语法如下: grep 搜索模式 例如,要在文件”file.txt”中查找字符串”hello”,可以使用以下命令: grep “hello” file.txt 如果要忽略大小写,可以使用”-i”选项: grep -i “hello” file.txt 在当前目录下的所有文件中搜索字符串"exampleString": grep -r "exampleString" . 2. find命令:find命令用于递归地在目录树中查找文件和目录。它的基本语法如下: find 若要查找包含特定字符串的文件,可以使用以下命令: find /path/to/directory -type f -exec grep -l “hello” {} \; 这将在指定目录及其子目录中查找所有包含字符串”hello”的文件。 使用find命令查找以.txt为后缀名的文件,并在当前目录及其子目录中递归查找: find . -name "*.txt" 查找当前目录及其子目录中所有名称中包含"test"的文件,并输出它们的完整路径: find . -name "*test*" 3. ack命令:ack命令是grep的替代品,它专门用于代码的快速查找。安装ack后,可以使用以下命令: ack “hello” /path/to/directory 这将在指定目录及其子目录中查找包含字符串”hello”的文件。 4. ag命令:ag命令也是grep的替代品,它可以更快地搜索文件。安装ag后,可以使用以下命令: ag “hello” /path/to/directory 这将在指定目录及其子目录中查找包含字符串”hello”的文件。 以上是几个常用的Linux查找字符串的命令,根据你的需求选择适合的命令来进行查找操作。

php生成md5签名原理

数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。 MD5是没办法反向破解的 在讲解这个之前一定要了解一个东西:MD5是没办法反向破解的,如果你不了解这个那这原理理解起来有点难,当然一些简单的组合通过一些网站的暴力破解,但我们的数据都是32甚至更多的MD5加密,所以这是几乎不能破解的。了解了这一点,你才能不在这个原理上走弯路。 双方约定: 服务方一般会给请求方一个appid和appkey, appid是请求方请求的唯一标识,这个是可以在网络上传输的,而appkey是不在网络上传输的。 请求方: 请求方如果需要请求,他会把请求的数据(这个请求数据中一定包含appid)按一定的规则(这个规则是双方规定好的一个算法)进行过滤排序,然后把过滤排序后的参数加上appkey进行MD5加密码(这也就是我们说的签名),然后再把请求的参数加上签名一起传给服务方。 服务方: 服务方收到请求,会首先把请求参数的不需要或空的参数值过滤掉,然后按照同样的算法进行过滤排序,然后拿出请求中的appid,在服务器数据库搜索中appid对应的appkey,然后把参数加上appkey进行MD5加密同样生成签名,这时拿这个签名去与请求方传的参数中的签名对比,如果相等,签名成功。 注意点: 在整个过程中其实就是参数加appkey进行MD5加密后的一个对比,但是appkey是不在网络上传输的,是请求方和服务方分别在本地保存的一个同样的标识,这样可以起到防止网络数据劫持的危险。 核心程序: 里面只写了md5的程序,rsa的略。 <?php /** * 资料来源:支付宝 * 签名:所有交互的数据都需要签名,除了 sign(签名),和 sign_type(签名方式:md5,rsa) * md5签名 * 1.私钥:只有你和服务器知道,用于加密数据,由英文字母和数据组成,共32位 * 2.请求时签名:$sign=md5((待签名字符串.md5私钥)); * 3.返回时验证:$_POST==md5((待验证字符串,md5私钥)) * rsa签名 * 1.私钥与公钥:openssl生成 * 2.请求时签名:$sign = rsaSign(待签名字符串,私钥); * 3.返回时验证:$_POST == rsaVerify(待验证字符串,公钥); */ /** * 演示md5签名过程 */ /** * 除去数组中的空值和签名参数 * @param $para 签名参数组 * return 去掉空值与签名参数后的新签名参数组 */ function paraFilter($para) { $para_filter = array(); while (list ($key, $val) = each ($para)) { if($key == "sign" || $key == "sign_type" || $val == "")continue; else $para_filter = $para; } return $para_filter; } /** * 对数组排序 * @param $para 排序前的数组 * return 排序后的数组 */ function argSort($para) { ksort($para); reset($para); return $para; } /** * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 * @param $para 需要拼接的数组 * return 拼接完成以后的字符串 */ function createLinkstring($para) { $arg = ""; while (list ($key, $val) = each ($para)) { $arg.=$key."=".$val."&"; } //去掉最后一个&字符 $arg = substr($arg,0,count($arg)-2); //如果存在转义字符,那么去掉转义 if(get_magic_quotes_gpc()){ $arg = stripslashes($arg); } return $arg; } /** * 生成md5签名字符串 * @param $prestr 需要签名的字符串 * @param $key 私钥 * return 签名结果 */ function md5Sign($prestr, $key) { $prestr = $prestr . $key; return md5($prestr); } class Submit{ public $_sign_type =''; public $_md5_key = ''; public $_private_key_path = ''; public function __construct($sign_type){ $this->_sign_type = strtoupper($sign_type); } /** * 对参数进行过滤,然后排序

PHP openssl_decrypt 加密解密,js的CryptoJS数据加密解密

一、php方面 1.需要开启openssl扩展 2.注:php 的 mcrypt_ 函数簇在 7.1.0 版本中开始 deprecated,并在 7.2.0 版本中彻底废弃。其实在 2015 就已经开始建议大家使用 openssl_encrypt/openssl_decrypt 来代替 mcrypt_encrypt/mcrypt_decrypt,缓冲了 N 久,这一天终于在 7.2.0 版本上到来了。 openssl_decrypt 的 OPENSSL_ZERO_PADDING默认会补零到16位 aes-128-cbc: 表示16位的 method 长度的问题,密码学方式我们用的最多的有两种,AES-128-CBC 与 AES-256-CBC 字符串的长度问题 1 bit 位 = 1 二进制数据 1 byte 字节 = 8 bit 1 字母 = 1 byte = 8 bit 128位/8=16字节=16字符 192位/8=24字节=24字符 256位/8=32字节=32字符 也就是说KEY 的长度是根据AES-128-CBC 与 AES-256-CBC 变换的。使用 AES-128-CBC 时,key的长度应该为16位,使用 AES-256-CBC时,key的长度应该为32位。 <?php // 需要加密的字符串 $plaintext = "hello"; // 加密密钥(必须是16、24或32个字符长,对应AES-128、AES-192、AES-256) $key = "examplekey123456"; // 请确保密钥的安全性 // 初始化向量(IV),必须是16个字符长 $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-128-cbc')); // 加密字符串 $encrypted = openssl_encrypt($plaintext, 'aes-128-cbc', $key, 0, $iv); // 如果需要,可以将IV和密文一起存储或传输(通常使用base64编码以便于存储和传输) $encrypted_with_iv = base64_encode($iv.$encrypted); echo "加密后的字符串(包含IV): " . $encrypted_with_iv . ""; // 将加密字符串(包含IV)解码为原始二进制数据 $decoded = base64_decode($encrypted_with_iv); // 提取IV(前16个字符)和密文(剩余部分) $iv = substr($decoded, 0, 16); $encrypted = substr($decoded, 16); // 解密字符串 $decrypted = openssl_decrypt($encrypted, 'aes-128-cbc', $key, 0, $iv); echo "解密后的字符串: " . $decrypted; ?> 二、js方面 cryptojs:下载地址 https://code.google.com/archive/p/crypto-js/downloads cryptojs:文档说明 CryptoJS - CryptoJS cryptojs:在线调试工具 在线加密解密 <!-- 加密js--> <script src="__STATIC__/common/js/crypto/rollups/aes.js"></script> <script src="__STATIC__/common/js/crypto/components/pad-zeropadding.js"></script> /** * 加密 */ function doEncrypt(data) { if (data == '' || data == undefined) { return data; } let key = CryptoJS.enc.Latin1.parse('F79JF2tNdHLW4bid'); let iv = CryptoJS.enc.Latin1.parse('bk4h1mv84RCOdyn2'); //加密 return CryptoJS.AES.encrypt(data, key, {iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding}); } 转自:https://blog.csdn.net/qq_25275355/article/details/116918996

AWS 在EC2上创建root用户,并使用root用户登录

最近有项目需要使用AWS的EC2服务器; 在创建服务器实例之后发现,没有root用户,仔细阅读AWS EC2文档,发现默认是ec2-user用户; 那我们需要创建一个root用户 1.创建 root 用户 注意:必须要要在ec2-user用户下执行 sudo passwd root 之后会提示你输入两次密码: Changing password for user root. New password: Retype new password: 输入完成之后我们的root用户就创建成功了; 我们尝试登录用户 su root 输入密码 Password: # 可以正常登录; AWS EC2默认情况下,密码身份验证和根用户登录是被禁用的;AWS EC2 管理 Linux 实例的用户账户 2.开启密码登录 同时也告诉我们,如果有需要,可以自己开启密码登录; vim /etc/ssh/sshd_config 将 PasswordAuthentication no 配置的 no 改为 yes,支持其他用户密码登录 如果需要 root 用户密码登录 将 PermitRootLogin 配置改为yes 重启 sshd 可以用下面命令。也可以用 systemctl restart sshd.service ; sudo /sbin/service sshd restart 3.设置其他用户密码 在 root 用户下可以设置其他用户密码 passwd 用户名 输入密码 New password: Retype new password: 这样就可以正常密码登录了;不过还是建议使用密钥登录;密码可以设置,在sudo的时候使用。

centos7 安装用yum命令安装wget无法安装

centos7 安装用yum命令安装wget无法安装 lijunlin 2019.03.10 15:56:56 字数 113 阅读 8,859 在终端执行yum -y install wget时,终端提示: 已加载插件:fastestmirror Loading mirror speeds from cached hostfile There are no enabled repos. Run “yum repolist all” to see the repos you have. To enable Red Hat Subscription Management repositories: 解决方法:在终端运行curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

go操作aws s3

v2 官方推荐版本,需要go版本>=1.20 安装 go get github.com/aws/aws-sdk-go-v2 go get github.com/aws/aws-sdk-go-v2/config go get github.com/aws/aws-sdk-go-v2/service/s3 必要参数 bucket: 存储桶的名称 Region: 存储桶所在区域,例us-east-1 accessKeyID: 访问存储桶所需的KeyID secretAccessKey: 访问存储桶所需的AccessKey 如何获取accessKeyID和secretAccessKey:指南 var ( s3Client *s3.Client bucket = "yourbucketname" ) func InitS3Client() { accessKeyID := "xxxxx" secretAccessKey := "xxxxx" cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("ap-east-1"), config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(accessKeyID, secretAccessKey, "")), ) if err != nil { log.Fatalf("unable to load SDK config, %v", err) } s3Client = s3.NewFromConfig(cfg) } func UploadToS3(filePath, fileName, mimeType string) (string, error) { file, err := os.Open(filePath) if err != nil { return "", fmt.Errorf("failed to open file %q, %v", filePath, err) } defer file.Close() _, err = s3Client.PutObject(context.TODO(), &s3.PutObjectInput{ Bucket: aws.String(bucket), Key: aws.String(fileName), Body: file, ContentType: aws.String(mimeType), }) if err != nil { return "", fmt.Errorf("failed to upload file to S3, %v", err) } return fmt.Sprintf("https://%s.s3.amazonaws.com/%s", bucket, fileName), nil } 参考2 // 创建s3Client实例。 payKeyId := "AK***" paySecret := "oiy***" accessKeyID := payKeyId secretAccessKey := paySecret cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("ap-east-1"), config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(accessKeyID, secretAccessKey, "")), ) if err != nil { fmt.Printf("unable to load SDK config, %v", err) } name := "test" s3Client := s3.NewFromConfig(cfg) filePath := "static/test.jpg" // 读取本地文件。 fd, err := os.Open(filePath) if err != nil { return } defer fd.Close() _, err = s3Client.PutObject(context.TODO(), &s3.PutObjectInput{ Bucket: aws.String("up"), Key:

免费flux 文本转图像生成器,无限次数

免费flux 文本转图像生成器 Free AI FLUX Image Generator是一款免费flux.1文本转图像生成器,用于文本到图像的生成。利用Flux的模型,它创建高质量、创意十足的图像,以增强您的工作流程,而且无限次数。 Free AI FLUX Image Generator使用流程 1登录(或注册) 2输入英文提示词,注意,一定是英文提示词。 3等待(我们按照队列处理请求,请求量大时,可能较长时间,所以需要教程时间,您可关闭网页,后续可以在我的 FLUX 中找到您的任务) 价格:完全免费,且不限制生成次数 官网地址:https://aiflux.cc/zh