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

1 篇文章 0 订阅

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
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以通过使用Runtime类或ProcessBuilder类来远程调用shell脚本获取输出信息。 使用Runtime类的示例代码如下: ```java public class RemoteShellDemo { public static void main(String[] args) { String command = "ls -l"; try { Process process = Runtime.getRuntime().exec(command); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } process.waitFor(); reader.close(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } } ``` 使用ProcessBuilder类的示例代码如下: ```java public class RemoteShellDemo { public static void main(String[] args) { String command = "ls -l"; try { ProcessBuilder processBuilder = new ProcessBuilder(command.split(" ")); Process process = processBuilder.start(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } process.waitFor(); reader.close(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } } ``` 以上两种方式都可以通过执行shell命令来远程调用shell脚本,并使用BufferedReader来读取输出信息并打印。请注意,读取输出是阻塞的,需要等待命令执行完毕。 当然,在实际应用,为了远程调用shell脚本,你需要配置好网络连接和权限等,确保能够正常访问并执行远程服务器上的shell脚本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值