Linux中ssh实现免密登录

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

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选项密码应该是文件名的第一行

$ echo'raypick' > 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\r";exp_continue}
       "raypick@${host_addr}'s password:" {send "${host_password}\r";exp_continue};
}
expect "raypick@${host_name}"
send "mkdir -p /home/raypick/jars/testexpect\r"
expect "raypick@${host_name}"
send "exit\r"
expect eof
END
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: linux