Tag Archives: Mac

如何远程给女儿放动画片之iPhone篇

上一篇写了部署动态域名、端口映射、SSH隧道的架设,然后在新电脑上用「屏幕共享」来访问家中的旧苹果电脑。那么如果是在半路上,只有一台iPhone手机,没有电脑在手或者操作电脑不方便,就没法弄了。所以接下来就是解决用手机远程连接的问题。

在手机上策略仍然一样,首先仍然是要在iPhone和旧电脑间架设起SSH隧道,然后通过隧道来访问旧电脑上的屏幕共享接口即可。macOS上系统自带的「屏幕共享」(Screen Sharing.app)本质上就是一个VNC客户端,因此在iPhone上使用一个通用的VNC客户端即可完成访问。

Saravia 步骤一、在iPhone和旧电脑间建立SSH隧道。

这里需要找到这样一款App,它可以通过RSA密钥对来建立SSH隧道,还要能成为全局代理,因为下一步的VNC客户端需要通过它来转发网络通讯。经过一番搜索和尝试后,找到了「Termius」这款App,选它主要是它不仅能建立SSH隧道,重要的是可以在后台运行。

安装完Termius后,分四步完成设置:

(一)在「Valuts」-「Keychain」中新建一组RSA密钥对。

点右上角「+」按钮选「Generate Key」,Type选「RSA」(其实默认ED25519更好,如有兴趣可自行尝试),点「Save」按钮完成创建。然后长按刚创建的密钥对,选「Edit」,将其中的Public Key复制,发送(通过微信、QQ、iMessage皆可)并保存旧电脑的~/.ssh/authorized_keys中。

(二)在「Valuts」-「Hosts」中新建一个Host:

Label:home-mac
IP or Hostname:example.ddns.com
Use SSH:勾选
Port:35791
Username:YOUR_USERNAME
Password:不要填
Key:刚才创建的密钥

注意:这里的YOUR_USERNAME要换成你的旧电脑上的用户名,后面的example.ddns.com要换成你注册的动态域名。

如果配置成功,在这里点击「home-mac」,就会登录到旧电脑的命令行了。

(三)在「Valuts」-「Port Forwarding」中新建一个配置:

Label:back-to-home-mac
Local Port:5900
Bind Address:0.0.0.0
Intermediate Host:刚才创建的Host
Destination address:127.0.0.1
Destination port number:5900

(四)在「Profile」-「Settings」中,勾选上「Save Location Data」。

这个功能看起来无厘头,但其实是App为了保持住在后台持续运行的一个讨巧之法。如果不开启,一切换到别的App去,刚建立的SSH隧道连接很快就会中断。

一切就绪后,回到「Valuts」-「Port Forwarding」,点击「back-to-home-mac」,SSH隧道就启动了。此时即使退出Termius,在灵动岛或导航栏上会看到它仍在后台运行的状态提示。

Andalucía 步骤二、使用VNC客户端连接回旧电脑。

一般的VNC客户端基本上都可行,比如「RealVNC Viewer」。下面就以它为例,安装完后在Address Book新创建一个配置:

Address:127.0.0.1:5900
Name:home-mac

保存后,点「Connect」按钮即可。顺利的话,此时就会连接上旧电脑了。

至此,所有的配置就已完成。有时在回家的半路上,女儿来微信说要看动画片,我就会掏出手机,打开「Termius」App,点击「Port Forwarding」-「home-mac」启动SSH隧道,然后切到「RealVNC Viewer」App,点击「home-mac」远程连到家中旧电脑,开始给她放动画片。

对了,每次放动画片前,我还会问她喝完今天的牛奶没有,没有喝完牛奶,是不给放动画片的哟。

如何远程给女儿放动画片

家里有一台闲置的旧MacBook苹果电脑,平时会连在电视上给女儿放动画片。在家时我会用手头的新苹果电脑通过「屏幕共享」(Screen Sharing.app),连接上局域网里的旧电脑来操作播放。但如果我不在家,就没办法连回这台旧电脑了。于是我开始研究如何解决这个问题。

最简单的办法莫过于使用第三方的远程控制/远程登录/远程管理类的软件,如TeamViewer。但这类软件一般并不免费且不便宜,或者免费但限制可用机器数量,实在不想折腾时,可作为备选方案。

那么还是从苹果自带的软件入手。既然在局域网中可以使用「屏幕共享」来远程连接,那么只要在路由器上配置一下端口映射,理应就可以从外网来连上旧电脑。查询了一下「屏幕共享」的默认端口为5900,在路由器上配置完端口映射,查询了路由器的公网IP地址,然后在新电脑上打开「屏幕共享」App,输入公网IP,果然成功连上。

但这样把旧电脑的连接端口暴露在公网上,还可以直接通过输入用户名和密码登录,安全性实在堪忧,所以更好的办法显然是建立SSH隧道来实现连接。同时,还可以通过路由器的端口映射隐藏真实的SSH连接端口,并强制要求用RSA密钥验证建立隧道连接,这样在新电脑上只要建立好SSH隧道连接,就可以像在本地网络中一样访问旧电脑的「屏幕共享」了。

其次是公网IP的问题,路由器的公网IP可能会被网络服务商动态更换,因此还需要利用动态域名服务来自动更新公网IP。由于家里的 小米路由器支持动态域名功能,只要找一家动态域名商注册个域名即可。

接下来就是详细的流程:

步骤一、在新电脑上创建RSA密钥对。估计大部分程序员已经可以省掉这一步,当然也可以专门再生成一套密钥对。

步骤二、找一家动态域名服务商注册,并部署到路由器中。为了方便下面引用,假设注册的动态域名是example.ddns.com。

步骤三、在路由器上设置端口映射。以小米路由器为例,找到「端口转发」,填上旧电脑的局域网IP地址,外部端口填写一个随机端口号比如35791,内部端口号也填写一个随机端口号比如36922。注意下面步骤中不同地方对应的这两个端口号。

步骤四、配置部署SSH隧道。

在旧电脑上做如下操作:

1、修改sshd服务的配置文件/etc/ssh/sshd_config:

Port 36922  #对应上路由器中配置的内部端口号
PubkeyAuthentication yes  #启用公钥验证
PasswordAuthentication no  #取消密码验证
PermitTunnel yes  #允许建立隧道。

2、添加新电脑上的RSA公钥到~/.ssh/authorized_keys

3、在「系统设置」-「通用」-「共享」中启用「屏幕共享」和「远程登录」。

4、[可选] 打开Terminal或iTerm终端,执行一句命令:

sudo defaults write /Library/Preferences/com.apple.RemoteManagement RestoreMachineState -bool NO

用新电脑远程登录上旧电脑后如果断开连接,旧电脑就会自动锁屏,执行这句命令后,可以确保旧电脑仍会继续播放动画片而不锁屏。

在新电脑上做如下操作:

1、修改~/.ssh/config,添加

Host home-mac
Hostname example.ddns.com
Port 35791
User YOUR_USERNAME
IdentityFile ~/.ssh/id_rsa
ServerAliveInterval 120

注意:(1)35791对应于路由器端口映射处设置的外部端口;(2)要将上面的YOUR_USERNAME修改为旧电脑上的用户名;(3)这里私钥使用的默认路径和名称,如果步骤一中生成了专门的密钥对,这里记得改成相应的路径和名称。

2、创建一个back-home.sh文件,添加下面的脚本代码

!/usr/bin/env bash

ssh -Nv -L 5901:localhost:5900 home-mac

创建完用chmod a+x back-home.sh给文件加上可执行权限,然后执行它就可以建立起SSH隧道了。

步骤五、在新电脑上打开「屏幕共享」App,新建一个连接并输入localhost:5901,然后点连接按钮,如果一切顺利就可以看到旧电脑的屏幕了。

至此,完整的苹果电脑远程控制就已实现。每次当女儿给我发来微信要看动画片时,我就会用新电脑先在iTerm里执行back-home.sh建立SSH隧道,然后再打开「屏幕共享」远程登录回家中旧电脑,给她播放动画片。

不过如果电脑不在身边,或正好在路上,而手上只有一部iPhone该怎么办呢?下一篇继续讲用iPhone远程连回旧电脑的办法。