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
上一篇:
多线程四大经典案例
下一篇:
[编程题]删除链表中重复的结点 C语言