公司的开发机不知道怎么回事,无法用key登录ssh来免去输入密码的繁琐。昨天花了很长的时间来研究,也没找到问题所在。sshd_config里面的设置没有什么问题,反反复复检查了很多遍。.ssh目录及目录下文件的权限也没有问题。而且不知道谁把登录的文件改了,现在登录上去提示符变成了“-bash-3.00#”。看上去特别别扭。本来想在/etc/profile文件中加一句 PS1="[\u@\h \W]\\$ " 的,后来想想既然别人改成那样,自己再改回去的话会不合适。
因为运行的机器上面连接某些对应的数据库,编译与运行的机器不是同一台。这样一来,从写好程序到运行就是这样:首先将写好的程序scp到编译机上。然后登录到编译机上,执行make等命令。最后再执行scp将编译好的可执行文件上传到运行机上面。中间的过程要输入3次密码,输入的命令也比较多。这样一来有很多时间都浪费在输入上面,影响工作效率。
expect脚本可以很好的处理这个问题。expect用于处理需要交互的情形。比如需要输入密码等等。其实expect可以用在很多地方,只要是能够自动进行交互而不用人为干扰的操作都可以,没有做不到,只有想不到。
下面的是完成上述操作的expect脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#!/usr/bin/expect -f set timeout -1 set file [lindex $argv 0] set compile_path [lindex $argv 1] set run_path [lindex $argv 2] spawn scp $file user @compile_host : $compile_path expect "*password: " send "mypass\r" spawn ssh user @compile_host expect "*'s password: " send "mypass\r" expect "*-bash-3.00*" send "cd $compile_path; make -f makefileimport; scp binary user@run_host:$run_path\r" expect "*'s password: " send "mypass\r" expect "*-bash-3.00*" send "exit\r" interact |
这是一种迫不得已的方法,最好的还是用ssh key来避免输入密码。这样一来密码都是明文保存在脚本当中,不安全。当然可以借助expect输入上面的那些命令。登录ssh的expect脚本可以完成登录之后首先执行某些操作的功能,为了改变登录之后的提示符,可以将 PS1="[\u@\h \W]\\$ " 写入.my_bashrc文件,在脚本中加上执行". .my_bashrc"的操作,这样登录之后显示的提示符就是自己设定的,避免更改/etc/profile文件。同样也可以登录之后进入到某个目录等等。发现有的哥们是把/etc/passwd里面的home路径给改了来达到目的的,因为我们都用的是一个用户,这样自己方便了,但会影响他人。推荐还是用expect脚本完成。
工欲善其事,必先利其器。expect可以节省我们很多的时间。