Linux中ssh实现免密登录

操作系统: Ubuntu18.04 需求背景:shell脚本中需要实现登录到某台机器,但是ssh命令无法实现交互式操作,所以选取sshpass进行操作。


sshpass工具

sshpass 程序旨在使用键盘交互密码身份验证模式运行SSH ,但以非交互方式运行。 SSH使用直接TTY访问来确保密码确实是由交互式键盘用户发出的。sshpass在专用的TTY中运行SSH,让SSH认为它是从交互式用户那里获取密码的。

安装sshpass

$ sudo apt-get install sshpass

使用sshpass

在sshpass选项之后指定要运行的命令。通常,该命令ssh带有参数,但也可以是任何其他命令。不过,目前SSH密码提示已硬编码为sshpass。

sshpass [-f filename | -d num | -p password | -e] [options]

命令选项

-p 密码 密码在命令行中给出。 
-f 文件名 密码是文件名的第一行。 
-d number number是sshpass从运行程序继承的文件描述符。从打开的文件描述符中读取密码。 
-e 密码来自环境变量"SSHPASS"。

用于sshpass通过SSH登录到远程服务器。假设用户名和密码都为raypick。以下是使用sshpass选项的几种方法。

1、使用-p(这是最不安全的选择,不应使用):

$ sshpass -p "raypick" ssh raypick@localhost

-p在shell脚本中使用时,该选项如下所示:

$ sshpass -p "raypick" ssh -o StrictHostKeyChecking=no raypick@localhost

2、使用-f选项(密码应该是文件名的第一行):

$ echoraypick > pass_file
$ chmod 0400 pass_file
$ sshpass -f pass_file ssh raypick@localhost

-f 在shell脚本中使用以下选项:

$ sshpass -f pass_file ssh -o StrictHostKeyChecking=no raypick@localhost

3、使用-e选项(密码应该是文件名的第一行)

$ SSHPASS=raypick sshpass -e ssh raypick@localhost

-e在shell脚本中使用时,该选项如下所示:

$ SSHPASS =raypick sshpass -e ssh -o StrictHostKeyChecking=no raypick@localhost

sshpass + expect实现交互式shell脚本

安装expect

$ sudo apt-get install expect

下面的代码是交互式ssh登陆机器(我这里登陆的本机,因为没有多余机器)并操作的过程,有需要的可以参考一下。

#!/bin/bash
set -e

host_addr="localhost"
host_name="raypick"
host_password="raypick"

ssh-keygen -R ${host_addr}
/usr/bin/expect <<-END

#set timeout -1
spawn ssh raypick@${host_addr}
expect {
       "yes/no" {send "yes
";exp_continue}
       "raypick@${host_addr}s password:" {send "${host_password}
";exp_continue};
}
expect "raypick@${host_name}"
send "mkdir -p /home/raypick/jars/testexpect
"
expect "raypick@${host_name}"
send "exit
"
expect eof
END
经验分享 程序员 微信小程序 职场和发展