为了保障网络和数据安全,愈来愈多公司使用堡垒机。iTerm做为一个好用的终端利器,要实现自动经过堡垒机登陆服务器的方式有多种。下面我就来介绍一种经过expect脚本的方式完成配置。html
第一步,进入/usr/local/bin目录,新建remote.exp文件,文件内容以下:linux
//remote.exp文件内容 #!/usr/bin/expect set jumpusr [lindex $argv 0] set jumphost [lindex $argv 1] set usr [lindex $argv 2] set host [lindex $argv 3] catch {spawn ssh -l $jumpusr $jumphost} expect "*$jumphost*" { send "ssh -l $usr $host\r" } expect "*$host*" { send "cd ~\r"; interact }
第二步,执行下面命令,修改文件属性为可执行shell
chmod 777 remote.exp
第三步,在iTerm中测试刚才的程序。测试命令格式以下:windows
// user1为登陆堡垒机的用户名 // host1为堡垒机IP地址 // user2为登陆目标服务器的用户名 // host2为目标服务器的IP地址 remote.exp user1 host1 user2 host2
如:remote.exp xiaowang 123.4.56.78 hadoop 132.45.6.89
执行命令后,直接进入目标服务器。若是没有成功检查本身是否有堡垒机和目标服务器权限安全
第四步,配置iTerm
在iTerm中打开 Preferences -> Profiles -> General, 点击左侧底部“+”增长配置。
bash
配置完成后,点击菜单栏的profiles,便可看到添加的快捷入口,点击入口便可快速登陆相应的服务器。这种方法默认从new tab打开服务器。
服务器
也可点击快捷点“command+O”打开profiles窗口,选择入口和打开方式登陆服务器。这种方法可选择从水平分割、垂直分割、新tab、新窗口方式打开。
网络
后续,如须要增长新的堡垒机和服务器登陆,只需在iTerm的profiles中增长新的配置便可。ssh
注:文中显示的IP地址均为虚构地址,若有雷同请联系我修改。oop
remote.exp文件内容详解:
#!/usr/bin/expect set jumpusr [lindex $argv 0] set jumphost [lindex $argv 1] set usr [lindex $argv 2] set host [lindex $argv 3] catch {spawn ssh -l $jumpusr $jumphost} expect "*$jumphost*" { send "ssh -l $usr $host\r" } expect "*$host*" { send "cd ~\r"; interact }
#!/usr/bin/expect, 指定用来执行该脚本的命令程序,这里的expect相似linux下的bash、windows下的cmd。注意:这行必须在第一行。
set jumpusr [lindex $argv 0], 获取执行脚本时传入的参数(参数保存在$argv中,从0号开始是参数),并将第0个参数保存到变量jumpusr中。
spawn ssh -l $jumpusr $jumphost, spawn是进入expect环境后才能够执行的expect内部命令,若是没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的,因此不要用 “which spawn“之类的命令去找spawn命令。比如windows里的dir就是一个内部命令,这个命令由shell自带,你没法找到一个dir.com 或 dir.exe 的可执行文件。
spawn主要的功能是给ssh运行进程加个壳,用来传递交互指令。
expect "*$jumphost*" { send "ssh -l $usr $host\r" }, 这里的expect也是expect的一个内部命令,这个命令的意思是判断上次输出结果里是否包含$jumphost(堡垒机地址)的值的字符串,若是有,执行‘ssh -l $usr $host\r’
expect "*$host*" { send "cd ~\r"; interact }, 判断上次输出结果里是否包含$host(目标服务器地址)的值的字符串,若是有,进入服务器用户目录,并保持交互动做。
interact, 执行完成后保持交互状态,把控制权交给控制台,这个时候就能够手工操做了。若是没有这一句登陆完成后会退出,而不是留在远程终端上。
expect命令参考连接:http://www.cnblogs.com/lixigang/articles/4849527.html