在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\n"
expect "*$*"
send "command\n"
expect "*$*"
send "exit\n"
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