爱技术 & 爱分享
爱蛋蛋 & 爱生活

ssh自动登录

在使用ssh 登录远端机器的时候,由于它要进行一次跟服务器的加密交互,所以没有直接附带密码登陆的选项,导致每一次登录都需要输入一次密码,而且也容易按错,所有常常效率都不高,当然配置了public key 免密登录的时候除外。

本篇文章主要是来讲一下如何 自动登录,而不是免密登录。

需要用到的命令是 expect。关于expect的相关知识,请看 linux expect (自动交互)

这里再稍作解释:

expect解释器

expect是一个能实现自动和交互式任务的解释器,它也能解释常见的shell语法命令,其特色在以下几个命令:

spawn命令

spawn command命令会fork一个子进程去执行command命令,然后在此子进程中执行后面的命令;

在ssh自动登陆脚本中,我们使用 spawn ssh user_name@ip_str,fork一个子进程执行ssh登陆命令;

expect命令

expect命令是expect解释器的关键命令,它的一般用法为 expect “string”,即期望获取到string字符串,可在在string字符串里使用 * 等通配符;

string与命令行返回的信息匹配后,expect会立刻向下执行脚本;

set timeout命令

set timeout n命令将expect命令的等待超时时间设置为n秒,在n秒内还没有获取到其期待的命令,expect 为false,脚本会继续向下执行;

send命令

send命令的一般用法为 send “string”,它们会我们平常输入命令一样向命令行输入一条信息,当然不要忘了在string后面添加上 \r 表示输入回车;

interact命令

interact命令很简单,执行到此命令时,脚本fork的子进程会将操作权交给用户,允许用户与当前shell进行交互;

完成脚本

以下是一个完成版的脚本 test.sh (记得删除注释):

#!/usr/bin/expect                   // 指定shebang

set timeout 3                       // 设定超时时间为3秒
spawn ssh user_name@192.***.***.*** // fork一个子进程执行ssh命令
expect "*password*"                 // 期待匹配到 'user_name@ip_string's password:'
send "my_password\r"                // 向命令行输入密码并回车
expect "*#*"                        //这句可以换成 sleep 1,如果没有这两句的话后面的命令可能不会生效,因为在完成连接远端机器之前,下面的命令就被执行了,所以不会在远端机器上产生任何影响。
send "sudo -s\r"
send "cd /data/logs\r"              // 帮我切换到常用的工作目录
interact                            // 允许用户与命令行交互

执行 sudo chmod +x ./test.sh命令给shell脚本添加执行权限;

运行 ./test.sh命令,一键登陆成功!

简单的几个命令,,搭配起来解决了与命令行的交互问题后,很多复杂的功能也不在话下了~

alias别名

脚本完成了,可是还是有些小瑕疵:

输入./test.sh命令太长。。。

只能在脚本目录中才能执行,不然使用绝对路径输出的命令更长。

这里我们想到了linux的alias命令:

alias命令:

alias命令使用方式为 alias alias_name=”ori_command”,将alias_name设置为ori_command的别名,这样我们输入执行alias_name,就相当于执行了ori_command;

可是,我们会发现,当你关闭当前shell后,再打开一个shell窗口,再使用alias_name,系统提示command not found;

有没有能保持命令的方式呢?编辑bash_profile文件。

bash_profile文件

我们编辑bash_profile文件,此文件会在终端窗口创建的时候首先执行一次,所以可以帮我们再设置一次别名;

执行命令vim ~./bash_profile,在文件内部添加:

alias alias_name=”/root_dir/../test.sh

保存后,再使用 . ~./bash_profile或source ~./bash_profile 在当前脚本执行一遍设置别名命令,完成设置;

这样,我们无论在哪个目录,只要输入alias_name命令,回车,真正的一键登陆!

本文转自:http://www.cnblogs.com/zhenbianshu/p/5867440.html

赞(0) 传送门
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。编程日志 » ssh自动登录
分享到: 更多 (0)

游戏 && 后端

传送门传送门