平时我们需要登录一台远程服务器时,可以使用 ssh 来完成。形如
ssh -p Port User@Hostname
回车,然后发现还会要求输入密码,之后才能登录。
这个步骤看起来有点繁琐,每次都要输入端口、用户名等信息,接着等 bash 的交互,之后还要输入密码。那么,有没有其他更便捷的方式呢?
很多人会想到 ssh 别名的形式。形如
ssh remote01
其中,remote01
就是你定义的远程服务器的别名。
要实现这个别名登录,还需要把本地的 ssh 的公钥(~/.ssh/id_rsa
)拷贝到远程服务器的 ~/.ssh/authorized_keys
文件中。具体怎么实现,不是本文的目的,就不在这里阐述了。
本文主要讲另一种方式,如何利用脚本命令实现这一目的。
实现步骤
备注: 以下步骤均在 mac 操作
- 创建一个
bin
文件夹,并在该目录下生成一个remote01
文件
$ pwd
/Users/hanquliu
$ mkdir bin && cd bin
$ touch remote01
- 添加如下内容
#!/usr/bin/expect
spawn ssh -p Port User@Hostname
expect "Password:"
send "******\r"
interact
Port
、User
、Hostname
分别为登录远程服务器的端口、用户名和主机名。
******
为登录密码,之后的\r
是必须的,表示回车
- 添加下面的代码到
~/.bash_profile
文件
export PATH=$PATH:/Users/hanquliu/bin
$PATH:
后面的路径为刚才你创建的路径
- 更新
source ~/.bash_profile
- try it
remote01
如无意外,简单的一个 remote01
命令,就可以让你实现一键登录到远程服务器了。
实现原理
上面的几个步骤,看起并不复杂。主要是步骤 2,下面讲解一下:
expect 是一个处理交互的命令。借助 expect,我们可以编写脚本命令,自动完成交互。 其主要有以下几个命令:
- spawn
- send
- expect
- interact
spawn
spawn
命令会启动一个新的进程,然后接着执行后面的命令。对应上文,就是执行 spawn ssh -p Port User@Hostname
expect
expect
,中文翻译就是期待、期望的意思。
很容易理解,这里就是期望执行了 spawn
后面的命令后的返回值。
如果返回的结果跟 expect
后面的内容是匹配的,那就会接着继续后面的 send
,否则就结束。
send
send
,向进程发送字符串
interact
允许用户与当前 shell 进行交互