ssh登录远程服务器执行命令

小虾米 阅读:182 2022-06-06 14:03:48 评论:0

ssh登录远程服务器执行命令

前言

本文主要是说明如何通过ssh登录远程服务器,执行相关命令,并获取执行结果,并贴脚本源码。

参数说明

  • serverIp=$1 #远程IP
  • sshUser=$2 #SFTP用户
  • sshPass=$3 #SFTP密码
  • sshCmd=$4 #远程命令

脚本源码

#!/bin/bash 
############################################################## 
# AUTHOR: 黑半白 
# Desc  : ssh登录远程服务器执行命令 
############################################################## 
 
#获取脚本名称 
shName=`basename $0` 
 
#接收参数 
serverIp=$1 #远程IP 
sshUser=$2  #SFTP用户 
sshPass=$3  #SFTP密码 
sshCmd=$4   #远程命令 
 
#当前系统日期-yyyymmdd 
sysDate=`date +"%Y%m%d"` 
#当前系统时间-hhmmss 
sysTime=`date +"%H%M%S"` 
 
#定义日志文件路径和日志文件名 
logPath=/app/log/public/sshCmd/${sysDate} 
logFile=${logPath}/sshCmd_${sysTime}.log 
 
#定义日志函数 
Log() 
{
   
     
    createTime=`date  +"%Y-%m-%d %H:%M:%S"` 
    echo "[${createTime}] $*" |tee -a ${logFile} 2>/dev/null  
} 
 
#定义检查创建目录函数 
CheckDir() 
{
   
     
    if [ ! -d $1 ]; then 
        mkdir_log=` mkdir -p -m 775 $1 ` 
        if [ $? -ne 0 ]; then 
            echo "[ERROR]: Directory [$1] create fail, please check..." 
            exit 1 
        fi     
    fi 
} 
 
#检查日志目录 
CheckDir "${logPath}" 
 
#检查参数个数 
if [ $# -ne 4 ]; then 
    Log "[Error] 参数输入错误, 请检查!" 
    Log "[Error] Eg:" 
    Log "[Error] sh ${shName} 远程IP ssh用户 ssh密码 远程命令" 
    exit 1 
fi 
 
#定义主函数 
execute_ssh_cmd() 
{
   
     
    local serverIp=$1 
    local sshUser=$2 
    local sshPass=$3 
    local sshCmd=$4 
 
    log_file=${logPath}/execute_ssh_cmd_${sysTime}.log 
    #如果密码中包含$符号,需要转义以下 
    sshPass=`echo ${
    
     sshPass} | sed 's/\\$/\\\\$/g'` 
     
    expect <<EOF > ${log_file} 
    #超时时间,因为远程命令执行时间不定,设定不超时(根据实际情况而定) 
    set timeout -1 
    spawn ssh ${sshUser}@${serverIp} "${sshCmd}" 
    expect {
   
     
        "(yes/no)?" 
        {
   
     
            send "yes\n" 
            expect "*password:" {
   
     send "${sshPass}\n"} 
        } 
        "*assword:" 
        {
   
     
            send "${sshPass}\n" 
        } 
        #IP地址输入不对或网络不通 
        "No route to host" 
        {
   
     
            send "IP地址不对或网络不通\n" 
        } 
    } 
    expect {
   
     
        "please try again" 
        {
   
     
            #密码输入不正确,因为前面设定无超时时间限制,需要发送键盘命令Ctrl+C,终止当前操作 
            send "\03\n" 
        } 
    } 
    #获取远程命令执行结果 
    catch wait result 
    exit [lindex \$result 3] 
 
EOF 
    #获取远程执行命令返回值 
    sshRet=$? 
    Log "=================远程命令执行日志信息如下=================" 
    cat ${log_file}|tee -a ${logFile} 
    echo "" 
 
    cat ${log_file} | grep -iE "denied|No such file or directory|No route to host" >/dev/null 
     
    if [ $? -eq 0 -o $sshRet -ne 0 ];then 
        Log "[Error] 脚本执行失败, 请检查!" 
        Log "[Error] 日志文件: [${logFile}]" 
        exit 1 
    fi 
     
    Log "远程执行命令返回值为[$sshRet]" 
    Log "[Info] 脚本执行成功." 
} 
 
Log "[Info] 开始执行脚本:" 
Log "[Info] serverIp : ${serverIp}" 
Log "[Info] sshUser  : ${sshUser}" 
Log "[Info] sshPass  : ${sshPass}" 
Log "[Info] cmd      : ${sshCmd}" 
echo "请等待远程命令运行完成" 
 
execute_ssh_cmd "$@" 

结语

如有需要请拿走,若转载请追加本文链接哦!

能学一点是一点,至少不是0!

Over!


标签:linux
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

搜索
排行榜
关注我们

一个IT知识分享的公众号