想实现随时随地ssh进iphone难度在于其没有公网地址且网卡在3g,4g,wifi中频繁切换,思路大概有两3条:

1、使用花生壳等工具,动态dns,可惜现在暂时不支持linux

2、建立ssh反向连接,这样外网则可以连接进入内网,但是,这种映射是NAT路由自动维持的,不会持续下去,如果连接断开或者网络不稳定都会导致通信失败,这时内网主机需要再次主动连接到外网主机,建立连接,本来想使用autossh进行监控然后自动连接,可是测试切换时无法切换,可能是因为换了网卡shh回话中断,具体不明

3、同样建立ssh反向连接,成功连入内网后为防止中断修改apple启动项,且持续定时建立ssh反向连接,缺点较耗电(可以延迟时间减少耗电),所以最终选用方案三

具体步骤

外网要控制内网的IOS设备

1.建立ssh反向连接

1.1.首先在内网主机上执行

这句话的意思是将外网主机的1234端口和内网主机的22端口绑定,相当于远程端口映射(Remote Port Forwarding)。
这里每次需要输入外网主机root的登陆密码,后面会讲到解决办法。

1.2.这时在外网主机上sshd会监听本地1234端口

1.3.像平时一样连接到A主机的1234端口就可以控制内网B主机了

2.维持反向连接

一开始提到,这种反向连接(Reverse Connection)不稳定,可能随时断开,需要内网主机再次向外网起连接,可以使用Autossh。但是在iphone中此方法测试失败,改用写启动项即修改launchd(文末介绍)来每隔10分钟或者1小时等自动运行ssh -NfR 1234:localhost:22 root@183.129.111.11 -p16667来重新建立ssh反向连接。

在此之前还要解决之前的一个问题,那就是每次内网主机B连接外网主机A时都需要输入密码,这个问题ssh本身是提供另外一种验证方式——通过密钥验证用户身份,实现自动登录。

2.1.在外网主机上生产公钥和私钥
注:内网主机添加外网主机的公钥则外网可以无密码访问内网主机

2.2.添加密钥

复制外网主机上生成的id_rsa.pub公钥到内网主机上,并将内容加入到~/.ssh/authorized_keys中。

注:
上述操作可以使用scp命令操作,比如要把当前一个文件copy到远程另外一台主机上,可以如下命令。

然后会提示你输入另外那台172.19.2.75主机的root用户的登录密码,接着就开始copy了。

如果想反过来操作,把文件从远程主机copy到当前系统,也很简单。

试下,内网主机连接外网主机,就不再输入密码验证了

补充:了解到ssh-copy-id这个命令,上面这个操作就变的简单了

3.修改launchd配置

首先了解下mac os启动顺序(ios类似)

1,mac固件激活,初始化硬件,加载BootX引导器。
2,BootX加载内核与内核扩展(kext)。
3,内核启动launchd进程。

launchd根据 /System/Library/LaunchAgents , /System/Library/LaunchDaemons , /Library/LaunchDaemons, Library/LaunchAgents , ~/Library/LaunchAgents 里的plist配置,启动服务守护进程。

看完了Mac OS X的启动原理,我们不难发觉 /System/Library/LaunchAgents , /System/Library/LaunchDaemons , /Library/LaunchDaemons, Library/LaunchAgents 五个目录下的plist属性文件是优化系统的关键。

下面再来理解几个基础概念,/System/Library和/Library和~/Library目录的区别:

  • /System/Library目录是存放Apple自己开发的软件。
  • /Library目录是系统管理员存放的第三方软件。
  • ~/Library/是用户自己存放的第三方软件。

LaunchDaemons和LaunchAgents的区别:

  • LaunchDaemons是用户未登陆前就启动的服务(守护进程)。
  • LaunchAgents是用户登陆后启动的服务(守护进程)。

所以想要定期执行ssh反向连接只

最后配置plist文件修改启动项:

plist脚本存放路径为/Library/LaunchDaemons(无需登录)/Library/LaunchAgents(需要登录)

可以通过两种方式来设置脚本的执行时间。一个是使用StartInterval,它指定脚本每间隔多长时间(单位:秒)执行一次;另外一个使用StartCalendarInterval,它可以指定脚本在多少分钟、小时、天、星期几、月时间上执行。

launchctl命令可以控制plist脚本停止或重新加载。例如:

启动脚本com.yangyz.cron.test.plist运行

现在就可以随时随地ssh登录进入ios,当然Mac os也可以如此操作。

阅读原文 »

6 1 收藏


直接登录

推荐关注