goto让服务器登录不再是烦恼

本文介绍了一种通过简单脚本实现服务器快速登录的方法,解决了维护过程中常见的密码、端口及账号等问题,提高了网络不稳定情况下的工作效率。
部署运行你感兴趣的模型镜像

场景

当我们维护一些服务器的时候,经常会面临密码呀端口账号呀啥的问题,使得维护时麻烦不小,再加上有时候网络不稳定,SA的脾气就更大了。

解决方案

简单的几个脚本

goto > 用户交互入口

denglu > 采用goto传过来的参数,使用expect命令进行模拟登陆

list > 服务器密码资源列表

goto

#!/usr/bin/env python
#coding: utf8

import os,sys,re
import subprocess
import datetime

host = sys.argv[1]

if host == "list":
    print "进入"
    for line in open("./list"):
        result = re.findall("(\S+)",line)
    #print len(result)
        if len(result) >=5:
        print "%s %s"%(result[0],result[5])
    sys.exit()

matchedline = []
for line in open("/Users/jacky/bin/list"):
    result = re.findall(host,line)
    if len(result) == 1:
        matchedline.append(line)

if len(matchedline) == 1:
    secretline=matchedline[0]
    print "Found the machted line."
    value = re.findall("\S+",secretline)
    if len(value) >= 5:
        print "... Mached Line Found!!!"
    #    print value
    else:
        print "Please check your config file list."
        exit(1)
    #print value
    host = value[0]
    passwd = value[1]
    port = value[2]
    user = value[3]
    prompt = value[4]
    if len(value) >= 6:
        description = value[5]
    #print host
    #print passwd
    #print port
    #print user
    print "Welcome Login --> %s"%(description)
    #os.system("/Users/jacky/bin/denglu2 %s \'%s\' %s %s \"%s\""%(host, passwd,port,user,prompt))
    os.system("/Users/jacky/bin/denglu2 %s \'%s\' %s %s \"%s\""%(host, passwd,port,user,prompt))
else:
    print "No Not Find Matched. Exit............."

denglu2

#!/usr/bin/expect -f 

log_file /tmp/1.txt

# This is very important.
set HOST [lindex $argv 0]
set serverpassword [lindex $argv 1]
set port [lindex $argv 2]
set user [lindex $argv 3]
set prompt [lindex $argv 4]
set timeout 2

#send_user "$serverpassword"
#exit

# connect via ssh
spawn ssh -o StrictHostKeyChecking=no $user@$HOST -p $port

#######################
expect {
    -re "yes/no.*" {
        exp_send "yes\r"
        exp_continue
    }
}

expect {
    -re "password:.*" {
        exp_send "$serverpassword"
        exp_send "\r"
    }
    -re "$prompt.*" {
        interact
    exit
    }
    -re "password:.*" {
        exp_send "$serverpassword"
        exp_send "\r"
    }
}

expect {
    -re "$prompt.*" {
    interact
    exit
    }
}

list

格式如下

IP地址    密码  端口  账户  (>或者$或#提示符) 描述

使用

goto 唯一定位到条目(地址呀 描述呀 账号呀啥的)

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>我们正在讨论goto语句。用户引用了三段内容,主要涉及goto的使用场景、作用域规则以及其与return的区别。 用户问题:想了解goto的含义,包括定义和作用。 结合引用: 引用[1]:说明在某些情况下(如资源清理),使用goto可以避免代码重复和遗漏。 引用[2]:详细说明了goto的作用域规则,包括合法和非法使用的情况。 引用[3]:提到了return与goto的区别,return用于函数返回,而goto是跳转语句。 因此,回答需要涵盖: 1. goto的定义(跳转语句,用于程序内的无条件跳转) 2. goto的作用(集中处理错误、跳出深层嵌套等) 3. goto的作用域规则(引用[2]中提到的核心规则) 4. 与return的区别(引用[3]) 同时,我们之前的对话历史中,用户问的是按位计算,但当前问题转向了goto语句,因此无需结合之前的按位计算。 回答结构: 一、goto的定义 二、goto的作用 三、使用规则(作用域限制) 四、与return的对比 五、典型应用场景(结合引用中的例子) 六、使用注意事项(潜在风险) 最后生成相关问题。 </think> ### goto 语句的定义与作用详解[^2][^3] #### 一、goto 的定义 **goto** 是编程语言中的流程控制关键字,用于实现代码的*无条件跳转*。其核心机制是: 1. **定义标签**:在目标位置放置自定义标识符(如`EXIT:`),末尾需加冒号。 2. **执行跳转**:通过`goto 标签名`使程序立即跳转到标签处继续执行。 ```c void process_data() { // ... 代码逻辑 if (error) goto CLEANUP; // 无条件跳转 // ... 正常流程 CLEANUP: // 标签定义 release_resources(); } ``` #### 二、goto 的核心作用 1. **错误集中处理** 解决多层嵌套中资源释放问题[^1]: ```c int complex_operation() { FILE *f1 = fopen("a.txt", "r"); if (!f1) goto ERROR; int *buf = malloc(1024); if (!buf) goto CLEAN_F1; // 直接跳转到指定清理步骤 // ... 正常逻辑 return 0; CLEAN_F1: fclose(f1); ERROR: log("失败"); // 所有错误集中处理 return -1; } ``` ✅避免每个判定点重复资源释放代码[^1] ✅降低遗漏清理的风险(尤其含多个资源时) 2. **快速退出深层嵌套** 替代多层`break`跳出循环或条件分支: ```c for (int i=0; i<10; i++) { while (...) { if (critical_error) goto BREAK_ALL; // 直接跳出所有嵌套 } } BREAK_ALL: handle_error(); ``` 3. **状态机实现** 配合`switch`简化有限状态机逻辑: ```c STATE_MACHINE: switch (state) { case A: ... goto STATE_B; case B: ... goto STATE_A; } ``` #### 三、作用域规则(关键限制)[^2] | **规则类型** | **合法示例** | **非法示例** | |-----------------------|---------------------------------------|-------------------------------------| | **仅限同函数内跳转** | `void foo(){ goto LABEL; ... LABEL: }` | `goto other_func_label;`(跨函数) | | **禁止跨初始化跳转** | `int x; goto OK; x=1; OK:` | `goto SKIP; int y=3; SKIP: ... y++;` | | **禁入内层作用域** | `{ ... goto OUT; } OUT:` | `goto INNER; { INNER: ... }` | | **标签需后向跳转** | `goto END; ... END:`(推荐向后跳) | `START: ... goto START;`(向前循环) | ▸ **Qt 示例中的非法案例**(引文[^2]): ```c++ void demo() { QFile file("test.txt"); goto OPEN; // 错误!跳过 file.open() 初始化 file.open(QIODevice::ReadOnly); OPEN: file.readAll(); // file 未初始化! } ``` #### 四、与 return 的对比[^3] | | **goto** | **return** | |----------|----------------------------------------|------------------------------------| | **层级** | 函数内跳转 | 结束整个函数 | | **用途** | 局部流程重整 | 返回结果并终止执行 | | **定位** | 可跳转到函数内任意标签 | 只能回到调用点 | | **示例** | `goto CLEAN;` | `return -1;` | | **目标** | 系统终端不感知跳转[^3] | 返回值透传到终端(Linux: `$?`)[^3] | #### 五、适用场景建议 1. **资源清理**:多阶段初始化失败时统一释放(文件/内存/句柄)[^1] 3. **致命错误处理**:日志记录后终止流程 4. **性能关键路径**:内核/驱动开发中的优化跳转 > **风险提示**:goto 会破坏结构化编程,仅在替代方案(如函数封装、RAII)不可行时使用,避免向前跳转和逻辑缠绕[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值