重置 Mac 上的 NVRAM 或 PRAM

 mac, macpro  重置 Mac 上的 NVRAM 或 PRAM已关闭评论
2月 262021
 

如果 Mac 出现了与 NVRAM 或 PRAM 中储存的设置有关的问题,那么进行重置可能会有帮助。

NVRAM(非易失性随机访问存储器)是一小部分内存,Mac 使用这些内存来储存某些设置并对其进行快速访问。PRAM(参数 RAM)储存着类似的信息,且 NVRAM 和 PRAM 的重置步骤相同。

可储存在 NVRAM 中的设置包括音量、显示屏分辨率、启动磁盘选择、时区,以及最近的内核崩溃信息。储存在 NVRAM 中的设置取决于您的 Mac 以及与这台 Mac 搭配使用的设备。

如果您遇到与这些设置或其他设置有关的问题,那么重置 NVRAM 可能会有帮助。例如,如果 Mac 并非从“启动磁盘”偏好设置中选定的磁盘启动,或者在 Mac 启动前短暂地显示了一个问号图标,则可能需要重置 NVRAM。

如何重置 NVRAM

Option 键加Command 键加P 键加R 键

将 Mac 关机,然后开机并立即同时按住以下四个按键:Option、Command、P 和 R。您可以在大约 20 秒后松开这些按键,在此期间您的 Mac 可能看似在重新启动。

  • 如果 Mac 电脑发出启动声,您可以在第二次启动声过后松开这些按键。
  • 搭载 Apple T2 安全芯片的 Mac 电脑上,您可以在 Apple 标志第二次出现并消失后松开这些按键。

如果您的 Mac 使用了固件密码,这个组合键将不起任何作用或导致您的 Mac 从 macOS 恢复功能启动。要重置 NVRAM,请先关闭固件密码。

在您的 Mac 完成启动后,您可能需要打开“系统偏好设置”并调整已重置的任何设置,例如音量、显示屏分辨率、启动磁盘选择或时区。

进一步了解

  • 如果您使用的是 Mac 台式电脑而非笔记本电脑,并且每次关闭 Mac 并断开 Mac 电源时,音量或时区等设置均会重置,则您可能需要更换 Mac 中的电池。这个小电池位于电脑的主板上,用于在断开 Mac 电源连接时帮助 NVRAM 保存设置。您可以携 Mac 前往 Apple 服务提供商处来更换该电池。
  • 如果遇到了与睡眠、唤醒、电源、为 Mac 笔记本电脑电池充电有关的问题或其他与电源相关的症状,您可能需要重置 SMC(系统管理控制器)

Mac 的启动组合键

 mac, macpro  Mac 的启动组合键已关闭评论
2月 252021
 

Mac 的启动组合键

摘录自apple官网,这些组合键仅适用于搭载 Intel 处理器的 Mac 电脑

 

要使用这些组合键中的任何一个,请在按下电源按钮以开启 Mac 后或在 Mac 开始重新启动后,立即按住相应按键。请一直按住,直至电脑出现对应的行为。

  • Command (⌘)-R:从内建的 macOS 恢复系统启动。或者,您也可以使用 Option-Command-R Shift-Option-Command-R 以通过互联网从 macOS 恢复功能启动。macOS 恢复功能可以安装不同版本的 macOS,具体取决于您在电脑启动时使用的组合键。如果您的 Mac 使用了固件密码,系统将提示您输入这个密码。
  • Option (⌥) 或 Alt:启动进入“启动管理器”,您可以从中选取其他可用的启动磁盘或宗卷。如果您的 Mac 使用了固件密码,系统将提示您输入这个密码。
  • Option-Command-P-R:重置 NVRAM 或 PRAM。如果您的 Mac 使用了固件密码,电脑会忽略这个组合键或从 macOS 恢复功能启动。
  • Shift (⇧):安全模式启动。如果使用了固件密码,这个组合键将被停用。
  • D:启动进入“Apple 诊断”实用工具。或者,您也可以使用 Option-D 通过互联网启动进入这个实用工具。如果使用了固件密码,这个组合键将被停用。
  • N:从 NetBoot 服务器启动,前提是您的 Mac 支持网络启动宗卷。要使用服务器上默认的引导映像,请按住 Option-N。如果使用了固件密码,这个组合键将被停用。
  • Command-S:以单用户模式启动。如果运行的是 macOS Mojave 或更高版本,或者使用了固件密码,这个组合键将被停用。
  • T:目标磁盘模式启动。如果使用了固件密码,这个组合键将被停用。
  • Command-V:以详细模式启动。如果使用了固件密码,这个组合键将被停用。
  • 推出键 (⏏)、F12鼠标按钮触控板按钮:推出可移动介质,例如光盘。如果使用了固件密码,这个组合键将被停用。

 


如果组合键不起作用

如果某个组合键在启动时不起作用,以下解决方案之一可能会有所帮助:

  • 同时按住组合键中的所有按键,而不是一次只按住一个。
  • 将 Mac 关机。然后按下电源按钮以将 Mac 开机。接下来,在 Mac 启动时按住相应按键。
  • 在按下相应按键之前等待几秒钟,以便让 Mac 在启动时有更多时间来识别键盘。某些键盘上有一个指示灯会在启动时短暂闪烁,表明键盘已被识别并可供使用。
  • 如果您使用的是无线键盘,请在可能的情况下将这个键盘接入 Mac。或者使用您的内建键盘或有线键盘。如果您使用的是 PC 专用键盘,例如带有 Windows 标志的键盘,请尝试改用 Mac 专用键盘。
  • 如果您使用“启动转换”从 Microsoft Windows 进行启动,请对“启动磁盘”偏好设置进行相应设置,修改为从 macOS 启动。随后关机或重新启动,然后再试一次。

请记住,如果您的 Mac 使用了固件密码,则某些组合键将被停用。

 

Mac无法启动过程中出现的各类符号及处理方法(禁止,圆圈,问号,齿轮,空白,警告,地球等)

 mac, macpro  Mac无法启动过程中出现的各类符号及处理方法(禁止,圆圈,问号,齿轮,空白,警告,地球等)已关闭评论
2月 252021
 

Mac无法启动过程中出现的各类符号及处理方法,此文摘录自apple官网。

 

如果您的 Mac 无法顺利完成启动,或者在启动过程中需要您完成某项操作,可能会卡在以下某个屏幕上。

由直线穿过的圆圈

macOS 启动屏幕上显示了禁止符号和 URL:support.apple.com/mac/startup

了解如果您的 Mac 在启动时显示一个由直线穿过的圆圈(禁止符号),该怎么做。


问号


“选项”齿轮图标


空白屏幕

Mac 笔记本电脑空白灰屏

了解如果您的 Mac 在启动时出现空白屏幕(例如空白灰色、黑色或蓝色屏幕),该怎么做。



带有警告符号的地球

macOS 启动屏幕上显示了带有警告符号的地球和 URL:support.apple.com/mac/startup

如果显示带有感叹号的地球,则说明您的 Mac 曾尝试通过互联网从 macOS 恢复功能启动,但失败了。了解如果您的 Mac 无法从 macOS 恢复功能启动,该怎么做。


锁形图标

macOS 启动屏幕上显示了固件锁形图标和密码输入栏

如果您的 Mac 使用了固件密码,则当您尝试从另一个磁盘或宗卷(例如,外置驱动器或 macOS 恢复功能)启动时会出现锁形图标。请输入固件密码以继续。


锁定系统的 PIN 码

macOS 锁定系统的 PIN 码启动屏幕

如果您的 Mac 已通过“查找”功能进行了远程锁定,则系统将要求输入 PIN 码。请输入四位数或六位数密码以继续。


登录窗口

macOS Big Sur 用户登录屏幕

在登录窗口中,输入您的用户帐户密码,以登录您的 Mac。如果“文件保险箱”已打开,则这一操作还会解锁您的磁盘。您可能会在背景中看到默认的桌面图片,在您选择自己的帐户后,这个图片可能会更改为您选择的桌面图片。


雷雳、USB 或 FireWire 符号

如果屏幕上显示黑色背景和大的雷雳 、USB  或 FireWire  符号,则表示您的 Mac 处于目标磁盘模式

下载官网旧版 macOS, 老版OS X, macOS官网连接地址(Catalina,Mojave,Sierra,Capitan,Yosemite)

 mac  下载官网旧版 macOS, 老版OS X, macOS官网连接地址(Catalina,Mojave,Sierra,Capitan,Yosemite)已关闭评论
2月 252021
 
apple官网下载老版OS 系统的链接实在太难找了,而其它网站上下载要么不能用,那么这注册那注册, 我整理了下官网os网页上的内容,大家可以选择下载,纯正官网噢!!!

下载旧版 macOS

下载和安装 macOS 需要花费一些时间,因此请确保您已接入交流电源并具备可靠稳定的互联网连接。

以下来自 App Store 的安装器会在您下载后自动打开:

您的网页浏览器会以名为“InstallOS.dmg”或“InstallMacOSX.dmg”的磁盘映像的形式下载以下较早版本的安装器。请打开磁盘映像,再打开其中的 .pkg 安装器。它将安装一个名为“安装 [版本名称]”的 App。请从“应用程序”文件夹中打开这个 App,以开始安装操作系统。

附官网创建可引导盘链接:

文章二: 使用ssh实现内网穿透及SSH端口转发详解(转)

 ssh  文章二: 使用ssh实现内网穿透及SSH端口转发详解(转)已关闭评论
2月 202021
 

以下内容是关于SSH端口转发的详解使用,文章通俗易懂,比前面的文章一写的更好,强烈推荐!原文地址见文末。

 

SSH有三种端口转发模式,本地端口转发(Local Port Forwarding)远程端口转发(Remote Port Forwarding)以及动态端口转发(Dynamic Port Forwarding)。对于本地/远程端口转发,两者的方向恰好相反。动态端口转发则可以用于科学上网。

SSH端口转发也被称作SSH隧道(SSH Tunnel),因为它们都是通过SSH登陆之后,在SSH客户端SSH服务端之间建立了一个隧道,从而进行通信。SSH隧道是非常安全的,因为SSH是通过加密传输数据的(SSH全称为Secure Shell)。

在本文所有示例中,本地主机A1为SSH客户端,远程云主机B1为SSH服务端。从A1主机通过SSH登陆B1主机,指定不同的端口转发选项(-L、-R和-D),即可在A1与B1之间建立SSH隧道,从而进行不同的端口转发。

本地端口转发

应用场景:

远程云主机B1运行了一个服务,端口为3000,本地主机A1需要访问这个服务。

示例为一个简单的Node.js服务:

var http = require('http');

var server = http.createServer(function(request, response)
{
    response.writeHead(200,
    {
        "Content-Type": "text/plain"
    });
    response.end("Hello O-u-u.com\n");
});

server.listen(3000);

假设云主机B1的IP为103.59.22.17,则该服务的访问地址为:http://103.59.22.17:3000

为啥需要本地端口转发呢?

一般来讲,云主机的防火墙默认只打开了22端口,如果需要访问3000端口的话,需要修改防火墙。为了保证安全,防火墙需要配置允许访问的IP地址。但是,本地公网IP通常是网络提供商动态分配的,是不断变化的。这样的话,防火墙配置需要经常修改,就会很麻烦。

什么是本地端口转发?

所谓本地端口转发,就是将发送到本地端口的请求,转发到目标端口。这样,就可以通过访问本地端口,来访问目标端口的服务。使用-L属性,就可以指定需要转发的端口,语法是这样的:

-L 本地网卡地址:本地端口:目标地址:目标端口

通过本地端口转发,可以将发送到本地主机A1端口2000的请求,转发到远程云主机B1的3000端口。

# 在本地主机A1登陆远程云主机B1,并进行本地端口转发
ssh -L localhost:2000:localhost:3000 [email protected]

这样,在本地主机A1上可以通过访问http://localhost:2000来访问远程云主机B1上的Node.js服务。

# 在本地主机A1访问远程云主机B1上的Node.js服务
curl http://localhost:2000
Hello O-u-u.com

实际上,-L选项中的本地网卡地址是可以省略的,这时表示2000端口绑定了本地主机A1的所有网卡:

# 在本地主机A1登陆远程云主机B1,并进行本地端口转发。2000端口绑定本地所有网卡
ssh -L 2000:localhost:3000 [email protected]

若本地主机A2能够访问A1,则A2也可以通过A1访问远程远程云主机B1上的Node.js服务。

另外,-L选项中的目标地址也可以是其他主机的地址。假设远程云主机B2的局域网IP地址为192.168.59.100,则可以这样进行端口转发:

# 在本地主机A1登陆远程云主机B1,并进行本地端口转发。请求被转发到远程云主机B2上
ssh -L 2000:192.168.59.100:3000 [email protected]

若将Node.js服务运行在远程云主机B2上,则发送到A1主机2000端口的请求,都会被转发到B2主机上。

远程端口转发

应用场景:

本地主机A1运行了一个服务,端口为3000,远程云主机B1需要访问这个服务。

将前文的Node.js服务运行在本地,在本地就可以通过http://localhost:3000访问该服务。

为啥需要远程端口转发呢?

通常,本地主机是没有独立的公网IP的,它与同一网络中的主机共享一个IP。没有公网IP,云主机是无法访问本地主机上的服务的。

什么是远程端口转发?

所谓远程端口转发,就是将发送到远程端口的请求,转发到目标端口。这样,就可以通过访问远程端口,来访问目标端口的服务。使用-R属性,就可以指定需要转发的端口,语法是这样的:

-R 远程网卡地址:远程端口:目标地址:目标端口

这时,通过远程端口转发,可以将发送到远程云主机B1端口2000的请求,转发到本地主机A1端口3000。

# 在本地主机A1登陆远程云主机B1,并进行远程端口转发
ssh -R localhost:2000:localhost:3000 [email protected]

这样,在远程云主机A1可以通过访问http://localhost:2000来访问本地主机的服务。

# 在远程云主机B1访问本地主机A1上的Node.js服务
curl http://localhost:2000
Hello O-u-u.com

同理,远程网卡地址可以省略,目标地址也可以是其他主机地址。假设本地主机A2的局域网IP地址为192.168.0.100。

# 在本地主机A1登陆远程云主机B1,并进行远程端口转发
ssh -R 2000:192.168.0.100:3000 [email protected]

若将Node.js服务运行在本地主机A2上,则发送到远程云主机A1端口2000的请求,都会被转发到A2主机上。

动态端口转发

应用场景:

远程云主机B1运行了多个服务,分别使用了不同端口,本地主机A1需要访问这些服务。

为啥需要动态端口转发呢?

一方面,由于防火墙限制,本地主机A1并不能直接访问远程云主机B1上的服务,因此需要进行端口转发;另一方面,为每个端口分别创建本地端口转发非常麻烦。

什么是动态端口转发?

对于本地端口转发远程端口转发,都存在两个一一对应的端口,分别位于SSH的客户端和服务端,而动态端口转发则只是绑定了一个本地端口,而目标地址:目标端口则是不固定的。目标地址:目标端口是由发起的请求决定的,比如,请求地址为192.168.1.100:3000,则通过SSH转发的请求地址也是192.168.1.100:3000

-D 本地网卡地址:本地端口

这时,通过动态端口转发,可以将在本地主机A1发起的请求,转发到远程主机B1,而由B1去真正地发起请求。

# 在本地主机A1登陆远程云主机B1,并进行动态端口转发
ssh -D localhost:2000 [email protected]

而在本地发起的请求,需要由Socket代理(Socket Proxy)转发到SSH绑定的2000端口。以Firefox浏览器为例,配置Socket代理需要找到首选项>高级>网络>连接->设置:

这样的话,Firefox浏览器发起的请求都会转发到2000端口,然后通过SSH转发到真正地请求地址。若Node.js服务运行在远程云主机B1上,则在Firefox中访问localhost:3000即可以访问。如果主机B1能够访问外网的话,则可以科学上网……

链式端口转发

本地端口转发远程端口转发结合起来使用,可以进行链式转发。假设A主机在公司,B主机在家,C主机为远程云主机。A主机上运行了前文的Node.js服务,需要在B主机上访问该服务。由于A和B不在同一个网络,且A主机没有独立公共IP地址,所以无法直接访问服务。

通过本地端口转发,将发送到B主机3000端口的请求,转发到远程云主机C的2000端口。

# 在B主机登陆远程云主机C,并进行本地端口转发
ssh -L localhost:3000:localhost:2000 [email protected]

通过远程端口转发,将发送到远程云主机C端口2000的请求,转发到A主机的3000端口。

# 在A主机登陆远程云主机C,并进行远程端口转发
ssh -R localhost:2000:localhost:3000 [email protected]

这样,在主机B可以通过访问http://localhost:3000来访问主机A上的服务。

# 在主机B访问主机A上的服务
curl http://localhost:3000
Hello O-u-u.com

 

转自:https://blog.fundebug.com/2017/04/24/ssh-port-forwarding/

文章一:使用ssh实现内网穿透入门及应用(附autossh方法)(转)

 ssh  文章一:使用ssh实现内网穿透入门及应用(附autossh方法)(转)已关闭评论
2月 142021
 

转发一篇关于使用ssh实现内网穿透的文章,写的通俗易懂,原链接见文章末尾。

 

“世界上最遥远的距离就是你在外网请求,我在内网测试。”

这句话的内容,对于开发人员来说,特别容易理解。很多情况下,我们的开发及测试环境在单位的内网下,只能通过位于内网的机器来连接操作,位于外网的机器是连不到内网环境的。比如说,如果我们周末在家工作,而家里的机器又不在单位内网环境下,那该如何连接内网的环境呢?难不成我们还要大周末的跑到单位去加班吗?

答案是否定的。这是种普遍又迫切的需求,叫“内网穿透”。这里我们使用SSH端口转发的技术,解决这种问题。

SSH本地端口转发

假设,host1和host2位于内网,host3位于外网,host3可以连接host1和host2,但host1不能连接host3和host2。我们要做的是,通过位于外网的host3,让host1来连接host2。

具体步骤

首先,在host1上进行如下操作:


ssh -L 2222:host2:22 [email protected]

其中,-L参数指定了“本地主机端口:目标主机:目标主机端口”。这表示,让host1作为sshd服务端,监听它自己的2222端口,然后将所有数据经由host3,转发到host2的22端口。

这种情况下,host1不能连接host3,但由于host1的配置,使得从host1到host3建立了一条“SSH隧道”

然后,在host1上进行如下操作:


ssh -p 2222 [email protected]

其中,-p参数指定了ssh连接的端口,默认为22,这里指定了2222端口。这表示,让host1作为ssh客户端,连接它自己的2222端口,相当于连接host2的22端口。

一般情况下,host2与host3为一台主机,换句话说,我们只要实现连接host3,那么再连接host2也不成问题。

这时,命令分别转换为:


ssh -L 2222:localhost:22 [email protected]
ssh -p 2222 [email protected]

SSH本地端口转发的本质

本质上,SSH本地端口转发,主要是实现以下两个方面:


1. 将本地主机的端口,转发到目标主机的端口
2. 在本地主机上,连接本地主机的端口,相当于连接目标主机的端口

SSH远程端口转发

假设,host1和host2位于内网,host3位于外网,host1可以连接host3和host2,但host3不能连接host1和host2。我们要做的是,通过位于内网的host1,让host3来连接host2,也就是实现所谓的“内网穿透”

具体步骤

首先,在host1上进行如下操作:


ssh -R 2222:host2:22 [email protected]

其中,-R参数指定了“远程主机端口:目标主机:目标主机端口”。这表示,让host3作为sshd服务端,监听它自己的2222端口,然后将所有数据经由host1,转发到host2的22端口。

这种情况下,host3不能连接host1,但由于host1的配置,使得从host1到host3建立了一条“SSH反向隧道”

然后,在host3上进行如下操作:


ssh -p 2222 [email protected]

其中,-p参数指定了ssh连接的端口,默认为22,这里指定了2222端口。这表示,让host3作为ssh客户端,连接它自己的2222端口,相当于连接host2的22端口。

一般情况下,host2与host1为一台主机,换句话说,我们只要实现连接host1,那么再连接host2也不成问题。

这时,命令分别转换为:


ssh -R 2222:localhost:22 [email protected]
ssh -p 2222 [email protected]

SSH远程端口转发的本质

本质上,SSH远程端口转发,主要是实现以下两个方面:


1. 将远程主机的端口,转发到目标主机的端口
2. 在远程主机上,连接远程主机的端口,相当于连接目标主机的端口

SSH实现内网穿透

内网穿透,简单来说就是,利用位于外网的主机,来连接位于内网的主机,这符合SSH远程端口转发的情况。但由于实际情况中,SSH连接经常由于这样那样的问题,导致连接断开,因此我们不得不重新去在内网主机上建立与外网主机的连接,也就是维持这条“SSH反向隧道”,autossh能实现连接断开之后自动重连功能。

自动重连

autossh与ssh用法类似,只要将ssh命令替换成autossh命令即可,如下所示:


autossh -M 2345 -NTR 2222:localhost:22 [email protected]

其中,-M参数指定了autossh监听的端口,注意这里与其转发的端口要区分开。

另外,-N表示禁止执行远程命令,-T表示禁止分配伪终端,这两个参数结合起来表示SSH连接不允许用户交互执行远程操作,只能用来传数据,从而保证了远程主机的安全。

自动登录

每次重新建立连接,autossh都需要确认一下登录身份。要保证自动重连,前提就是要实现自动登录

一种常见的做法,就是使用公钥登录进行免密登录,将host1上的公钥传送至host3上。这样,每次在进行SSH登录的时候,host3都会向host1发送一段随机字符串,host1用自己的私钥加密后将数据返回,然后host3用事先存好的公钥对返回的数据进行解密,如果成功,则证明host1的身份可信,允许直接登录,不再要求密码。

还有一种做法,就是利用sshpass将密码明文传输给autossh,如下所示:


sshpass -p "xxxxxx" autossh -M 2345 -NTR 2222:localhost:22 [email protected]

其中,-p参数指定了登录的密码。除了命令行输入密码的形式,sshpass还包含-f、-e等参数,分别支持文件输入密码及系统环境变量输入密码等形式,如图所示。

其他端口

实现内网穿透,除了转发22端口外,我们也可以转发其他应用的端口,如web服务的80端口、mysql的3306端口等,这里就不一一细说了。

 

来自:http://www.lining0806.com/ssh%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E5%AE%9E%E7%8E%B0%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/

ssh解析、原理、入门、运用(转)

 linux, ssh  ssh解析、原理、入门、运用(转)已关闭评论
1月 252021
 

转自网上的一篇文章, 描述ssh通俗易懂,原链接见文章末尾。

 

SSH是每一台Linux电脑的标准配置。

随着Linux设备从电脑逐渐扩展到手机、外设和家用电器,SSH的使用范围也越来越广。不仅程序员离不开它,很多普通用户也每天使用。

SSH具备多种功能,可以用于很多场合。有些事情,没有它就是办不成。本文是我的学习笔记,总结和解释了SSH的常见用法,希望对大家有用。

虽然本文内容只涉及初级应用,较为简单,但是需要读者具备最基本的”Shell知识”和了解”公钥加密”的概念。

 

一、什么是SSH?

简单说,SSH是一种网络协议,用于计算机之间的加密登录。

如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。

最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。

需要指出的是,SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文针对的实现是OpenSSH,它是自由软件,应用非常广泛。

此外,本文只讨论SSH在Linux Shell中的用法。如果要在Windows系统中使用SSH,会用到另一种软件PuTTY,这需要另文介绍。

二、最基本的用法

SSH主要用于远程登录。假定你要以用户名user,登录远程主机host,只要一条简单命令就可以了。

  $ ssh [email protected]

如果本地用户名与远程用户名一致,登录时可以省略用户名。

  $ ssh host

SSH的默认端口是22,也就是说,你的登录请求会送进远程主机的22端口。使用p参数,可以修改这个端口。

  $ ssh -p 2222 [email protected]

上面这条命令表示,ssh直接连接远程主机的2222端口。

三、中间人攻击

SSH之所以能够保证安全,原因在于它采用了公钥加密。

整个过程是这样的:(1)远程主机收到用户的登录请求,把自己的公钥发给用户。(2)用户使用这个公钥,将登录密码加密后,发送回来。(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。

这个过程本身是安全的,但是实施的时候存在一个风险:如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。因为不像https协议,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。

可以设想,如果攻击者插在用户与远程主机之间(比如在公共的wifi区域),用伪造的公钥,获取用户的登录密码。再用这个密码登录远程主机,那么SSH的安全机制就荡然无存了。这种风险就是著名的“中间人攻击”(Man-in-the-middle attack)。

SSH协议是如何应对的呢?

四、口令登录

如果你是第一次登录对方主机,系统会出现下面的提示:

  $ ssh [email protected]

The authenticity of host ‘host (12.18.429.21)’ can’t be established.

RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.

Are you sure you want to continue connecting (yes/no)?

这段话的意思是,无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?

所谓”公钥指纹”,是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,再进行比较,就容易多了。

很自然的一个问题就是,用户怎么知道远程主机的公钥指纹应该是多少?回答是没有好办法,远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对。

假定经过风险衡量以后,用户决定接受这个远程主机的公钥。

  Are you sure you want to continue connecting (yes/no)? yes

系统会出现一句提示,表示host主机已经得到认可。

  Warning: Permanently added ‘host,12.18.429.21’ (RSA) to the list of known hosts.

然后,会要求输入密码。

  Password: (enter password)

如果密码正确,就可以登录了。

当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。

每个SSH用户都有自己的known_hosts文件,此外系统也有一个这样的文件,通常是/etc/ssh/ssh_known_hosts,保存一些对所有用户都可信赖的远程主机的公钥。

五、公钥登录

使用密码登录,每次都必须输入密码,非常麻烦。好在SSH还提供了公钥登录,可以省去输入密码的步骤。

所谓”公钥登录”,原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用ssh-keygen生成一个:

  $ ssh-keygen

运行上面的命令以后,系统会出现一系列提示,可以一路回车。其中有一个问题是,要不要对私钥设置口令(passphrase),如果担心私钥的安全,这里可以设置一个。

运行结束以后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。

这时再输入下面的命令,将公钥传送到远程主机host上面:

  $ ssh-copy-id [email protected]

好了,从此你再登录,就不需要输入密码了。

如果还是不行,就打开远程主机的/etc/ssh/sshd_config这个文件,检查下面几行前面”#”注释是否取掉。

  RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

然后,重启远程主机的ssh服务。

  // ubuntu系统
service ssh restart

// debian系统
/etc/init.d/ssh restart

六、authorized_keys文件

远程主机将用户的公钥,保存在登录后的用户主目录的$HOME/.ssh/authorized_keys文件中。公钥就是一段字符串,只要把它追加在authorized_keys文件的末尾就行了。

这里不使用上面的ssh-copy-id命令,改用下面的命令,解释公钥的保存过程:

  $ ssh [email protected] ‘mkdir -p .ssh && cat >> .ssh/authorized_keys’ < ~/.ssh/id_rsa.pub

这条命令由多个语句组成,依次分解开来看:(1)”$ ssh [email protected]”,表示登录远程主机;(2)单引号中的mkdir .ssh && cat >> .ssh/authorized_keys,表示登录后在远程shell上执行的命令:(3)”$ mkdir -p .ssh”的作用是,如果用户主目录中的.ssh目录不存在,就创建一个;(4)’cat >> .ssh/authorized_keys’ < ~/.ssh/id_rsa.pub的作用是,将本地的公钥文件~/.ssh/id_rsa.pub,重定向追加到远程文件authorized_keys的末尾。

写入authorized_keys文件后,公钥登录的设置就完成了。

 

转自阮一峰的文章:http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html

nginx搭建rtmp服务器(原有nginx上添加模块方式)及让nginx支持HLS

 nginx  nginx搭建rtmp服务器(原有nginx上添加模块方式)及让nginx支持HLS已关闭评论
1月 122021
 

转自:https://www.cnblogs.com/HintLee/p/9499429.html

参考:   https://www.jianshu.com/p/089b70f57bca

前言

最近接手了一个跟视频监控相关的项目,用了近年来越来越流行的 Web 服务器 nginx 加上 nginx-rtmp-module 搭建 rtmp 服务器。使用了阿里云的服务器,系统 Ubuntu 16.04 。

步骤

更新源并安装 nginx 。

sudo apt-get update
sudo apt-get install nginx

一、 支持RTMP

输入 nginx -V 查看 nginx 版本,可以看到当前版本号是 1.10.3,且可以看到编译选项。所以下一步要做的是下载相同版本的 nginx 源码,使用相同的编译选项并添加 nginx-rtmp-module,替换原来的 nginx 。
下载 nginx 1.10.3 的源码和 nginx-rtmp-module 的源码。

wget https://nginx.org/download/nginx-1.10.3.tar.gz
tar zxvf nginx-1.10.3.tar.gz
git clone https://github.com/sergey-dryabzhinsky/nginx-rtmp-module.git
cp -r nginx-rtmp-module nginx-1.10.3

在第 3 步中可以得知安装的 nginx 的编译选项,所以套用这些编译选项,在上一步已经把 nginx-rtmp-module 复制到 nginx 源码目录,所以在结尾添加 –add-module=./nginx-rtmp-module 。在 nginx-1.10.3 目录执行以下命令:

./configure --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads --add-module=./nginx-rtmp-module

上一步执行后可能会提示以下几个错误,需安装相关软件包,然后再次执行步骤 5 的命令。

./configure: error: the HTTP rewrite module requires the PCRE library.
./configure: error: SSL modules require the OpenSSL library.
./configure: error: the HTTP XSLT module requires the libxml2/libxslt
./configure: error: the HTTP image filter module requires the GD library.
./configure: error: the GeoIP module requires the GeoIP library.
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install openssl libssl-dev
sudo apt-get install libxml2 libxml2-dev libxslt-dev
sudo apt-get install libgd2-xpm-dev
sudo apt-get install libgeoip-dev

上一步执行完成后 make,等待 nginx 编译完成。编译过程可能会出现 error: macro “DATE” might prevent reproducible builds 错误,在 CFLAGS 中添加 -Wno-error=date-time 参数即可,也就是步骤5的命令改成

./configure --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -Wno-error=date-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads --add-module=./nginx-rtmp-module

编译完成后,在 objs 目录下会有 nginx 的可执行文件。首先停止 nginx 服务,替换掉 nginx 。

sudo service nginx stop
cd /usr/sbin
sudo mv nginx nginx.bak
sudo cp ~/nginx-1.10.3/objs/nginx ./

修改 /etc/nginx/nginx.conf,在结尾添加使其开启 nginx-rtmp-module 相关的功能。

rtmp {
        server {
                listen 1935;
                chunk_size 4000;
                application live {
                        live on;
                }
        }
}

执行 sudo service nginx restart 重启 nginx 服务,然后执行 netstat -a|grep 1935,可以看到 1935 端口处于 LISTEN 状态,即可向 nginx 推流。更多强大的功能可以查看 nginx-rtmp-module

 

二、 支持HLS

找到rtmp 修改下面这个地方

rtmp {
    server {
        listen 1935;
        application live {
            live on;
            record off;
        }
 
        # HLS
 
        # For HLS to work please create a directory in tmpfs (/tmp/hls here)
        # for the fragments. The directory contents is served via HTTP (see
        # http{} section in config)
        #
        # Incoming stream must be in H264/AAC. For iPhones use baseline H264
        # profile (see ffmpeg example).
        # This example creates RTMP stream from movie ready for HLS:
        #
        # ffmpeg -loglevel verbose -re -i movie.avi  -vcodec libx264
        #    -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1
        #    -f flv rtmp://localhost:1935/hls/movie
        #
        # If you need to transcode live stream use 'exec' feature.
        #
        application hls {
            live on;
            hls on;
            hls_path /usr/local/var/www/hls;
        }
 
        # MPEG-DASH is similar to HLS
 
        application dash {
            live on;
            dash on;
            dash_path /tmp/dash;
        }
    }
 } 
保存配置文件,重新加载nginx配置

nginx -s reload

2.进行推流测试(使用ffmpeg,安装见最后)

ffmpeg -loglevel verbose -re -i /Data/Movies/Demo.mov  -vcodec libx264 -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:1935/hls/movie

然后你就可以在这个目录
/usr/local/var/www/hls
看到生成一个个ts的文件,还会生成一个movie.m3u8的文件

在Safari里输入地址查看视频(需要等movie.m3u8文件生成后),也可以用iPad或者iPhone上的Safari来访问(其他设备记得需要把localhost改为nginx的ip地址)
http://localhost:8080/hls/movie.m3u8

附:
ffmpeg安装:

Ubuntu

Ubuntu 中安装比较简单,直接使用 apt 安装即可

1
$ sudo apt install -y ffmpeg

CentOS

CentOS 中则比较麻烦,需要使用源码安装

下载并解压

1
2
3
$ wget https://ffmpeg.org/releases/ffmpeg-4.1.tar.bz2
$ tar -xjvf ffmpeg-4.1.tar.bz2
$ cd ffmpeg-4.1

编译

1
2
$ ./configure
nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.

可以使用 --disable-x86asm 参数略过该配置或者直接安装

1
$ sudo yum install -y yasm

也可以从官网下载源码安装

随后再次编译安装即可

1
2
$ ./configure
$ sudo make && sudo make install

安装pyOpenSSL == 0.13.x时提示“OpenSSL/crypto/crl.c:6:23: error: static declaration of ‘X509_REVOKED_dup’ follows non-static declaration static X509_REVOKED * X509_REVOKED_dup(X509_REVOKED *orig)”解决方式

 pip  安装pyOpenSSL == 0.13.x时提示“OpenSSL/crypto/crl.c:6:23: error: static declaration of ‘X509_REVOKED_dup’ follows non-static declaration static X509_REVOKED * X509_REVOKED_dup(X509_REVOKED *orig)”解决方式已关闭评论
12月 242020
 

今天需要安装老的0.13版本的pyOpenSSL时出现下面错误“

OpenSSL/crypto/crl.c:6:23: error: static declaration of ‘X509_REVOKED_dup’ follows non-static declaration
static X509_REVOKED * X509_REVOKED_dup(X509_REVOKED *orig)”

 

结合网上资料可以使用下面的步骤即可完成安装:

1.#新建一个目录build

[[email protected]] mkdir build

[[email protected]] cd build

 

2. #然后下载pyOpenSSL==0.13的源码,解压后
[[email protected]] pip download pyOpenSSL==0.13
[[email protected]] tar xzf pyOpenSSL-0.13.tar.gz

 

3.#修改OpenSSL/crypto/crl.c文件
[[email protected]] cd pyOpenSSL-0.13

[[email protected]] vi OpenSSL/crypto/crl.c

找到这一行
static  X509_REVOKED * X509_REVOKED_dup(X509_REVOKED *orig) {

删除static,修改为:

X509_REVOKED * X509_REVOKED_dup(X509_REVOKED *orig) {

 

4.#然后再安装

[[email protected]] pip install –no-clean .

 

DONE!!!

centos 7 安装 mysql 5.7 及问题总结

 mysql  centos 7 安装 mysql 5.7 及问题总结已关闭评论
12月 242020
 

centos 7中默认没有mysql 的rpm安装包,需要自己添加

在 https://dev.mysql.com/downloads/repo/yum/ 找到 yum 源 rpm 最新的安装包。

我们只下载mysql 5.7的

# 下载
shell> wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
# 安装 mysql 源
shell> yum localinstall mysql57-community-release-el7-11.noarch.rpm  # 或者 使用 rpm -ivh mysql57-community-release-el7-11.noarch.rpm

#安装mysql

shell> yum install -y mysql-community-server

#启动mysql

shell> systemctl start mysqld

#查看状态

shell> systemctl status mysqld

#设置开机启动
shell> systemctl enable mysqld
# 重载所有修改过的配置文件
shell> systemctl daemon-reload

#修改root本地账户密码
#mysql安装完成之后,生成的默认密码在 /var/log/mysqld.log 文件中。使用 grep 命令找到日志中的密码。
#shell> grep ‘temporary password’ /var/log/mysqld.log
#首次通过初始密码登录后,使用以下命令修改密码, 或使用 mysql_secure_installation命令也可以按提示修改
shell> mysql -uroot -p
mysql> ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘NewPassword’;

##问题汇总:
1. mysql 5.7 默认安装了密码安全检查插件(validate_password),默认密码检查策略要求密码必须包含:大小写字母、数字和特殊符号,并且长度不能少于8位。否则会提示 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements 错误
#解决方法,将密码强度改为LOW
#0 or LOW #1 or MEDIUM #2 or STRONG
#在mysql终端下运行:
mysql> set global validate_password_policy=0;
#默认都要求密码8位以上,可以使用下列命令修改长度为4
mysql> set global validate_password_length=4;

2. telnet mysql时出现:is not allowed to connect to this MySQL serverConnection closed by foreign host
#解决方法
#在mysql终端下运行:(%表示所有ip,如果要求本机适用localhost或ip地址代替)
mysql> grant all privileges on *.* to ‘root’@’%’ identified by ‘123456’;
#使授权生效
mysql> flush privileges;

3. mysql 安装后默认不支持中文,需要修改编码。
#修改 /etc/my.cnf 配置文件,在相关节点(没有则自行添加)下添加编码配置,如下:

[mysqld]
character-set-server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
#重启mysql服务,查询编码。可以看到已经改过来了

shell> systemctl restart mysqld
shell> mysql -uroot -p
mysql> show variables like ‘character%’;

 

 

 

python使用timeit测试/统计小段代码运行时间

 python  python使用timeit测试/统计小段代码运行时间已关闭评论
12月 232020
 

python下有个小而美的测试代码片段时间的模块timeit,使用方法如下:

比如:  “-“.join(str(n) for n in range(100))语句执行3趟,每趟10000次的时间统计如下测试:

一、 终端命令行方式:
python -m timeit -n 10000 -r 3 -v ‘”-“.join(str(n) for n in range(100))’
raw times: 0.345 0.351 0.329
10000 loops, best of 3: 32.9 usec per loop
每次执行了10000次,共执行3次,最好的1次,平均每loop是32.9 usec(32.9微秒,10000 loops,best of 3的意思是一共repeat了3次,每一次10000 loops,取最好的那一次来平均)。32.9 usec就是这一行python表达式的执行时间。

二、python模块内方式:
>>> import timeit
>>> timeit.timeit(‘”-“.join(str(n) for n in range(100))’, number = 10000)
0.3615691661834717
>>> timeit.repeat(‘”-“.join(str(n) for n in range(100))’, number = 10000, repeat=3)[0.37982702255249023, 0.3650989532470703, 0.3783681392669678]

三、jupyter note使用方式
%timeit -n 1000 -r 3 “-“.join(str(n) for n in range(100))

 

附录资料:

1. 命令行界面

命令格式: python -m timeit [-n N] [-r N] [-u U] [-s S] [-t] [-c] [-h] [语句 ...]

参数:

-n:执行次数
-r:计时器重复次数
-s:执行环境配置(通常该语句只被执行一次)
-v:打印原始时间
-h:帮助

 

2. 多行语句执行方式(注意空格)

python -m timeit ‘try:’ ‘  str.__bool__’ ‘except AttributeError:’ ‘  pass’

1000000 loops, best of 3: 1.2 usec per loop

Oracle Cloud free 免费云科学上网防火墙/iptable设置

 免费云  Oracle Cloud free 免费云科学上网防火墙/iptable设置已关闭评论
12月 162020
 

使用Oracle Cloud free 免费云搭建了v2ray /  shadowsockR, 在 子网 -> 安全列表 -> 入网规则 里也打开了对应的端口,但远程连接 telnet  ip + 端口 还是连接不上。

原来oracle cloud与 aws等云不同,需要关闭防火墙或iptable。

 

解决方法:

centos操作如下:

#停止firewall
systemctl stop firewalld.service
#禁止firewall开机启动
systemctl disable firewalld.service
#关闭iptables
service iptables stop
#去掉iptables开机启动
chkconfig iptables off
oracle Linux操作如下
#停止firewall
systemctl stop firewalld.service
#禁止firewall开机启动
systemctl disable firewalld.service
ubuntu操作如下:
#Oracle自带的Ubuntu镜像默认设置了Iptable规则,关闭它
apt-get purge netfilter-persistent
reboot
#强制删除
rm -rf /etc/iptables && reboot

mac 下 使用matplotlib画图时出现“ValueError: max() arg is an empty sequence”的解决方法

 mac, Matplotlib  mac 下 使用matplotlib画图时出现“ValueError: max() arg is an empty sequence”的解决方法已关闭评论
12月 112020
 

mac机器在使用matplotlib画图时出现下面的错误提示: “ValueError: max() arg is an empty sequence”, 出现这个问题是由于不兼容造成的, 可以使用创建子图的方式规避这个问题,添加下面的黑体字语句即可:

import matplotlib.pyplot as plt

plt.subplot(1,1,1)  # 共1行1列,这是第一张图

 

DONE!!!

mac新系统下使用pip安装模块时提示”Could not install packages due to an EnvironmentError” 问题解决

 python  mac新系统下使用pip安装模块时提示”Could not install packages due to an EnvironmentError” 问题解决已关闭评论
12月 112020
 

mac使用pip安装 pytorch时提示:” Could not install packages due to an EnvironmentError”

其实现在mac新系统不再允许直接操作根目录下文件,所以pip安装模块时经常提示这个,可以在pip安装时添加  –user  参数

比如:

pip install –user torch torchvision torchaudio

 

加 –user 的作用是显式指定安装在用户自己的工作空间而非全局的里。

DONE!

rabbitmq延迟队列实现(插件方式)

 rabbitmq  rabbitmq延迟队列实现(插件方式)已关闭评论
12月 102020
 

在RabbitMQ 3.5.7及以后的版本提供了一个插件(rabbitmq-delayed-message-exchange)来实现延时队列功能。同时插件依赖Erlang/OPT 18.0及以上。

插件的源码地址:

https://github.com/rabbitmq/rabbitmq-delayed-message-exchange

插件下载地址:

https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases

 

 

以linux下为例:

1、进入插件目录

$ whereis rabbitmq   #查询rabbitmq所在目录

$ cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.12/plugins  #进入所在目录的plugins目录

2、下载插件

wget https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/3.8.9/rabbitmq_delayed_message_exchange-3.8.9-0199d11c.ez

3、启用插件

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

4、停用插件

rabbitmq-plugins disable rabbitmq_delayed_message_exchange

5、插件使用

通过声明一个x-delayed-message类型的exchange来使用delayed-messaging特性。x-delayed-message是插件提供的类型,并不是rabbitmq本身的(区别于direct、topic、fanout、headers)。

preview

 

使用方法可以参考上面git上插件源码页面提示。

Done!