IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

shell实现ssh自动登录

三江小渡 2016-03-21 22:57:30 累计浏览 1,611 次
本机暂存

mac下没有找到好用的类似secureCRT,就自己写了个自动登录的脚本,分享一下,如果是新浪的,就基本不用修改代码就直接能用。(其实是想表示虽然那么久没更新,但博主还活着~)

文件名:ssh_auto_login

#!/usr/bin/expect
##
#   ssh模拟登陆器
#
#   @author zhiyuan <hzyhouzhiyuan艾特gmail.com>
##
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 10
  
while 1 {
    spawn ssh -p $port $user@$ip 
    #如果最后的字符匹配则执行命令\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
}
#无法匹配$,还不知道怎么解决
#expect -re "*\$" { puts "test123"; send "source /etc/profile\r" }
#expect "*\$" { send "cd ~\r" }
send_user "login success!"
interact

上边是ssh的自动登录,可以配合下边的shell使用,很方便。

文件名:xxx_launcher

#!/bin/sh
##
#   服务器登陆器
#
#   @author zhiyuan <hzyhouzhiyuan@gmail.com>
##
channel_user="user_namexxx"
channel_passwd="xxxx"
#内网通道机
internal_ip1=xxx.xxx.xxx.xxx
#联通
unicom_ip1=xxx.xxx.xxx.xxx
#电信
telecom_ip1=xxx.xxx.xxx.xxx
case "$1" in
    ci)
        expect ssh_auto_login $channel_user $channel_passwd $internal_ip3 22 
        ;;
    cl)
        expect ssh_auto_login $channel_user $channel_passwd $unicom_ip1 22
        ;;
    cd)
        expect ssh_auto_login $channel_user $channel_passwd $telecom_ip1 22
        ;;
    149)
        expect ssh_auto_login channel_user channel_passwd xxx.xx.xxx.xxx 22 
        ;;
    49)
        expect ssh_auto_login $channel_user $channel_passwd $unicom_ip1 22 需要通道机跳转的ipxxx.xxx.xx
        ;;
    *)
        echo "帮助信息:"
        echo "\tthere is not a server named [$1]"
        echo "\t服务器149:\t149"
        echo "\t服务器49:\t49"
        ;;
esac

此时登陆某个服务器的时候就直接 用上述shell带要登录的服务器参数即可,如: ./xxx_launcher 49


同分类推荐文章

  1. 从零重建 macOS 开发机:可复现的环境初始化流程 (2026-06-14 20:36:00)
  2. 百度物理网络监控工具开源第二弹:毫秒级监控工具 baize,让你的网络问题无处遁形 (2026-06-11 08:10:28)
  3. How to Set Up Homebrew Tap for Private CLI Tools: A Complete Guide (2026-05-27 02:13:03)

查看更多 DevOps 文章 →

建议继续学习

  1. Bash的模式和配置文件加载 (累计阅读 24,409)
  2. 28个Unix/Linux的命令行神器 (累计阅读 16,791)
  3. 我常用的主机监控shell脚本 (累计阅读 13,430)
  4. 高效Linux用户需要了解的命令行技能 (累计阅读 12,825)
  5. 100个常用的linux命令 (累计阅读 11,607)
  6. Linux命令行里的“瑞士军刀” (累计阅读 11,584)
  7. linux 建立两台机器的信任关系 (累计阅读 11,484)
  8. 每个程序员都应该知道的8个Linux命令 (累计阅读 10,745)
  9. 最受欢迎的10个 Linux 单行命令 (累计阅读 10,131)
  10. linux下搜索find命令详解 (累计阅读 9,459)