转载请注明出处,本文地址:http://blog.imbugs.com/index.php/archives/99/

SSSH简介

SSSH (Super SSH)是我自家写的一个SSH自动登录工具,可在Shell中实现类似SecureCRT保存密码后自动登录的功能。
SSSH 通过expect来代替人工进行I/O交互,程序根据提示自动填入已保存的密码并登录远程机器。

整个程序共三个文件,代码如下:

1. super-ssh.sh ,实现密码管理功能,此脚本为需要执行的程序,此文件中需要编辑设置SSSH_HOME的值

[code lang="shell"]
#!/bin/bash

GET_CHAR()
{
SAVEDSTTY=`stty -g`
stty -echo
stty raw
dd if=/dev/tty bs=1 count=1 2> /dev/null
stty -raw
stty echo
stty $SAVEDSTTY
}

SSSH_HOME=/home/admin/sssh
if [ -z $1 ];then
echo -n "请输入要登陆的机器IP/域名: "
read target
else
target=$1
fi
target=".*$target.* .*"
AUTHFILE=$SSSH_HOME/ssh-passwd.conf
count=`grep "$target" $AUTHFILE -c`
targetfullname=`grep "$target" $AUTHFILE | awk '{print $1}'`
passwd=`grep "$target" $AUTHFILE | awk '{print $2}' | awk -F ':' '{print $2}'`
user=`grep "$target" $AUTHFILE | awk '{print $2}' | awk -F ':' '{print $1}'`
encoding=`grep "$target" $AUTHFILE | awk '{print $3}'`
if [ $count -gt 1 ];then
echo -e '查找到以下主机 (\033[0;31msit\033[0m)'
arrtarget=($targetfullname)
arruser=($user)
arrpasswd=($passwd)
arrencoding=($encoding)
length=${#arrtarget[@]}
for ((i=0; i<$length; i++))
do
echo -e '[\033[4;34m'$(($i+1))'\033[0m]' ${arruser[$i]}@${arrtarget[$i]}
done
echo -n "选择序号:"
choice=`GET_CHAR`
echo ""
targetfullname=${arrtarget[$(($choice-1))]}
passwd=${arrpasswd[$(($choice-1))]}
user=${arruser[$(($choice-1))]}
encoding=${arrencoding[$(($choice-1))]}
fi

if [ -z $targetfullname ] || [ -z $passwd ] || [ -z $user ];then
echo "配置文件中没有查找到匹配的信息";
exit 1;
fi
if [ -z $encoding ];then
encoding=GB18030
fi
target=$targetfullname
$SSSH_HOME/ssh-expect.sh $user $target $passwd $encoding
[/code]

2. ssh-expect.sh,实现自动登录功能

[code lang="shell"]
#!/usr/bin/expect
set USER [lindex $argv 0]
set TARGET [lindex $argv 1]
set PASSWD [lindex $argv 2]
set ENCODING [lindex $argv 3]
trap {
set rows [stty rows]
set cols [stty columns]
stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH

spawn luit -encoding $ENCODING ssh -l $USER $TARGET

expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send "$PASSWD\r" }
}
interact
[/code]

3. ssh-passwd.conf ,用于记录密码,格式为:IP USER:PASSWORD ENCODING

[code]
127.0.0.1 user:password
imbugs.com user:password UTF-8
[/code]

使用方法:

1. 将以上三个文件放在同一个文件夹下,例如:/home/admin/sssh
2. 执行命令
[code]
cd /home/admin/sssh
chmod +x *.sh
[/code]
3. 编辑super-ssh.sh找到SSSH_HOME=/home/admin/sssh,将/home/admin/sssh替换为你机器上super-ssh.sh所在的目录
4. 编辑ssh-passwd.conf,添加连接信息
5. 如果机器上没有安装expect,需要先安装
Debian/Ubuntu 执行命令
[code]
sudo apt-get install expect
[/code]
CentOS 执行命令
[code]
yum install expect
[/code]
6. 执行 ./super-ssh xxxx 就可以登录到目标机器了,xxxx为ssh-passwd.conf中配置的IP或域名的一部分,例如:./super-ssh 127会匹配到127.0.0.1,./super-ssh bugs会匹配到imbugs.com
7. 可以将super-ssh做为系统的一个命令,执行如下代码:
[code]
sudo ln -s /home/admin/sssh/super-ssh.sh /usr/bin/sssh
[/code]
从此以后,只要执行 sssh imb 就会自动登录到imbugs.com机器上了。

附件:super-ssh.tar

标签: none

已有 3 条评论

  1. wesleysun wesleysun

    luit -encoding $ENCODING
    请问一下,这个是什么意思?

  2. @wesleysun
    这是为了处理编码问题,像Ubuntu等发行版默认编码是UTF-8,而服务器上面编码广泛使用GBK,使用此命令可以解决直接SSH的乱码问题

  3. ran ran

    先赞一个,但有一个问题相问下 ,定义的函数GET_CHAR()
    有什么特殊的作用吗?

添加新评论