不适用expect 做到ssh免密码输入

时间:2021-01-29 22:45:36

原文链接 http://xiezhenye.com/2014/08/%E4%B8%8D%E4%BD%BF%E7%94%A8-expact-%E5%AE%9E%E7%8E%B0%E8%87%AA%E5%8A%A8%E5%8C%96-ssh-%E5%AF%86%E7%A0%81%E8%AE%A4%E8%AF%81.html

一般来说,自动化通过 ssh 执行操作或者通过 scp 传文件首先得过 ssh 认证这一关。采用公钥认证是最方便安全的方式。但是有时候不得不使用密码认证。而 ssh 默认是直接读写终端来输出提示信息和读入密码的,所以没法直接用 echo password | ssh ... 的方式来认证。expact 是最常用的用于解决这类问题的工具。但是这玩意实在是很不好用,也不能保证一定安装过。

好在 ssh 还是开了一扇窗,让我们可以实现这点。ssh 有个环境变量,SSH_ASKPASS ,设置了这个环境变量,并且当前会话不是终端时,ssh 在认证时会启动这个程序,从这个程序的标准输出来读取密码。这个功能本来是用于图形终端的,所以还要设置另一个环境变量 DISPLAY=’none:0′,让 ssh 不要试图访问 X11 。至于让进程脱离终端,使用 setsid 就可以了。下面这个例子就展示了自动化实现密码认证并执行命令。

[xluren@test ~]$ cat password.sh 
#!/bin/bash
echo 'helloworld'
[xluren@test ~]$ echo  'echo BEGIN!; ls /' | setsid env SSH_ASKPASS='/home/xluren/password.sh' DISPLAY='none:0' ssh xluren@127.0.0.1
Pseudo-terminal will not be allocated because stdin is not a terminal.
BEGIN!
bin
boot
data0
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
sbin
selinux
srv
sys
tmp
usr
var
[xluren@test ~]$