ssh参数中无密码选项-解决方式

在shell脚本中向其他设备发送命令,可以通过ssh协议,ssh可以用密码方式和免密码方式。

  • 免密码方式是把本机的ssh public key上传到目标设备上;
  • 密码方式就是ssh登陆或发命令时需要交互一次让输密码的过程。

有些情况不适合向目标设备上传public key,例如目标设备不允许上传等情况,就需要用输入密码的方式,

但输入密码的方式又不利于shell脚本自动化,为了密码跟随到参数中一次性输入,有很多手段:

1、

sshpass

https://sourceforge.net/projects/sshpass/files/sshpass/

使用方式:

sshpass -p "XXX" ssh user@IP  “command”

执行多条命令用 && 即可:

sshpass -p "XXX" ssh user@IP  “command1 && command2”

本地脚本在目标设备上运行:

sshpass -p password ssh -q username@password bash -s < shell_script.sh

注:

ssh重要的几个选项:

-q:quiet mode,不让ssh输出各种提示信息;
-o StrictHostKeyChecking=no:ssh的一个option,不做strict check,连接时不用再确认是否连接,不再提示输入yes/no确定是否登录;
-t:告诉ssh,后面的命令是ssh以后,在目标机器上运行的。
 
使用bash定义公共函数如下:
#!/bin/bash
 
################################################################################
# <USAGE>: send_cmd <ip> <port> <username> <password> <command>
################################################################################

function send_cmd()

{

  ret=`sshpass -p $4 ssh -q -o "StrictHostKeyChecking no" -p $2 $3@$1 -t "$5"`

  if [[ "${ret}" =~ "Host key verification failed" ]]; then

    rm -f ~/.ssh/known_hosts

    ret=`sshpass -p $4 ssh -q -o "StrictHostKeyChecking no" -p $2 $3@$1 -t "$5"`

  fi

  echo "${ret}"

2、

expect

2.1 示例脚本:

#!/usr/bin/expect

spawn ssh -q username@hostname

expect "*assword*"

send "password "

expect "*$*"

send "command "

expect "*$*"

send "exit "

expect eof

2.2 expect不支持本地脚本直接在目标设备上运行,想执行则需要先拷贝到目标设备。

2.3 expect可以应用到其他,例如scp、 ftp、等很多需要交互的命令。

其他备注:

ssh -q 中“-q”参数,也可以用ssh -o "StrictHostKeyChecking no" 。

3、putty中plink工具

putty开源源码,可以用在windows和linux,它包含很多小工具,其中plink工具很方便的直接执行命令。

例如windows上执行:

plink.exe -batch  -l root -pw 111111  100.2.160.200 ls 

参数帮助请参考plink.exe --help

原文地址:https://www.cnblogs.com/JamesLi/p/12765242.html