ssh, expect and Mosh

用了17年的SSH,终于有替代品了

Posted by Dean Wong on May 27, 2017

基本操作

败了一块树莓派,打算用做控制器的操作电脑,需要通过远程登录来管理它。 一开始是用默认的ssh来登录,每次都都要输入密码,这岂不是太麻烦,还好ssh支持公钥来进行登录,于是如此操作:

$ ssh-keygen
$ ssh-copy-id pi@192.168.1.107

这两步操作的意思是,先产生本地的公钥和私钥,然后将公钥上传到远程服务器上,在这里也就是我的树莓派(局域网IP地址是192.168.1.107),如此一来,只输入ssh pi@192.168.1.107就可以快速登录了。

组合操作

不过还有一些不满足,每次我登录之后都要运行一系列的操作,虽然我把一系列的操作写入了一个脚本中,但是每次登录之后还要运行这个脚本感觉还是挺麻烦的,能否自动登录之后就运行呢?

Linux系统本身是有这个功能的,例如常见的操作就是改写.bashrc或是.profile这样的文件,但是这相当于修改了shell,是有副作用的,如果用多终端screen, tmux这些工具就会出现多次运行的问题。

其实我需要的就是第一次登录之后运行一次就行了,这就轮到了expect出场,expect是个什么玩意?简单来说就是一个交互式命令执行工具,它和普通脚本的不同就在于可以设置条件来决定下一步该怎样运行。

在树莓派上放了一个脚本文件/home/pi/bin/start_task.sh,我希望是ssh登录完毕之后就执行它,于是在本地电脑上写了一个/usr/local/bin/logo-raspberrypi.sh脚本文件:

#!/usr/local/bin/expect

# 开始登录
set timeout 7
spawn ssh pi@192.168.1.107

# 树莓派上已经装了oh-my-zsh,如果出现这个,就代表登录完成,进入了shell环境
expect -re "\[oh-my-zsh\]*"

# 执行服务器上的脚本
send "/home/pi/bin/start_task.sh\r"

# 结束操作,开始用户交互模式
interact

再快一点

Nice!到目前为止用起来还算是方便,只是觉得ssh稍微慢了一点点,嗯,当年大神们设计这个工具的时候应该没有考虑到无线网络和越来越多的数据,还好现在有了Mosh

Mosh

据说支持网络环境不好的情况,利用UDP端口,速度快了很多。

keystroke response times

最牛的是全平台支持,先在我的Mac电脑上brew install mosh,然后再在树莓派上sudo apt-get install mosh,接下来把上面那个脚本文件中的ssh替换为mosh,搞定!