11月
06
不想用 sftp,就自己装个 ftp。
阿里云这片文章就够了
vsftpd(very secure FTP daemon)是Linux下的一款小巧轻快、安全易用的FTP服务器软件。本教程介绍如何在Linux实例上安装并配置vsftpd。
https://help.aliyun.com/document_detail/182263.html
背景信息
FTP(File Transfer Protocol)是一种文件传输协议,基于客户端/服务器架构,支持以下两种工作模式:
- 主动模式:客户端向FTP服务器发送端口信息,由服务器主动连接该端口。
- 被动模式:FTP服务器开启并发送端口信息给客户端,由客户端连接该端口,服务器被动接受连接。
FTP支持以下三种认证模式:
操作一波
1.1 安装
yum install vsftpd
2.1 开启服务
systemctl start vsftpd
3.1 设置开机启动
- 先查看是否开机启动:
systemctl list-unit-files | grep vsftpd
- 我的系统显示这样:
systemctl list-unit-files | grep vsftpd
vsftpd.service disabled
vsftpd@.service indirect
vsftpd.target disabled
这里是未开通。
- 开启自启。
chkconfig vsftpd on
- 查看 ftp 服务监听的端口
netstat -antup | grep ftp
4.1 配置 vsftpd
为保证数据安全,本文主要介绍被动模式下,使用本地用户访问FTP服务器的配置方法。
# 创建用户 ftplin
adduser ftplin
# 给 ftplin 设置密码
passwd ftplin
# 创建一个供 ftp 使用的目录
mkdir /var/ftp/lin
# 创建一个测试文件
vim /var/ftp/lin/test.txt
# 填入 hello 保存退出
# 给 /var/ftp/lin 设置所有者
chown -R ftplin:ftplin /var/ftp/lin
再去修改 vsftpd.conf 配置文件:
vim /etc/vsftpd/vsftpd.conf
4.1 修改配置文件
vim /etc/vsftpd/vsftpd.conf
按照以下要求修改
注意 修改和添加配置文件内的信息时,请注意格式问题。例如,添加多余的空格会造成无法重启服务的结果。
#除下面提及的参数,其他参数保持默认值即可。
#修改下列参数的值:
#禁止匿名登录FTP服务器。
anonymous_enable=NO
#允许本地用户登录FTP服务器。
local_enable=YES
#监听IPv4 sockets。
listen=YES
#在行首添加#注释掉以下参数:
#关闭监听IPv6 sockets。
#listen_ipv6=YES
#在配置文件的末尾添加下列参数:
#设置本地用户登录后所在目录。
local_root=/var/ftp/test
#全部用户被限制在主目录。
chroot_local_user=YES
#启用例外用户名单。
chroot_list_enable=YES
#指定例外用户列表文件,列表中用户不被锁定在主目录。
chroot_list_file=/etc/vsftpd/chroot_list
#开启被动模式。
pasv_enable=YES
allow_writeable_chroot=YES
#本教程中为Linux实例的公网IP。
pasv_address=FTP服务器公网IP地址
#设置被动模式下,建立数据传输可使用的端口范围的最小值。
#建议您把端口范围设置在一段比较高的范围内,例如50000~50010,有助于提高访问FTP服务器的安全性。
pasv_min_port=port number
#设置被动模式下,建立数据传输可使用的端口范围的最大值。
pasv_max_port=port number
创建chroot_list文件,并在文件中写入例外用户名单。
# 输入例外用户名单。此名单中的用户不会被锁定在主目录,可以访问其他目录。及时没有例外用户,该文件也必须创建,内容为空。
# 个人建议该文件为空最好,不必去访问其他目录,世界一片安静多好呀。
vim /etc/vsftpd/chroot_list
重启服务
systemctl restart vsftpd.service
到此为止, ftp 的配置已经完了。但阿里云还得配置安全组。21 端口入方向必须打开以及上边配置的访问的最小到最大端口也要配置。
设置安全组
规则方向 |
授权策略 |
协议类型 |
端口范围 |
授权对象 |
入方向 |
允许 |
TCP |
21/21 |
所有要访问FTP服务器的客户端公网IP地址,多个地址之间用逗号隔开。允许所有客户端访问时,授权对象为0.0.0.0/0。 |
入方向 |
允许 |
TCP |
pasv_min_port/pasv_max_port。例如:50000/50010 |
所有要访问FTP服务器的客户端公网IP地址,多个地址之间用逗号隔开。允许所有客户端访问时,授权对象为0.0.0.0/0。 |
可以测试了
使用 ftp 工具。比如 win 的 ftpx, mac 的 forklift 。输入公网 ip 地址,选择 ftp 连接方式(端口号不用管),填入用户名和密码。点击连接。是不是马上就好了,并进入到指定的目录了哈。
11月
06
处理 ** API getFileSystemManager is not yet implemented** 问题
wx.chooseImage({
success: res => {
let base64 = wx.getFileSystemManager().readFileSync(res.tempFilePaths[0], 'base64');
}
})
wx.canvasToTempFilePath({
success: res => {
let base64 = wx.getFileSystemManager().readFileSync(res, 'base64');
}
});
对应到 uniapp,将 wx 换成 uni 即可。如:
# 该方法在微信小程序中可行,混编的 h5 不行,可通过条件编译处理
uni.getFileSystemManager().readFileSync(r, 'base64');
# 处理如下
// 将网络图片转换成 base64 各不相同
// #ifdef APP-PLUS
uni.request({
url: this.extra.topic.thumbnail,
method: 'GET',
responseType: "arraybuffer",
success: res => {
const arrayBuffer = new Uint8Array(res.data); //先将本地图片路径转换成array类型
const base64Img = uni.arrayBufferToBase64(arrayBuffer); //再转换成base64类型
}
});
// #endif
// #ifdef MP
uni.getImageInfo({
src: this.extra.topic.thumbnail,
success: res => {
if (res.errMsg == 'getImageInfo:ok') {
const base64Img = uni.getFileSystemManager().readFileSync(res.path, 'base64');
}
},
fail: error => {
this.extra.topic = null;
}
});
// #endif
11月
04
11月
03
使用一个 url 链接就可以打开一个 app,是个多方便的事情。不过,得先安装该 app 啊。不过,肯定是蛮好的。
相关链接
apple 文档
uniapp 文档
操作一波
- 创建 app id 的时候,要将 Associated Domains 打钩。
- 服务器端准备 apple-app-site-association 文件。该文件就是文件名,不需要任何后缀,内容如下:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "VQYDABC49G.pro.xiangrong.xiaoqubao",
"paths": [ "/ulink/*"]
}
]
}
}
apps 就是空的,appID 的 VQYDABC49G 去开发账号中 Certificates, Identifiers & Profiles 的 Identifiers 中查看,就是 App ID Prefix。后半的 pro.xiangrong.xiaoqubao 就是 Bundle ID。
paths 自己定义。用于处理可以跳转到App的链接,支持通配符*,?以及NOT进行匹配,匹配的优先级是从左至右依次降低。 apple-app-site-association 放在根目录,paths 加个路劲方便和其他路径区分开来。如果该域名也有其他业务的话。
上边的内容你要修改的好好的。然后放在域名映射的根目录的 .well-known 文件夹下。然后通过 xxxx/.well-known/apple-app-site-association 能够访问到就可以。
当然,如果使用 nginx,可以直接在 nginx 的 .conf 中配置 location 也可以。
- 上边都配置好了。然后,在 app 程序端配置打包就好。这里是 uniapp 的搞法。打开配置文件 mainfest.json ,找到 App 常用其他设置,然后在关联域这里添加新项即可。比如添加 applinks:zeipan.com, 通过源码视图就可以看的到的。如:
"capabilities" : {
"entitlements" : {
"com.apple.developer.associated-domains" : [ "applinks:zeipan.com" ]
}
},
- 打包。如果是 uniapp,先打包基座。删除手机上的已有 app(如果之前打包过)。然后运行,运行到 App Ios 基座。
-
测试。上边的部分都准备好了,打开备忘录,输入link 地址。 比如: https://zeipan.com/ulink/?title=test。 保存,点击链接。如果上边都配置对了,这个时候就可以打开刚才安装的 app。
-
接受参数。 通过 https://www.html5plus.org/doc/zh_cn/runtime.html#plus.runtime.arguments 获取参数。有了参数,你就可以做想做的事情,比如跳转到某个页面,传递某个参数等等。
这里以接受参数,然后跳转到某个页面为例:
let params = null;
if(plus.runtime.arguments != ""){
try{
params = JSON.parse(plus.runtime.arguments);
}catch(e){
let arr = plus.runtime.arguments.split('?');
params = {};
if (arr.length == 2) {
arr = arr[1].split('&');
for(let str of arr) {
let p = str.split('=');
if (p.length == 2) {
params[p[0]] = decodeURIComponent(p[1]);
}
}
}
}
let tabbars = ['views/home/index', 'views/message/index', 'pages/mine/index'];
if (params.page) {
let isTab = false;
for(let tabbar of tabbars) {
if (params.page.indexOf(tabbar) >= 0) {
isTab = true;
break;
}
}
if (isTab) {
uni.switchTab({
url: params.page
});
} else {
uni.navigateTo({
url: params.page
});
}
}
}
注意对传递的 url 进行 encodeURIComponent 和 decodeURIComponent。
11月
02
11月
02
通过各种方式方法将 app 上传到 app sotre connect 中,准备提交新版本,进行发布时,发布构建版本不不见了。这个时候肯定会很着急的。咋办咋办呢。有一个反馈也行啊,没有任何反馈就是一抹黑。网上说使用了某个权限,没有在 plist 中进行说明。说明了就好。这个是一方面,也不全面。
不灯下黑
登录进去 app store connect,然后选择你的app,点击上方的 TestFlight,在这里可以看见你上传的 app 信息。如果是在处理中,等等就好(这是一个反馈,免得一抹黑),如果准备提交。你就可以去构建版本了。
11月
02
判断手机上是否安装了常用的 app 是一个很必要的功能。比如你 ios 端,想做微信登录功能,就得先判断手机是否安装了微信。因为如果你不判断,直接显示微信按钮,如果用户手机根本没装微信,app 上架就会不成功。
https://ask.dcloud.net.cn/article/35621
https://ask.dcloud.net.cn/article/39182
调用 api
let pinfo = {
pname: 'com.tencent.mm',
action: 'weixin://'
}
let hasWeixin = plus.runtime.isApplicationExist(pinfo);
console.log(hasWeixin)
通过 URLscheme 信息,通过 plus.runtime.isApplicationExist 来判断。
常用的 app URLscheme信息
平台 |
pname |
action |
微信 |
com.tencent.mm |
weixin:// |
QQ |
com.tencent.mobileqq |
mqq:// |
微博 |
com.sina.weibo |
sinaweibo:// |
淘宝 |
com.taobao.taobao |
taobao:// |
支付宝 |
com.eg.android.AlipayGphone |
alipay:// |
京东 |
com.jingdong.app.mall |
openApp.jdMobile:// |
高德地图 |
com.autonavi.minimap |
iosamap:// |
百度地图 |
com.baidu.BaiduMap |
baidumap:// |
优酷 |
com.youku.phone |
youku:// |
拼多多 |
com.xunmeng.pinduoduo |
pinduoduo:// |
小区宝 |
pro.xiangrong.xiaoqubao |
xiaoqubao:// |
哈哈,当然我们小区宝也有
拼多多 URLscheme
额外
# app 系统
let osName = plus.os.name;
console.log(osName);
# 系统名字 Android,iOS
自己的 app 设置 URLscheme
IOS 配置方法
Android 配置方法
https://uniapp.dcloud.net.cn/tutorial/app-ios-schemes.html#
10月
24
app 中能直接打开小程序也是一个很好的体验。那么怎么搞呢。 uniapp 混编的是这样弄的。
参考资料
https://uniapp.dcloud.net.cn/api/other/open-miniprogram.html#navigatetominiprogram
https://www.html5plus.org/doc/zh_cn/share.html#plus.share.ShareService.launchMiniProgram
操作
先通过 getService 拿到 weixin,再调用 launchMiniProgram 方法。
// #ifdef APP-PLUS
plus.share.getServices((res) => {
let weixin = res.find(i => i.id === 'weixin');
if (weixin) {
weixin.launchMiniProgram({
id: 'gh_b8e08725bcda',
path: 'pages/meet/index',
type: 0
}, (res) => {
}, (err) => {
});
}
}, (err) => {
console.log("获取分享服务列表失败: " + JSON.stringify(e));
});
// #endif
注意点:
- 先从 getServices 里找到 weixin。
- launchMiniProgram 第一个参数(options)的 id 是小程序的原始id,不是 appid。
10月
20
安装 jdk
打开 item2(反正比默认终端好用),输入下边的命令,回车看看
/usr/libexec/java_home -V
我的电脑会出现:
Matching Java Virtual Machines (2):
18.0.1 (x86_64) "Oracle Corporation" - "Java SE 18.0.1" /Library/Java/JavaVirtualMachines/jdk-18.0.1.jdk/Contents/Home
17.0.1 (x86_64) "Oracle Corporation" - "Java SE 17.0.1" /Library/Java/JavaVirtualMachines/jdk-17.0.1.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk-18.0.1.jdk/Contents/Home
如果没有这个,需要先安装 jdk。 可以去这里 https://www.oracle.com/java/technologies/downloads/ 下载安装
生证书
sudo keytool -genkey -alias xiaoqubao -keyalg RSA -keysize 2048 -validity 36500 -keystore xiaoqubao.keystore
-alias xiaoqubao xiaoqubao 是别名,因为我的 app,叫小区宝,就搞了这个名字
-keystore xiaoqubao.keystore xiaoqubao.keystore 是生成签名证书文件的名字
回车,输入电脑的密码,然后一系列操作输入证书的密码,姓名,企业名字,等这些。最后输入是,回车。证书就生好了。
看证书
keytool -list -v -keystore xiaoqubao.keystore
输入以上命令,回车。输入证书密码,就可以看见证书的信息了。如下所示:
密钥库类型: PKCS12
密钥库提供方: SUN
您的密钥库包含 1 个条目
别名: xiaoqubao
创建日期: 2022年10月20日
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=zhoulin, OU=xiangrong, O=xiangrong, L=shanghai, ST=shanghai, C=china
发布者: CN=zhoulin, OU=xiangrong, O=xiangrong, L=shanghai, ST=shanghai, C=china
序列号: e4f7ee369f21453d
生效时间: Thu Oct 20 18:41:29 CST 2022, 失效时间: Sat Sep 26 18:41:29 CST 2122
证书指纹:
SHA1: 13:00:A8:4A:11:96:1F:30:78:1A:72:32:0E:7E:AC:4F:C4:64:9C:AC
SHA256: E3:EC:BA:4F:24:04:A6:28:B3:EB:BC:46:53:75:73:AC:7F:F3:7D:8C:01:DC:74:10:E2:50:A5:3C:6B:B5:D7:48
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 8A 89 19 CF BA E8 6D 36 46 74 15 D9 A1 FF CF C9 ......m6Ft......
0010: 4A 5C AA 30 J\.0
]
]