普通视图

发现新文章,点击刷新页面。
昨天以前首页

Android 系统开发源码环境搭建

作者 Gracker
2018年11月1日 19:40

不管是 Android App 开发工程师还是 Android 系统开发工程师,对 Android 系统有一定的了解是很有必要的,正好我这几天在家里搭建了个开发环境,把过程分享出来,有需要的人可以看一下。

大概的步骤包含下面几个:

  1. 安装 Ubuntu 系统
  2. 配置 Ubuntu 系统
  3. 安装必备的软件
  4. 配置 VPN (可选)
  5. 下载 AOSP 代码
  6. 配置编译环境并编译 Pixel 的代码
  7. 刷机
  8. 修改和编译 Framework 、Service、Res

建议准备下面的硬件,当然没有也没关系,有了更好

  1. PC 或者笔记本
  2. 512GB 的 SSD
  3. Pixel 手机一台

安装 Ubuntu 系统

Linux 这边我建议用 Ubuntu 系统,不建议用虚拟机,直接安装一个新的 Ubuntu 系统会比较好,Ubuntu 目前最新的 LTS 版本是 18.04,目前安装 Ubuntu 的步骤会比较简单:

  1. 下载 Ubuntu18.04 版本:ubuntu 18.04
  2. 使用 Ubuntu 推荐的工具做一个 U 盘启动盘
  3. 使用 U 盘安装 Ubuntu 系统

mydesktop

配置 Ubuntu 系统

  1. 安装搜狗输入法
  2. 安装 vim :sudo apt install vim
  3. 安装 adb
  4. 安装 fastboot

安装必备的软件

  1. VS Code
  2. Android Studio
  3. Meld
  4. Wine
  5. WPS

配置 VPN (可选)

  1. ShadowSocks

下载 AOSP 代码

没有 v-p-n 的话,推荐使用清华的镜像站:https://mirror.tuna.tsinghua.edu.cn/help/AOSP/

## repo 下载 


1
2
3
4
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

建立工作目录

1
2
mkdir WORKING_DIRECTORY
cd WORKING_DIRECTORY

初始化仓库

1
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest

下载代码(-c –no-tags 能下载更少的代码)

1
repo sync -c --no-tags

配置编译环境并编译 Pixel 的代码

配置编译环境

安装jdk

1
2
sudo apt-get update
sudo apt-get install openjdk-8-jdk

安装相关依赖

1
2
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev libxml2-utils xsltproc unzip

下载 Pixle 的驱动

编译 Android Master 的代码的话,需要下载对应的手机的驱动,在这个页面找到自己需要的驱动:
https://developers.google.cn/android/blobs-preview
extract-qcom-sailfish

解压如下:
extract-google_devices-sailfish

编译 Pixle 的系统镜像

在源码根目录下执行

1
source build/envsetup.sh

执行下面的命令选择要编译的手机型号和版本(user、userdebug、eng)

1
lunch

lunch

选择好了之后,输入对应的数字或者数字后面的,执行 make 开始编译(可选择加 -j4,4带代表线程数,机器性能好的话可以8或者16,看cpu):

1
make -j8

make-j8

编译成功

out 目录会生成对应的 image
out_folde

刷机

在源码根目录下,执行下面的命令,即可刷入对应的系统到

fastboot

1
fastboot flashall

fastboot-flashal

修改和编译 Framework 、Service、Res

以下命令都在源码根目录下执行

修改代码 IDE

java代码

java 代码推荐使用 AndroidStudio 打开、编辑

c/cpp代码

c/cpp 代码推荐使用 SourceInsight 、Eclipse、VS Code 打开、编辑

编译 Framework

1
mmm framework/base

编译 Services

1
mmm frameworks/base/services

编译 res

1
mmm frameworks/base/core/res

root && remount

root--remount

push

root && remount 之后,就可以把对应的 framework、Services、Res 等 push 进去,重启 shell 即可生效,或者直接 adb sync system 即可, sync system 会把 out目录下对应机型的 system 目录和手机的 system 目录进行同步,很是方便。

例子:

1
adb root && adb remount && adb shell stop && adb sync system && adb shell start

关于我 && 博客

下面是个人的介绍和相关的链接,期望与同行的各位多多交流,三人行,则必有我师!

  1. 博主个人介绍 :里面有个人的微信和微信群链接。
  2. 本博客内容导航 :个人博客内容的一个导航。
  3. 个人整理和搜集的优秀博客文章 - Android 性能优化必知必会 :欢迎大家自荐和推荐 (微信私聊即可)
  4. Android性能优化知识星球 : 欢迎加入,多谢支持~

一个人可以走的更快 , 一群人可以走的更远

微信扫一扫

麒麟系统编译jcef

作者 aotxland
2022年5月4日 16:41

获取系统

可以从优麒麟的官网获取最新版22.04、20.04和V10的安装包,我这里用的是一个老版本。
https://www.ubuntukylin.com/downloads/
麒麟官网

安装过程这里就省略了,基本上按照提示来就行了。

下载JCEF代码

jcef项目在Bitbucket上,地址如下:
https://bitbucket.org/chromiumembedded/java-cef/src/master/
现在jcef在Github也有代码了,但是提issue的话最好是去Bitbucket上:
https://github.com/chromiumembedded/java-cef

sudo apt-get install git #麒麟系统有的版本并没有git需要先手动安装一下

git clone https://github.com/chromiumembedded/java-cef.git #下载源代码

编译JCEF

其实打开代码里的CMakeLists.txt可以看到编译的要求和基本的步骤,可以看到最新版的jcef100要求的CMake的最低版本是3.19,但是目前麒麟系统能下载到的最新版为3.5.1,不符合要求。这里的话有两种方法,一种是下载最新版CMake源码编译安装,另一种是编译一个老版本的jcef。

我选的是后一种方法,毕竟,用麒麟系统的人也不是那么需要最新版的代码

查看git log可以发现,在2021年12月14日,jcef更新了MakeFile,而在此之前的jcef95要求的CMake版本是2.8。
使用git reset退回到CEF version 95.7.14+g9f72f35+chromium-95.0.4638.69这个版本。

git reset --hard ae6912a705e6a2a60f0f156fcc2e8c03bf8285c4

我们还需要安装build-essential这个包。

sudo apt-get install build-essential

麒麟系统自带了JDK 1.8,但是并没配置Java Home,需要我们手动配置一下

vi /etc/profile

#在末尾添加

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

#保存退出

#退出以后执行 
source /etc/profile

然后就可以开始编译了:

cd /java-cef/src  #到代码路径下src文件夹下
mkdir jcef_build && cd jcef_build

cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug ..
make -j4

如果你的网络条件比较好的话,基本就可以顺利编译完成,但是如果不那么理想的话,可以手动去http://opensource.spotify.com/cefbuilds/下载一下编译所需要的文件,需要下载的是95版本Linux 64的包。将下载好的包放到java-cef/src/third_party/cef路径下。

使用如下指令编译所需的Java Class文件。

cd /java-cef/src/tools
./compile.sh linux64

测试编译结果

cd /java-cef/src/tools
./run.sh linux64 Debug detailed

运行效果如图
jcef test

打包

测试正常后可以使用打包工具进行打包,毕竟不可能每台机器都这样编译一通。

cd /java-cef/src/tools
./make_distrib.sh linux64

打包的文件在/out路径下。

最后

其实,官方也知道jcef这个编译是个大坑,没个半天功夫根本搞不定,于是官方把jcef运行需要的包和可执行文件上传到了Maven,方便了太多。但是这个可执行文件在Windows下测试可行,而麒麟系统下却报错,有点可惜。
Windows下的maven dependency:

    <dependency>
        <groupId>me.friwi</groupId>
        <artifactId>jcefmaven</artifactId>
        <version>95.7.14.11</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/me.friwi/jcef-natives-windows-amd64 -->
    <dependency>
        <groupId>me.friwi</groupId>
        <artifactId>jcef-natives-windows-amd64</artifactId>
        <version>jcef-544024e+cef-95.7.14+g9f72f35+chromium-95.0.4638.69</version>
    </dependency>

顺便提一嘴,这个native包用阿里的源下载不下来,后来适用华为的源下下来的。

给第一次接触服务器系统的视障同学

作者 Armstrong
2023年3月14日 17:40

  相比于十几二十年之前,现在的服务器已经变得非常便宜了,人手一台根本不是啥稀奇事。买服务器是不难,但是买完之后呢?也许会遇到各种坑,甚至会被坏人搞得团团转。不信?请您接着看哈。

  想想看,买服务器的用途是什么?还不是为了运行网站吗?哦对了,QQ 语音的音质贼差,所以,嗯,想要另开炉灶,自己搭建一个语音聊天室,还别说不行哈。啥,要模仿大佬,搞一个酷酷的虚拟局域网,把朋友们都邀请到局域网当中,私下里玩儿一些黑科技?这当然也行,我就是这么干的。所以,服务器真的可以做许多事情。但是,可别高兴太早。刚买到服务器,他就会给您来个下马威。哦对了,为了省力起见,如果您连电脑的基本操作都不会,不懂神马是远程桌面,更不知 SSH 为何物,更重要的,您也不想了解这些破东西到底是何物,那就请您轻点“关闭标签页”按钮吧,以免待会越看越糊涂,一冲动把搂机或者电脑砸了,哈哈哈。

  好了,很高兴您能和我一起踏上这段惊险的旅程。说惊险真不是唬人,弄不好您还真的会把服务器搞垮,但是,俗话说得好啊,失败是成功他妈,所以,只要把成功他妈搞定了,那,嘿嘿。另外我想告诉您,接下来,我们不仅仅会接触 Windows 系统,还会接触 Linux 系统,而且是世界上最前沿的版本哦。

远程桌面咋不声不响的

  如果您买的是 Windows 系统的服务器,这年头最低版本也是 2012 了吧,2008?这是啥上古时代的玩意儿,即使能买到也不建议您买,2008 已经停服两三年了,漏洞早就堆积成山了,而且它还有更坑的问题——音质贼差,还免费附赠水声音效。

  默认情况下,Windows Server 是不会开启音频服务的,解决方法是手动打开。怎么个开法呢?请把分隔线当中的内容复制到一个空白的记事本窗口,然后保存成 .bat 文件(Windows 批处理文件):

————— 我是华丽的分隔线 —————

@echo off
sc config audiosrv start=auto
sc start audiosrv
%systemroot%\system32\narrator.exe

————— 我是华丽的分隔线 —————

  将这个 bat 文件复制到服务器。咋复制呢?
1. 通过远程桌面连接到您的服务器并使用 Ctrl + Alt + Break 键将远程桌面变成窗口模式。
2. 复制刚才保存的 bat 文件。
3. 切换到远程桌面窗口,并使用 Ctrl + Alt + Break 键将窗口变成最大化。
4. 按 Win+R 组合键调出运行对话框,然后按 Esc 键退出运行对话框。
5. 这时,键盘焦点应该停留在桌面上,使用 Ctrl+V 粘贴复制的文件到桌面上。
6. 按该文件的第一个字符,例如文件名是 1.bat,就按一下 1,然后重命名该文件,看看能不能复制文件名。如果能复制,就按 Esc 退出重命名,然后用本地的读屏听一下,正确的话,按回车键,稍等片刻,就能听到讲述人的语音啦。

在 Windows Server 服务器上安装读屏

  在服务器上用讲述人可以完成许多简单操作,当然了,讲述人也有其独到之处,至于是什么?请允许我保留一点神秘色彩。不过,您也许习惯使用 NVDA 或者其他读屏,这时就需要下载安装。那位说了,下载安装这个谁不会啊?我想说,还真不一定。

把读屏软件的安装包复制到服务器

  这个相信您看完上面的章节自然都会,所以也就不必多提了。但是要提醒您一句:从本机复制读屏到服务器需要花费很长时间,在这个过程中不能断开远程桌面会话,否则就要重新复制了。另外,也请您注意查毒,不然服务器感染病毒就热闹喽。

下载读屏软件

在 Windows Server 2019 及之前版本的系统上关闭 IE-ES

  IE-ES 是什么东东呢?IE-ES 是 IE 增强的安全配置。微软自己也知道 IE 跟系统的集成太紧密了,而且这个破东西漏洞还特别多,多如牛毛,还真不是我诋毁的,微软自己都放弃 IE 了。这么多漏洞,在服务器上怎么行?用这破东西上网岂不是分分钟让服务器被入侵啊?所以微软想出了个昏招——限制 IE 的各种功能,这就叫做 IE 增强的安全配置。它限制了什么呢?首先,下载东西您就甭想了,还有 Javascript 也根本无法执行。既然如此,那下载读屏也就成了无稽之谈。

  关闭 IE-ES 的方法是酱紫滴:打开“服务器管理器”,然后按 Tab 找到并打开“配置此本地服务器”。按 Tab 找到“IE 增强的安全配置,设置为 启用”,回车。然后把两个“启用”单选按钮设置成“关闭”,点击“确定”就行了。

常用读屏软件的官方网站

  您也许知道,通过某些搜索引擎寻找软件并不可靠,很可能会被诱导安装许多不需要的软件。我给您常用的读屏软件的官方网站,您进去就知道怎么下载了。

NVDA:https://nvaccess.org/
这是世界上广泛使用的开源读屏软件,名叫“无视觉桌面访问”。国内有爱好者创建了中文社区网站,名叫 NVDA 中文站,网址是:https://www.nvdacn.com/

争渡读屏:https://www.zdsr.com/
这是国内视障者使用最广泛的读屏软件,提供免费的公益版可在服务器上使用。

安装读屏软件的建议

  1. 如果您要安装争渡读屏软件,建议您不要使用快速安装方式,然后在安装向导中,取消“朗读 Windows 登录窗口及安全界面”复选框。如果您已经使用了快速安装选项,也可以在争渡读屏的“欢迎使用 争渡读屏”对话框中取消相应的复选框。一方面它的确没什么作用,还会浪费系统资源,另一方面它可能会大量写入音频设备无法工作的日志到事件日志中。
  2. 如果您安装 NVDA,不建议您“应用以保存的配置到欢迎界面和其他安全界面”,因为插件可能会存在安全问题,导致服务器被入侵。

更改服务器的登录密码

  密码的作用,想必大家都知道。没错,它就和钥匙一样重要,知道服务器管理员密码的人就和拥有了您家的钥匙一样。所以,服务器的管理员密码一定要保护好啦,被别人试出来,您的服务器也就被别人控制啦。避免密码泄露的方法是不定期修改它。要设置什么样的密码呢?生日能不能用作密码呢?我觉得可以。要把生日作为密码,可以在数字之间加上字母符号等。对于试图破解密码的人来说,这串密码没什么规律,但是对于您而言它是有规可循的。

在 Windows 上

  以 Windows Server 2022 为例。在服务器远程桌面连接中,按下 Ctrl+Alt+End(如果是直接在服务器跟前操作,则是 Ctrl+Alt+Del。在出现的“Windows 安全”窗口中,点击“更改密码”。好了,后面的步骤我不说,同学们也都懂了。

在 Linux 上

  在 Linux 上更改密码,只需要使用 passwd 命令。执行完该命令以后,系统就会要求输入 New password(新密码),Retype New Password(再次输入新密码),最后,系统会提示“passwd: password updated successfully)已成功更新密码)”或者“passwd: all authentication tokens updated successfully.(已更新所有身份验证令牌)”。

熟悉服务器的防火墙

  您知道门卫这个角色吗?没错,门卫就是在大楼或者小区的入口处,管理进入大楼或者小区的人。门卫看到居住在小区的人进入小区时,会放行,而不属于小区的人进入时,门卫就会询问,或者拒绝进入。服务器上的防火墙也是干这个的,当然,一些对安全性要求较高的服务器,防火墙会管理从服务器出去的连接。

  云服务器厂商通常会在机房处设置防火墙,您也可以使用系统的防火墙。机房的防火墙就好像小区门的门卫,只管理进出小区的人,而不管小区里面串门的人。而系统防火墙就像您家门的监控系统一样,作用是管理进出您的服务器的连接。毕竟谁也不敢保证小区里的居民都是良民对吧哈哈。当然了,现在的云服务器厂商也提供针对服务器本身的防火墙了,能实现的功能和系统的防火墙差不多。

  防火墙在服务器上的作用,说一个场景您也许就明白了。您买了一台服务器,用来跑您的个人网站,这个网站需要数据库。网站程序可以连接数据库,那其他人照样也可以。对于您来说,您希望其他人可以浏览您的网站,而并不希望他们可以直接连接到数据库,一方面确实也没必要,另一方面会有安全问题。这样,您就可以通过防火墙来阻止其他人访问您的数据库,只允许他们访问您的网站。

  话又说回来,怎么区分网站和数据库呢?告诉您哈,有个东东叫做端口。不用怀疑,每一个网络程序,都会打开端口,否则它根本不能通过网络接收和发送数据。端口是用数字来表示的,常用的端口都被写入了网络相关的标准中,否则就会各自为政,互联网的运转也就无从谈起。网站服务器通常使用 80 和 443 端口,数据库服务器通常使用 3306 端口,而远程管理服务器的 SSH 协议用的是 22 端口,Windows 远程桌面用的是 3389 端口。哦,明白了,是不是只要用防火墙阻止别人连接 3306 端口,就能达到阻止连接数据库的目的呢?是的!就是这样。

云服务商提供的防火墙

  大型的云服务器厂商都会在机房处设置防火墙,也会提供基本的服务器防火墙,咱们可以先不管机房的防火墙。有的厂商将其称之为安全组,有的厂商将其称之为防火墙,或者 Firewall 等。这些基本的防火墙,都能达到上面所说的,屏蔽访问数据库端口的目的。每个厂商的防火墙的设置方法不尽相同,这篇文章只做抛砖引玉,所以也就不展开了哈。

系统自带的防火墙

  不是所有云服务商都会提供防火墙,或者云服务商的防火墙不方便视障同学操作,这时就需要用到系统自带的防火墙了。不同的系统,自带的防火墙也不一样,但都能满足上面提到的,防止访问数据库端口的需要。例如 Windows 系统下的防火墙叫做 Windows Defender 防火墙;Linux 下的防火墙叫做 iptables 或者 nftables,为了方便使用,人们又在 iptables 和 nftables 的基础上,开发出了命令行接口,例如 firewalld 和 ufw 等。

设置防火墙规则的习惯

  设置防火墙时,对于进入服务器的连接,我们通常采用白名单模式,对于从服务器出去的连接,我们通常采用黑名单模式。当然了,对安全性要求很高的服务器,从服务器出去的连接也会采用白名单模式。专业地说,进入服务器的连接称之为入栈连接,从服务器出去的连接称之为出栈连接。反过来设置可以吗?你真调皮,从技术上讲肯定是可以的,但是从日常使用的角度来说,这样做是不是有点另类了?

Windows Defender 防火墙放行或取消放行端口的方法

第一步、打开“服务器管理器”,然后打开“工具”菜单(Alt + T),并点击“高级安全 Windows Defender 防火墙”。
第二步、找到树视图的“入站规则”,打开菜单,点击“新建规则”。
第三步、在“新建入站规则向导”,可以选择按程序、端口、预定义规则来创建允许入栈的规则,也可以选择“自定义”,进行更细致的配置。要选择“自定义”,需要用上光标,或者快捷键 Alt+C。假如我们要开放网站服务器,可以选择“预定义”,然后在下拉列表中选择“万维网服务 (HTTP)”,并点击“下一步”。
第四步、在“规则”列表中,选中所有的规则,然后点击“下一步”。
第五步、选择是“允许连接”、“允许安全连接”或者“阻止连接”。默认是“允许连接”,这或许也是您创建这条规则的用意吧?选择好之后,点击“完成”。

  如果要取消放行某个端口,回到“高级安全 Windows Defender 防火墙”,然后点击“入站规则”。在右侧列表中,找到想要停用的规则,例如“万维网服务(HTTP 流量入站)”,打开它的菜单。点击“禁用规则”。假如将来再也不需要这条规则了,只需要找到这条规则,然后按 Delete 键,即可删除该规则。

注意:Windows Defender 防火墙是个非常复杂的防火墙系统,仅仅删除规则,并不一定导致防火墙阻止该端口。要彻底阻止某个端口,可以创建一条拒绝规则。

Linux 系统防火墙放行或取消放行端口的方法

firewalld 防火墙

  firewalld 防火墙也可以按照服务或者端口号来放行端口,要放行某个服务对应的端口,使用

firewall-cmd –add-service=http

firewall-cmd –permanent –add-service=http

  也许您会觉得奇怪,为什么放行 http 服务需要使用两条命令呢?第一条命令是修改运行时的防火墙状态,第二条命令是修改防火墙配置文件,让设置永久有效。

  要取消放行某个服务,使用

firewall-cmd –remove-service=http

firewall-cmd –permanent –remove-service=http

  要放行或者取消某个端口,使用

firewall-cmd –add-port=443/tcp

firewall-cmd –permanent –add-port=443/tcp

您发现了吗?放行端口和放行服务,命令是如此的相似。而后面的 tcp 表示 tcp 协议,相对应的还有 udp 协议。

ufw 防火墙

  ufw 防火墙相比于 firewalld 防火墙而言更轻量,命令也更人性化。当然,每个防火墙都有其独到之处,并没有绝对的优劣之分哈,别吵起来了哦。

  要放行某个端口或者服务,只需要按照下面的格式填写即可:

ufw allow 80

或者

ufw allow http

如果是要取消呢?只要在 allow 之前加上 delete 即可,表示“取消允许”,就像这样:

ufw delete allow http

或者

ufw delete allow 80

安装防火墙

  不是所有的云服务商都会为服务器安装防火墙,这时,就需要手动安装防火墙了。由于安装 firewalld 可能会导致 SSH 端口被意外关闭,这里只跟大家介绍如何安装 ufw 防火墙,别说我抠门啊啊啊。

  如果使用的是 Red Hat Enterprise Linux、CentOS、Rocky Linux、Alma Linux,可以使用 dnf install ufw 来安装 ufw 防火墙。

  如果使用的是 Debian、Ubuntu 或者 Kali Linux 系统,可以使用 apt install ufw 来安装 ufw 防火墙。

  ufw 防火墙安装后,需要先将 SSH 端口加入防火墙的允许列表当中,然后才可以启动防火墙,否则,嘿嘿,把自己锁在外面的感觉是不是很美好?命令是:ufw allow ssh 或者 ufw allow 22。最后,使用 ufw enable 启用防火墙。

我一登录系统就看到有数千次登录失败的记录,很烦

  您看到这种现象,就表示有许多人在疯狂猜测您的服务器密码。这些攻击者是通过默认的远程管理端口猜测密码的。啥叫远程管理端口呀?这么说吧,您登录 Windows 服务器都会用“远程桌面”对吧,再比如,您登录 Linux,都会用到 SSH 对吗?这两个东东开放的端口,统称为“管理端口”。前面咱们说过了哈,常见的端口,都被写入到了互联网相关的标准当中,比如远程桌面是 3389,SSH 是 22 等。网上的攻击者经常使用一些端口扫描工具来扫描互联网上开放远程管理端口的主机,如果又碰到没好好设置密码的服务器,呱唧,一只肉鸡就这样诞生啦!呱唧,又一只肉鸡被抓啦!啥叫抓肉鸡?简单说就是被攻击者非法控制的电脑,这种电脑会听从攻击者的指挥,就好像砧板上的肉鸡一样任人宰割。

  不过您也不用担心,只要改掉端口,就能避免许多撒网式的攻击,咋改呢?

对于 Windows 远程桌面

  按 Win+X 打开小开始菜单,打开“Windows Powershell (管理员)”,然后复制下面的文本,到 Windows Powershell 执行。这里的 17134 是目标端口号,您可以修改成 1024 到 65534 之间的任意端口,但最好在 10000 以上,以避免冲突:

————— 我是华丽的分隔线 —————

$portvalue = 17134

Set-ItemProperty -Path ‘HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp’ -name “PortNumber” -Value $portvalue

New-NetFirewallRule -DisplayName ‘RDPPORTLatest-TCP-In’ -Profile ‘Public’,’Private’,’Domain’ -Direction Inbound -Action Allow -Protocol TCP -LocalPort $portvalue

New-NetFirewallRule -DisplayName ‘RDPPORTLatest-UDP-In’ -Profile ‘Public’,’Private’,’Domain’ -Direction Inbound -Action Allow -Protocol UDP -LocalPort $portvalue

————— 我是华丽的分隔线 —————

小提示:上面的指令,把远程桌面的侦听端口号修改为 17134,并在 Windows 防火墙中放行修改后的端口。但是,如果云服务商为服务器提供了防火墙,也需要在云服务商的防火墙上放行修改后的端口,要放行 Tcp 和 Udp 协议,否则,您依然会被锁在外面。

  为了万无一失,咱们最好去高级安全 Windows Defender 防火墙查看一下端口是否已被放行。别看都不看直接告诉我已经放行了,被锁在外面别哭着闹着找妈妈,妈妈来了也救不了你,只会打你的小屁屁哦嘿嘿嘿。打开“高级安全 Windows Defender 防火墙”,然后找到“入栈”,看看里面是否有 RDPPORTLatest-TCP-InRDPPORTLatest-UDP-In 这两条规则,并且端口号和操作都是正确的。

  为了让修改生效,需要重新启动 Windows 服务器。

对于 Linux 的 SSH

  Linux 相比于 Windows 更灵活一些,比如 SSH 服务器可以同时监听不止一个端口,这样可以减少被妈妈打屁股的可能,但如果你粗手粗脚,妈妈还是会打屁股的哦嘿嘿嘿。对了,啥叫“监听”呢?是不是服务器上总是有东西在监听隐私信息呢?不是的哦,所谓的监听,指的是某个程序在等候连接,就好像有人坐在那里,您进了他的门,他就会热情地跟你打招呼,为您提供服务。远程桌面的 3389、网站服务器的 443 都属于“监听”端口,开放在那里等待客户端连接。那 ssh 和 sshd 是啥关系呀?在 Linux 世界里,凡是后面带有“d”的,都表示守护程序。您可以把守护程序理解成服务,它静静的守候在那里,等待人们使用。ssh 是客户端,而 sshd 是服务端。

  要修改 SSH 的监听端口,需要编辑 /etc/ssh/sshd_config 文件。打开 sshd_config 文件后,我们来寻找 Port 22 这一条配置。注意了哈,某一行开头的“#)警号)”表示注释,也就是说,带有“#”的那一行会被系统忽略。看到了吗?Port 22 前面有一个警号,那么 SSH 为什么还会监听 22 端口呢?这是因为,SSH 在没有配置的情况下,默认是监听 22 端口的,还要问为什么,我只能回答,这是 SSH 与生俱来的特性哈哈。

能不能直接改成我们想要的端口呢?可以,但不建议小萌新这样做,因为小萌新可能会犯一些低级错误,导致 SSH 彻底罢工。硬要直接修改,别出问题哈,出了问题被妈妈打屁股了可就别怪我枚提醒了哦。刚才提到,SSH 默认监听 22 端口,如果我们在配置文件指定了监听端口,它就不会监听默认端口了。所以,我们把 Port 前面的注释去掉,也就是删除“#”,让 SSH 继续监听 22 端口。

复制 Port 22,另开一行,然后粘贴,并将数值修改成想要的端口号,比如 17134。修改后,保存 sshd_config 文件。

我们来在防火墙增加一条规则,放行修改后的 ssh 端口。还记得命令吗?我就知道你们很健忘哈哈哈:

对于 firewalld 防火墙,命令是:

firewall-cmd –add-port=17134/tcp

firewall-cmd –permanent –add-port=17134/tcp

对于 ufw 防火墙,命令是:

ufw allow 17134

ufw reload

对了,17134 是我使用的端口号,您可以自由发挥,1024 到 65534 之间的端口任您选,最好选择大于 10000 的端口号,这样可以降低冲突的概率。放行端口后,使用 systemctl restart sshd 命令重新启动 sshd 服务,这样就能让修改生效了,是不是比 Windows 修改远程桌面端口简单多啦!

如果云服务商为服务器提供了防火墙,也要在云服务商的防火墙那里,放行修改后的端口,否则您将无法连接到修改后的端口。

修改完后,尝试连接新的端口号,如果成功,就可以关闭 22 端口了。方法是:重新给 sshd_config 中的 Port 22 加上注释,然后保存 sshd_config,最后重启 sshd 服务。当然了,您也可以取消防火墙里的规则,让防火墙不放行 22 端口,以免啥时候升级了系统,不小心在 sshd_config 配置文件里把 22 端口打开了。

  那如果修改不成功呢?排除了自己的原因,无外乎就是 selinux 的问题了,这个问题有点复杂,加之也比较少见,这里就不展开说了,别打我!

SSH 的密码太难记了,有什么好办法吗

  您登录 Linux 服务器时,都是通过 SSH 协议,以及用户名和密码。不得不说,密码真是一种糟糕的东西,要安全那就别想太短,要好输入就别想不会被攻击者猜中。有没有办法解决这种问题呢?聪明的电脑专家早已解决了问题,那就是密钥认证。简单说,就是把密码换成密钥,而密钥是存放在文件里面的。

  用来作为身份验证的密钥是成对的,由客户端上的私钥和服务器上的公钥组成,两把钥匙对上了,就能通过身份验证,至于其中的工作原理就不展开了哈。为了保护私钥,可以给私钥设置密码,但如果您觉得自己的电脑很安全,也可以不设置。如何创建密钥呢?

在 Windows 10 上生成密钥

第一步、确认系统版本,只有 Windows 10 Build 1809 和 Windows Server 2019 及更高版本才内置 ssh 客户端。
第二步、打开 cmd,然后执行:ssh-keygen
第三步、系统提示“Generating public/private rsa key pair.”,下一行是“Enter file in which to save the key”,这是保存 ssh 密钥的路径,默认保存在 %userprofile%.ssh 文件夹,名为 id_rsa,如果不需要修改就按回车键。
第四步、提示“Enter passphrase (empty for no passphrase)”,这里是设置 ssh 私钥的密码,如果不需要设置,请直接按回车键。
第五步、“Enter same passphrase again”,这里是要重新输入刚才输入的密码,输入完成后,按回车键。
第六步、系统会显示生成密钥的结果,密钥保存的文件名,以及密钥的指纹。确认无误,关掉 cmd 窗口。

注意:请把密钥保存在安全的地方,一旦丢失,就无法登录服务器了。

将公钥上传到服务器

  刚才,我们生成了一对密钥,现在来把公钥上传到服务器。别弄错了,是公钥,不是私钥哈。用习惯的方法,登录到 Linux 服务器,然后打开用户的主目录。如果是以 root 账号登录的,就打开 /root 目录,否则就请打开 /home/用户名目录。

  创建一个名为“.ssh”的目录,然后将生成的 id_rsa.pub 上传到该目录,改名为“authorized_keys”。这还没完,还需要设置 .ssh 目录的权限。使用下面两条命令来设置 .ssh 目录及 authorized_keys 文件的权限:

chmod 0700 ~/.ssh

chmod 0600 ~/.ssh/authorized_keys

那位问了,如果不设置权限会怎样呢?一些 sshd 服务器可能会直接拒绝该公钥文件,这样就没法用密钥登录服务器啦。

  公钥文件放好了,权限也设好了,下一步咱们需要确认一下 sshd_config 中的几个设置,为了让公钥登录正常工作,下面的参数和值要完全匹配,而且还不能加了注释哦,但是,多个空格不影响,但不能没有空格哈哈:

PubkeyAuthentication yes

如果修改了配置文件,请使用 systemctl restart sshd 重新启动 sshd 服务。现在就可以在客户端上使用私钥登录了。

使用生成的密钥登录 ssh 服务器

  服务器上的公钥被搞定了,我们就可以在客户端上,使用密钥登录服务器啦。如果习惯于 WinSCP,请使用 PuTTYGen 程序来把 OpenSSH 密钥转换成 PuTTY 使用的密钥。方法是,用 PuTTY Key Generator 打开 id_rsa 文件,然后点击“Save private key”按钮。在 WinSCP 的站点列表选择服务器,然后点击“编辑”,点击“高级”。切换到 SSH 下的“身份验证”标签页,然后点击“私钥文件”下面的“…(三个点)”按钮,浏览到保存的 ppk 文件。

如果习惯使用 ssh 命令,请使用 -i 参数来指定私钥文件的路径。例如:ssh -i D:/ssh_privkey/contoso.key -p 17134 root@contoso.com

如果没有为私钥设置密码,输入上面的命令,就会直接登录到服务器。第一次登录会看到是否信任服务器的提示,输入 yes 并按回车后,今后除非服务器的身份发生变化,否则都不会看到该提示了。如果您为私钥设置了密码,就在提示输入密码时,输入私钥的密码。如果登录没有成功,就尝试输入服务器账号的密码。

注意:如果只能使用账号的密码登录服务器,而不能用密钥登录服务器,就请仔细检查前面的操作步骤是否有问题。请您不要在无法使用密钥登录的情况下关掉密码登录,那时候就登陆不了了。

至于 WinSCP 的操作,您这么聪明的相信一看到提示就会,也就不需要我多说了哈。

完全禁用密码登录 SSH 服务器

  顺利通过密钥登录服务器后,就可以放心的禁止通过密码登录 SSH 了。禁用密码登录之前,请您再次确认已经备份好 ssh 私钥文件,一旦弄丢,您就登陆不了服务器了。

  打开 sshd_config 文件,将 PermitRootLogin 设为 prohibit-password,一定要记得取消注释哦。然后再将 PasswordAuthentication 改成 no,还是要取消注释。修改完成,保存文件,重启 sshd 服务使之生效。

  重启 ssh 服务后,请尝试通过密码登录服务器,而非密钥。如果登录失败,就表示修改成功。现在,您的服务器变得更安全了!

我操作 SSH 时经常会莫名其妙断开,还会丢失操作进度

  不知道您有没有体验过,通过 SSH 操作服务器时,连接突然坏掉,之前的工作前功尽弃,在升级系统的时候如果遇到这种情况,那系统可能就坏掉了。要改善网络连接的可靠性几乎是不可能的,毕竟变数太多了,那有什么办法让程序在连接断开后不被打断吗?有的,请使用 screen。

  screen 是一种保持会话的好东东,在 screen 中运行的程序,无论是 SSH 连接中断,还是执行了 logout 命令,运行在 screen 中的程序都不会中断。把服务器关机了,或者干脆把它的插头拔了,会断吗?嘿嘿,你真调皮。

在 Red Hat Enterprise Linux、CentOS、Rocky Linux 及 Alma Linux 系统上安装 screen

  这类系统的软件仓库默认不带 screen,而是由 epel 软件仓库提供。啥是仓库呢?如果您用过“应用商店”或者“Microsoft Store”,就不难理解了,其实您也可以把软件仓库理解成 Linux 系统的应用商店。

使用下面的命令安装 epel 仓库和 screen:

dnf install -y epel

dnf -y install screen

在 Debian、Ubuntu 和 Kali Linux 系统上安装 screen

  在 Debian 系统上安装 screen 只需要如下两条命令:

apt update

apt -y install screen

使用 screen

  本质上,screen 是命令行程序,因此它有许多的命令行参数。要用来防止程序被网络问题打断,只需要如下几个命令行参数即可:

screen -s bash -R my
连接到已经断开的会话,如果没有该会话,就创建一个。

screen -d my
强制断开会话。有时,网络中断后,screen 的会话还是连接状态。如果您使用 screen -s bash -R my 不能连接到意外断开的会话,就请先用这个命令强行断开,然后再尝试使用 screen -s bash -R my。但如果提示 There is no screen to be detached matching my. 就表示的确没有会话,可能是服务器重启了。

想要退出 screen 会话,只需要使用 exit 命令即可。

让系统保持最新

  您成长的过程中会学习到许多新知识,或者学会更多保护自己的方法。操作系统也不例外,在操作系统的生命周期里,它的开发单位会定期推出更新,带来新功能或者修复漏洞。您需要让操作系统保持最新来获得最新功能,并抵御针对系统漏洞的攻击。

对于 Windows 系统

  要为 Windows Server 系统检查更新,请打开“开始”,点击“设置”,然后点击“更新和安全”,点击“Windows 更新”。点击“检查更新”按钮,系统就会自动从微软的服务器检查可用的更新,然后下载到服务器上。检查到更新后,点击“立即安装”来安装到服务器上。有些更新会要求重新启动系统,您需要听从系统的建议,重新启动您的服务器。

对于 Red Hat Enterprise Linux、CentOS、AlmaLinux 或 Rocky Linux 系统

  为了防止网络中断导致安装更新出现问题,在检查更新之前,启动 screen 会话。执行 dnf update 命令来检查更新。当检查到更新后,系统会询问您是否需要安装,请输入 y,然后按回车键。

  安装更新后,有时需要重新启动系统,如果您给 Windows 安装过更新就不难理解了,其实 Linux 也是一样的。怎么判断要不要重启系统呢?请执行 needs-restarting -r。如果需要重启系统,它会提示“Reboot is required”。如果确定不需要重新启动系统,请执行 needs-restarting -s 检查需要重启哪些服务,然后通过 systemctl restart service1 service2 … 命令重启列出的服务即可。

对于 Debian、Ubuntu 及 Kali Linux 系统

  为了防止网络中断导致安装更新出现问题,在检查更新之前,启动 screen 会话。执行 apt update 命令来检查更新。当检查到更新后,命令行的最后一行是“数字 packages can be upgraded.”就表示有软件包可以更新,而如果是“All packages are up to date.”就表示所有软件包都是最新的。

  要更新软件包,执行 apt upgrade,系统会列出需要更新的软件包,同意请输入 y,然后按回车键,耐心等待系统更新。

  更新完成后,来检查要不要重启系统才能让更新生效,怎么检查呢?执行 needrestart 命令。如果没有这个命令,就用 apt -y install needrestart 命令安装它。

  执行 needrestart 后,如果提示“Newer kernel available”,就需要重新启动系统,按回车键确认。按回车键后,如果提示“Which services should be restarted?”就表示有服务需要重新启动,再按一次回车键就会重新启动服务。执行完 needrestart 后,最后一条输出是“No user sessions are running outdated binaries.”就表示不需要做任何事情。

Windows Server 的远程桌面为什么会吱吱响

  Windows 远程桌面的音频比特率会动态调整,这非常有利于节约带宽,但是也会带来爆音的问题,如果您经常通过远程桌面工作,这种爆音时间长了可能会影响您的听力。

在服务器上

  在 Windows Server 服务器上,打开组策略,定位到计算机配置\管理模板\Windows 组件\远程桌面服务\远程桌面会话主机\设备和资源重定向,打开“限制音频播放质量”。

将策略改为“已启用”,然后将“音频质量”组合框设为“高”。点击“确定”,然后关闭组策略编辑器,按 Alt+F4,选择“注销”并点击“确定”。

在客户端上

  用“记事本”打开您的远程桌面连接文件(RDP 格式),如果您是通过远程桌面客户端,输入服务器的 IP 地址或者域名来连接到服务器,就请先断开所有远程桌面连接,然后用记事本打开“文档”下的 default.rdp 文件。

在文件末尾,增加:

audioqualitymode:i:2

保存该文件,重新连接到服务器。

温馨提示:将 audioqualitymode:i:2 改成 audioqualitymode:i:1 可以节约带宽,但是声音会变成单声道。

断开远程桌面后让 NVDA 远程插件保持可用

  也许您想断开远程桌面,但是又要通过 NVDA 远程控制您的服务器,如何做呢?先提醒一句,这种做法有一定的风险,任何可以操作服务器控制台会话的人都能操作您的服务器。这么说吧,这就有点类似您的电脑没有锁定屏幕。如果您愿意承担这种风险,就请继续:

您可以把下面的文本复制到一个 .bat 文件中,运行即可。

tscon %sessionname% /dest:console

启动 NVDA,连接远程,然后运行您保存的批处理文件。远程桌面客户端会提示您“有其他用户连接到会话”,这就表示您的会话已经被推到控制台,您可以继续通过 NVDA 远程来操作您的服务器。

但是,推到控制台后,服务器的分辨率会发生变化,通常会变成 1024 X 768,这会影响窗口的布局等。

总结

  感谢您陪我走完了这段旅程,在经过启用声音服务、设置密码、更改管理端口、更新系统到最新以及改善远程桌面音质后,您的服务器现在更安全,更好用了。尽情享受吧!

❌
❌