一个命令实现远程登录服务器

1,763 阅读2分钟

平时我们需要登录一台远程服务器时,可以使用 ssh 来完成。形如

ssh -p Port User@Hostname

回车,然后发现还会要求输入密码,之后才能登录。

这个步骤看起来有点繁琐,每次都要输入端口、用户名等信息,接着等 bash 的交互,之后还要输入密码。那么,有没有其他更便捷的方式呢?

很多人会想到 ssh 别名的形式。形如

ssh remote01

其中,remote01 就是你定义的远程服务器的别名。

要实现这个别名登录,还需要把本地的 ssh 的公钥(~/.ssh/id_rsa)拷贝到远程服务器的 ~/.ssh/authorized_keys 文件中。具体怎么实现,不是本文的目的,就不在这里阐述了。

本文主要讲另一种方式,如何利用脚本命令实现这一目的。

实现步骤

备注: 以下步骤均在 mac 操作

  1. 创建一个 bin 文件夹,并在该目录下生成一个 remote01 文件
$ pwd
/Users/hanquliu

$ mkdir bin && cd bin

$ touch remote01
  1. 添加如下内容
#!/usr/bin/expect
spawn ssh -p Port User@Hostname
expect "Password:"
send "******\r"
interact

PortUserHostname 分别为登录远程服务器的端口、用户名和主机名。

****** 为登录密码,之后的 \r 是必须的,表示回车

  1. 添加下面的代码到 ~/.bash_profile 文件
export PATH=$PATH:/Users/hanquliu/bin

$PATH: 后面的路径为刚才你创建的路径

  1. 更新
source ~/.bash_profile
  1. 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 进行交互