shell脚本中用SSH执行远程指令并获取输出

1、应用背景

目的是实现shell脚本通过SSH获取另外一台终端输出,这样就可以快速的获取到另外一台终端的各种信息。

2、第一个SSH脚本 exp.sh

百度后参考了一些代码,假设我想要获取另一台终端的语言环境,远程执行locale,具体的执行的远程指令可以随意设置,这个脚本为基础,脚本代码如下:

#!/usr/bin/expect

if {$argc<4} { 
 puts "Error params: $argv" 
 puts "Expect params :user passwd ip port [translate_id]"
 exit 1
} 

set default_passcode "这⾥填通道机的默认密码"
set user [lindex $argv 0] 
set password [lindex $argv 1]
set ip [lindex $argv 2]
set port [lindex $argv 3]
set timeout 3 
while 1 { 
 spawn bash -c "ssh -p $port $user@$ip << EOF\nlocale\nexit\nEOF"
#如果最后的字符匹配则执⾏命令\r结尾表⽰确定
 expect { 
  "*yes/no" { send "yes\r";exp_continue}
  "*password:" { send "$password\r" }
 } 
#这⾥是需要通过通道机登陆时的匹配流程,根据需要⾃⾏修改。
 expect { 
  "*PASSCODE:" {  
   send_user "请输⼊通道机动态密码:";
   expect_user -re "(.*)\n" 
   set random_passcode $expect_out(1,string)
   send "$default_passcode$random_passcode\r"
   expect { 
    "Access Denied" { continue }
    "Enter:" { send "1\r" }
   } 
   set translate_ip [lindex $argv 4]
   if { $translate_ip != "" } { 
    expect "*):" { send "$translate_ip\r" }
   }
  } 
  #"Last login:*" { }
 } 
 break
} 

3、第二个调用脚本 ssh.sh

调用方法./ssh.sh 192.168.1.1

#!/bin/bash

rm ~/.ssh -rf
password=$2

function my_note() {
  printf "\n第一个参数请输入IP\n第二个参数是密码, 可不填, 默认是abcd1234\n\n"
}

function check_ip() {
  IP=$1
  VALID_CHECK=$(echo $IP | awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "yes"}')
  if echo $IP | grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null; then
    if [ ${VALID_CHECK:-no} == "yes" ]; then
      echo "获取设备信息中……"
    else
      echo "IP $IP 不可用!"
      my_note
      exit 0
    fi
  else
    echo "IP 格式错误!"
    my_note
    exit 0
  fi
}

# 1、检测IP合法性
check_ip $1

# 2、设置密码
if [ "$2" = "" ]; then
  password="123456789"
fi

# 3、远程SSH执行locale
expect ./exp.sh username $password $1 22
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐